MHA+ProxySQL,mysql的高可用集群+读写分离(二)MHA搭建与VIP策略
一 MHA介绍
MHA是一个日本人yoshinorim创建的高可用架构,其实主要就是基于主从复制的一段perl程序,一个shell脚本。
二 安装
2.1 下载MHA
1、安装perl环境
sudo yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN*
2、下载mha
本次使用版本为v0.58。
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
wget下载:
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
0.58的更新内容:
几个错误修正
IPV6支持
super_read_only 支持
force_storage_engine 支持
2.2 安装MHA-node
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
perl Makefile.PL
make && make install
所有节点都执行
2.3 安装MHA-manager
只有主库需要安装
tar -zxvf mha4mysql-node-0.58.tar.gz
tar -zxvf mha4mysql-manager-0.58.tar.gz
perl Makefile.PL
make && make install
manager安装完成后,使用MHA脚本进行SSH检测
### 检测ssh
/usr/local/bin/masterha_check_ssh --conf=/etc/mha/mha.conf
[root@iZm5eh3yfwvy52yb78f6obZ scripts]# /usr/local/bin/masterha_check_ssh --conf=/etc/mha/mha.conf
……
……
……
Tue Mar 31 17:18:44 2020 - [info] All SSH connection tests passed successfully.
使用MHA脚本进行主从检测
# 检测主从
/usr/local/bin/masterha_check_repl --conf=/etc/mha/mha.conf
# 检测主从结果
[root@iZm5eh3yfwvy52yb78f6obZ scripts]# /usr/local/bin/masterha_check_repl --conf=/etc/mha/mha.conf
……
……
……
MySQL Replication Health is OK.
2.4 启动mha
管理节点:
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
# 查看mha是否启动成功
masterha_check_status --conf=/etc/mha/mha.conf
[root@iZm5eh3yfwvy52yb78f6obZ ~]# nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
[1] 28153
[root@iZm5eh3yfwvy52yb78f6obZ ~]# masterha_check_status --conf=/etc/mha/mha.conf
mha (pid:28153) is running(0:PING_OK), master:172.31.145.39
三、故障转移测试
3.1 故障转移
在主库上停掉mysql
systemctl stop mysqld
查看日志,成功转移
tail -fn100 /usr/local/mha/manager.log
Master failover to 172.31.145.38(172.31.145.38:3306) completed successfully.
在从库2节点上,进入mysql
show slave status \G;
可以看到Master节点已变成从库1
……
Master_Host: 172.31.145.38
……
3.2 重新加入集群
如果node1节点故障已排除,重新添加入集群,这个节点只能作为从库了
systemctl start mysqld
mysql -u root -PZw@369012
# 注意大写
CHANGE MASTER TO MASTER_HOST='172.31.145.38',MASTER_USER='repl',MASTER_PASSWORD='replZw@1987',MASTER_AUTO_POSITION=1;
start slave;
show slave status \G;
四、添加VIP与自动转移
4.1、添加虚拟ip
ip addr add 10.0.0.55 dev eth0
# 查看ip
ip addr show
如果设置错了,可以删除
# 删除ip
ip addr del 10.0.0.55 dev eth0
# 查看ip
ip -o -f inet addr show
使用failover脚本中的方式,在管理节点上,用ssh的方式给主节点添加vip,测试下
ssh root@172.31.145.38 /usr/sbin/ip addr add 172.31.145.200 brd 172.31.159.255 dev eth0 label eth0:0;/usr/sbin/arping -q -A -c 1 -I eth0 172.31.145.200;iptables -F;
4.2 添加自动转移vip脚本
master_ip_failover_script=/usr/local/scripts/master_ip_failover
master_ip_online_change_script=/usr/local/scripts/master_ip_online_change
编辑脚本内容,将manager解压包中的sample文件下的scripts脚本搬运过来,然后编辑,添加vip内容。
cd /home/mysql/MHA/mha4mysql-manager-0.58/samples/scripts
cp master_ip_failover /usr/local/scripts
cp master_ip_online_change /usr/local/scripts
vim /usr/local/scripts/master_ipfailover
添加如下内容:
# 在my函数前声明
my $vip = '10.0.0.66/24';
my $key = '2';
…………
# 在sub main 函数下添加内容
sub drop_vip {
my $output = `ssh -o ConnectTimeout=15 -o ConnectionAttempts=3 $orig_master_host /sbin/ip addr del $vip/32 dev $key`;
}
sub add_vip {
my $output = `ssh -o ConnectTimeout=15 -o ConnectionAttempts=3 $new_master_host /sbin/ip addr add $vip/32 dev $key`;
}
另一种ssh的方式,报错了:
# 在my函数前声明
my $vip = '10.0.0.66/24';
my $key = '2';
my $ssh_start_vip = "/sbin/ifconfig eno16777736:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eno16777736:$key down";
# 在sub main 函数下添加内容
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
4.3 切换测试
# 查看mha是否启动成功
masterha_check_status --conf=/etc/mha/mha.conf
# 当前状态是NOT_RUNNING
mha is stopped(2:NOT_RUNNING).
# 启动MHA
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
[1] 2988
# 启动后再次查看
masterha_check_status --conf=/etc/mha/mha.conf
# master当前是172.31.145.39
mha (pid:2988) is running(0:PING_OK), master:172.31.145.39
node1上停掉master测试,看master、vip是否都自动转移到172.31.145.38上:
# 在master机器172.31.145.39上停掉mysql
systemctl stop mysql
管理节点查看mha日志
……
……
……
Failed to activate master IP address for 172.31.145.38(172.31.145.38:3306) with return code 10:0
172.31.145.40(172.31.145.40:3306): OK: Slave started, replicating from 172.31.145.38(172.31.145.38:3306)
172.31.145.38(172.31.145.38:3306): Resetting slave info succeeded.
Master failover to 172.31.145.38(172.31.145.38:3306) completed successfully.
转移master成功,但是在node2机器上,ip addr show 看了下,vip并没有转移成功。
4.4 failover总结
1).配置文件检查阶段,这个阶段会检查整个集群配置文件
2).宕机的master处理,这个阶段包括虚拟ip摘除操作,主机关机操作
3).复制dead master和最新slave相差的relay log,并保存到MHA Manger具体的目录下
4).识别含有最新更新的slave
5).应用从master保存的二进制日志事件(binlog events)
6).提升一个slave为新的master进行复制
7).使其他的slave连接新的master进行复制
4.5 failover报错
遇到启动mha、切换vip等失败错误,第一时间需要查看日志
tail -fn100 /usr/local/mha/manager.log
错误1:
Failover error flag file /usr/local/mha/mha.failover.error exis
删除 /usr/local/mha/mha.failover.error
cd /usr/local/mha/
rm -rf /usr/local/mha/mha.failover.error
# 如果转移成功的,要重启,成功日志也要删除
rm -rf /usr/local/mha/mha.failover.complete
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
masterha_check_status --conf=/etc/mha/mha.conf
tail -fn100 /usr/local/mha/manager.log
错误2:
Unknown option: ssh_user
Died at /usr/local/scripts/master_ip_failover line 270.
错误3:
Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/scripts/master_ip_failover line 100.
注释100行 FIXME_xxx"。
错误4:
Unrecognized character \xC2; marked by <-- HERE after <-- HERE near column 1 at /usr/local/scripts/master_ip_failover line 124.
错误2、3、4都需要查看文件是哪行报错了,多数是格式、变量的问题。
五、结语
如果只用MHA的话,VIP这步必不可少,否则就只能启到集群的作用,不能负载。
但是如果用了mycat、proxySQL这样的中间件,实际上就不需要VIP这步了。MHA能做到自动转移故障就行了。