vlambda博客
学习文章列表

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能做到自动转移故障就行了。