一、MHA部署
##环境准备
角色IPserver-id功能
MHA-Node(Master)
172.16.1.5
100
数据节点
MHA-Node(Slave1)
172.16.1.6
200
数据节点
MHA-Node(Slave2)和MHA-Manager
172.16.1.7
300
数据节点
1, 所有服务器配置yum源
在centos7安装后的默认源基础上,再加上拷贝mha的源(假设拷贝到/root/mha-yum/)
# vim /etc/yum.repos.d/mha.repo
[mha]
name=mha soft
baseurl=file:///root/mha/mha-yum
enabled=1
gpgcheck=0
2, 所有服务器安装依赖包
注意:所有服务器均需要安装
yum install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Time-HiRes \
perl-Mail-Sender \
perl-Mail-Sendmail \
perl-MIME-Base32 \
perl-MIME-Charset \
perl-MIME-EncWords \
perl-Params-Classify \
perl-Params-Validate.x86_64 \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
net-tools -y
主从复制已经搭建好,需要在每台机子配置文件里添加:
log-slave-updates=1
[mysqld]
log-slave-updates=1 #参数意思是把中继日志里的操作同步到二进制日志里
二、创建mha监控用户
在master,slave1,slave2三台mysql服务器上创建mha监控用户, 需要对管理节点授权(==授权时IP为管理节点IP==)
mysql> grant all on *.* to mha@'172.16.1.7' identified by 'jsUFeS6sjfJ76TGG';
mysql> flush privileges;
mysql> select user,host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| slave | % |
| mha | 127.16.1.7 |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
MHA软件安装,用slave2作管理节点
在所有节点安装 ==mha-node== 软件包,在 ==mha管理节点==上再安装 mha-manager 软件包
[root@master ~]# rpm -ivh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm
[root@slave1 ~]# rpm -ivh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm
[root@slave2 ~]# rpm -ivh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm
[root@slave2 ~]# rpm -ivh /root/mha/mha4mysql-manager-0.57-0.el7.noarch.rpm
配置ssh互信
1,所有服务器上都使用root产生空密码密钥对
[root@master ~]# ssh-keygen -P "" -f /root/.ssh/id_rsa
[root@slave1 ~]# ssh-keygen -P "" -f /root/.ssh/id_rsa
[root@slave2 ~]# ssh-keygen -P "" -f /root/.ssh/id_rsa
2, 将master,slave1,slave2上产生的公钥拷给mgr管理节点上对应的路径
[root@master ~]# ssh-copy-id root@172.16.1.7
[root@slave1 ~]# ssh-copy-id root@172.16.1.7
[root@slave2 ~]# ssh-copy-id root@172.16.1.7
3, 在slave2管理节点将所有的公钥(包括自己的)都追加到同一个authorized_keys文件里
[root@slave2 ~]# cd /root/.ssh/
[root@slave2.ssh]# cat authorized_keys #所有公钥都在authorized_keys文件中了
4,在mgr管理节点上将authorized_keys文件分发给master,slave1,slave2上
[root@slave2.ssh]# for i in 5 6; do scp /root/.ssh/authorized_keys 172.16.1.$i:/root/.ssh/; done
5, 自行验证是否互相ssh不需要密码了(如果这里不验证,后面会有命令验证)
挂载VIP
在master上虚拟出VIP,(VIP为前面程序访问mysql的IP,随着master切换)
[root@master ~]# ifconfig bond0:0 172.16.1.243/24
创建mha相关配置文件
创建 mha 相关的工作目录
[root@slave2 ~]# mkdir /etc/mha/
[root@slave2 ~]# mkdir -p /data/mha/app1
创建mha局部配置文件
[root@slave2 ~]# vim /etc/mha/app1.conf
[server default]
# 设置监控用户和密码
user=mha
password=jsUFeS6sjfJ76TGG
# 设置复制环境中的复制用户和密码
repl_user=root
repl_password=jsUFeS6sjfJ76TGG
# 设置ssh的登录用户名
ssh_user=root
# 设置监控主库,发送ping包的时间间隔,默认是 3 秒,尝试三次没有回应的时候自动进行failover
ping_interval=3
# 设置mgr的工作目录
manager_workdir=/data/mha/app1
# 设置mysql master 保存 binlog 的目录,以便 MHA 可以找到 master 的二进制日志
master_binlog_dir=/mysql/lib/mysql
# 设置 master 的 pid 文件
master_pid_file=/var/run/mysqld/mysqld.pid
# 设置 mysql master 在发生切换时保存 binlog 的目录(在mysql master上创建这个目录)
remote_workdir=/mysql/data
# 设置 mgr 日志文件
manager_log=/data/mha/app1/app1-3306.log
# MHA 到 master 的监控之间出现问题,MHA Manager 将会尝试从slave2登录到master上
secondary_check_script=/usr/bin/masterha_secondary_check -s 172.16.1.6 --user=root --port=22 --master_host=172.26.1.5 --master_port=3306
# 设置自动 failover 时候的切换脚本,172.16.1.243为VIP,0为VIP产生在网卡上的子接口
master_ip_failover_script="/etc/mha/master_ip_failover.sh 172.16.1.243 0"
[server1]
hostname=172.16.1.5
port=3306
candidate_master=1
[server2]
hostname=172.16.1.6
port=3306
candidate_master=1
[server3]
hostname=172.16.1.7
port=3306
no_master=1
上传相关脚本并改权限
[root@slave2 ~]# ls /etc/mha/
app1.conf master_ip_failover.sh
[root@slave2 ~]# chmod +x /etc/mha/master_ip_failover.sh
检查ssh互信和集群状态
检查ssh互信
[root@slave2 ~]# masterha_check_ssh --conf=/etc/mha/app1.conf
......
- [info] All SSH connection tests passed successfully.
检查集群状态
[root@slave2 ~]# masterha_check_repl --conf=/etc/mha/app1.conf
......
MySQL Replication Health is OK.
启动MHA-Mgr状态监控
先检查状态, 为NOT_RUNNING状态
[root@slave2 ~]# masterha_check_status --conf=/etc/mha/app1.conf
app1 is stopped(2:NOT_RUNNING).
开启MHA Manager监控
[root@slave2 ~]# nohup masterha_manager --conf=/etc/mha/app1.conf --ignore_last_failover &
说明:
此监控命令需要放在后台执行,而且关闭终端后进程会关闭,所以需要nohup命令挂起
因为MHA不允许多次failover切换的间隔时间太短,所以需要加--ignore_last_failover参数实现多次切换验证
再次查看监控状态,为running状态
[root@slave2 ~]# masterha_check_status --conf=/etc/mha/app1.conf
app1 (pid:10121) is running(0:PING_OK), master:172.16.1.7
PS: 手动停止监控命令:masterha_stop --conf=/etc/mha/app1.conf
三、自动Failover测试
在MHA管理节点上先监控日志变化
[root@slave2 ~]# tail -f /data/mha/app1/app1-3306.log
##模拟故障
在master上关闭服务(或者关闭机器)
[root@master ~]# systemctl stop mysqld
查看切换过程
[root@slave2 ~]# tail -f /data/mha/app1/app1-3306.log
####
四、后续讨论
切换成功后, 原来的slave1变为新的master,原来的master要变为slave1,也就是两个人要==互换角色==了
但是MHA只把原来的slave1变为新的master,而原来的master要变为slave1则需要现在手动再做
1, 启动原master(新slave1)的mysql服务(前面模拟故障把它停掉了),并配置为新的slave1
[root@slave2 ~]# systemctl start mysqld
[root@slave2 ~]# mysql -p123456
下面是连接原slave1(新master)
mysql> change master to master_host='172.16.1.6', master_user='root',master_password='jsUFeS6sjfJ76TGG',master_port=3306, master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
3, 重新开启MHA
[root@slave2 ~]# masterha_check_repl --conf=/etc/mha/app1.conf
......
......
MySQL Replication Health is OK.
[root@slave2 ~]# masterha_check_status --conf=/etc/mha/app1.conf
app1 is stopped(2:NOT_RUNNING).
[root@slave2 ~]# nohup masterha_manager --conf=/etc/mha/app1.conf --ignore_last_failover &
[root@slave2 ~]# masterha_check_status --conf=/etc/mha/app1.conf
app1 (pid:12608) is running(0:PING_OK), master:172.16.1.6
5, 测试验证