本文基于GTID的主从复制,进行简单的MHA构建,意在以最为直观和基础的方式解读MHA,并完成相应的功能。
# 一主两从
# 0.首先确保三台虚拟机的mysql均为正常启动(此处以db01为例)
[root@db01 ~]# netstat -lntup (这里是为了通过查看3306端口确保三台数据库均为启动状态)
# 1.配置各自文件(这里放的是GTID版以及MHA所需的文件内容)
[root@db01 ~]# vim /etc/my.cnf(数据库主配置文件)
[root@db02 ~]# vim /etc/my.cnf
[root@db03 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates
relay_log_purge=0
read_only=1
skip-name-resolve
# 这里不同库需要配置不同server_id,从库的可以一致,但是做MHA时,某台从库可能变成新的主库,这时候就需要不一致。
# log_bin这个是开启binlog日志的配置
# gtid_mode这个是开启gtid的
# enforce_gtid_consistency 这个是保持一致性的
# log-slave-updates 让从库在写relay_log的同时保存一份binlog
# relay_log_purge 删除relaylog的
# read_only只读
# skip-name-resolve 跳过反向解析
#准确的说,如果你想配置gtid主从复制,需要进入数据库查看gtid状态,这一步在配置文件时就要做。
mysql> show variables like '%gtid%';
# 2.配置完文件,重启数据库
[root@db01 ~]# systemctl restart mysqld
# 3.登录主库数据库,授权一个用户(不创建,咋对接啊)
mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123';
-----------------------------------------------------番外-----------------------------------------------------------
# 3.5对于通常情况,这里可能需要导出主库的数据,并且通过远程scp发送给从库,从库需要导入同步数据。数据一致后,再配置从库
#完整的备份命令:
mysqldump -uroot -p123 -A -R --triggers --master-data=2 –-single-transaction > /tmp/full.sql
这里稍微介绍下备份数据库数据的基本参数
连接服务端参数(基本参数):-u -p -h -P -S
-A, --all-databases:全库备份
-B:指定库备份
-F:flush logs在备份时自动刷新binlog(不怎么常用)
--master-data=2:备份时加入change master语句0没有1不注释2注释
1)等于2:记录binlog信息,并注释(日常备份)
2)等于1:记录binlog信息,不注释(扩展从库)
0)等于0:不记录binlog信息
--single-transaction:快照备份
-d:仅表结构
-t:仅数据
-R, --routines:备份存储过程和函数数据
--triggers:备份触发器数据
gzip 压缩备份
#备份成压缩包
[root@db01 ~]# mysqldump -uroot -p123 -A | gzip > /backup/full.sql.gz
#恢复压缩包中的数据
[root@db03 ~]# zcat /tmp/full.sql.gz | mysql -uroot -p123
# 远程传输sql
[root@db01 ~]# scp /tmp/full.sql 172.16.1.52:/tmp/
[root@db01 ~]# scp /tmp/full.sql 172.16.1.53:/tmp/
# 验证主库用户
[root@db02 ~]# mysql -urep -p -h172.16.1.51
# 导入数据
mysql -u root -p < /tmp/full/sql
-----------------------------------------------------番外----------------------------------------------------------
# 4.登录从库的数据库,配置从库(这个是GTID版)
mysql> change master to
-> master_host='172.16.1.51',
-> master_user='rep',
-> master_password='123',
-> master_auto_position=1; # GTID位置点
# 日常普通版的 (普通的需要指定binlog日志)
mysql> change master to
-> master_host='172.16.1.51',
-> master_user='rep',
-> master_password='123',
-> master_log_file='mysql-bin.000001', # 指定binlog日志
-> master_log_pos=327; # 指定位置点(可通过show master status;查看)
# 5.配置完从库,开启线程
mysql> start slave;
# 6.查看主从状态(确保IO和SQL线程都为YES,这一步成功了,才说明主从复制搭建成功)
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
# 1.三台数据库均安装
[root@db01 ~]# yum install perl-DBD-MySQL -y
[root@db02 ~]# yum install perl-DBD-MySQL -y
[root@db03 ~]# yum install perl-DBD-MySQL -y
# 2.manager单独安装自己的依赖(这里以db03为例)
[root@db03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
# 3.部署node节点
[root@db01 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
# 4. 部署manager节点
[root@db03 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm
1.2.2.配置MHA所需文件(db03作为manager,需要做一些相应的配置)
#创建MHA配置目录
[root@db03 ~]# mkdir -p /service/mha
#配置MHA
[root@db03 ~]# vim /service/mha/app1.cnf
[server default]
#指定日志存放路径
manager_log=/service/mha/gcy
#指定工作目录
manager_workdir=/service/mha/app1
#binlog存放目录
master_binlog_dir=/usr/local/mysql/data
#MHA管理用户
user=mha
#MHA管理用户的密码
password=mha
#检测时间
ping_interval=2
#主从用户
repl_user=rep
#主从用户的密码
repl_password=123
#ssh免密用户
ssh_user=root
[server1]
hostname=172.16.1.51
port=3306
[server2]
#candidate_master=1
#check_repl_delay=0
hostname=172.16.1.52
port=3306
[server3]
hostname=172.16.1.53
port=3306
# 下面这条命令的作用是将所在server_id的数据库设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave。
candidate_master=1
# 下面这条命令的作用是默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0
#主库执行即可
mysql> grant all on *.* to mha@'172.16.1.%' identified by 'mha';
1.2.4.SSH免密(4条命令,三台机器,每条命令均执行3次,确保三台机器互通)
# 以下命令每台机器都执行,必须到位
#创建秘钥对
[root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
#发送公钥,包括自己
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.51
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.52
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.53
1.2.5.检查状态
#检测主从
[root@db03 ~]# masterha_check_repl --conf=/service/mha/app1.cnf
MySQL Replication Health is OK.
# 检查主从常见问题解析:
主从复制,配置从库信息必须与主库信息一致
rep用户三个库都得有
取消反向解析
主库创建mha用户
#检测ssh
[root@db03 ~]# masterha_check_ssh --conf=/service/mha/app1.cnf
Mon Jul 27 11:40:06 2020 - [info] All SSH connection tests passed successfully.
# 检测ssh报错问题解析:
三台机器都要创建密钥对,四条命令12次,每条命令依次来,不会出现少推送的问题。
# 启动
[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &
命令所含参数含义:
nohup ... & #后台启动
masterha_manager #启动命令
--conf=/service/mha/app1.cnf #指定配置文件
--remove_dead_master_conf #移除挂掉的主库配置
--ignore_last_failover #忽略最后一次切换
< /dev/null > /service/mha/manager.log 2>&1
# MHA保护机制:
1.MHA主库切换后,8小时内禁止再次切换
2.切换后会生成一个锁文件,下一次启动MHA需要检测该文件是否存在
# 停掉主库
[root@db01 ~]# systemctl stop mysqld.service
# 查看MHA的日志
[root@db03 ~]# tail -f /service/mha/manager
# 登录数据库查看状态
[root@db03 ~]# mysql -u root -p (登录)
Enter password:
mysql> show slave status \G(查看主从状态)
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.52
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 1243
Relay_Log_File: db03-relay-bin.000004
Relay_Log_Pos: 750
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#将恢复的数据库当成新的从库加入集群
#找到binlog位置点
[root@db03 ~]# grep 'CHANGE MASTER' /service/mha/gcy | awk -F: 'NR==1 {print $4}'
CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='xxx';
#恢复的数据库执行change master to
mysql> CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123';
mysql> start slave;
#将恢复的数据库配置到MHA配置文件
[root@db03 ~]# vim /service/mha/app1.cnf
......
[server1]
hostname=172.16.1.51
port=3306
[server2]
hostname=172.16.1.52
port=3306
[server3]
hostname=172.16.1.53
port=3306
......
#启动MHA
[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &
nohup ... & #后台启动
masterha_manager #启动命令
--conf=/service/mha/app1.cnf #指定配置文件
--remove_dead_master_conf #移除挂掉的主库配置
--ignore_last_failover #忽略最后一次切换
< /dev/null > /service/mha/manager.log 2>&1
#MHA保护机制:
1.MHA主库切换后,8小时内禁止再次切换
2.切换后会生成一个锁文件,下一次启动MHA需要检测该文件是否存在