MHA环境搭建(系统centos7.9)

角色 ip地址 主机名 server_id 类型
master 192.168.1.18 master 1
slave(备选master) 192.168.1.19 slave_master 2
slave 192.168.1.20 salve 3
MHA管理 192.168.1.21 mha 监控复制组


MySQL 主从复制环境配置
(1)配置3个节点的SSH互信。
MHA集群要在MySQL 各个节点上执行各种操作,因此需要在3个MySQL 节点做无密
码登录设置,也就是设置3个节点间的 SSH互信。这里通过公钥认证方式来设置互信,以
master主机为例,在3个MySQL 节点分别执行如下操作:
[root@master ~# ssh-keygen -t rsa
[root@master ~# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.19
[root@master~# ssh-copy-id-i/root/.ssh/id rsa.pub root@192.168.1.20
[root@master ~# ssh-copy-id -i /root/.ssh/id rsa.pub root@192.168.1.18
最后测试3个节点之间是否可以无密码登录:
[root@master~#ssh 192.168.1.19
最后MHA管理节占也执行加下操作无密码操作

安装mysql

https://pan.baidu.com/s/1UkB2irAsAnCfbmscyVUrdw  

提取码:gp2j

配置3个节点主从关系。
在3个MySQL 节点的my.cnf文件中添加如下内容:
server-id=1
read-only=1
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
其中,每个节点的server-id各不相同。
(4)在3个MySQL 节点做授权配置。
在3个MySQL 节点上都执行以下SQL授权操作:
mysql>grant replication slave on *.* to 'repl_user'@'192.168.1.%' identified by
'repl_passwd';
mysql>grant all on *.* to 'root'@'192.168.1.%' identified by 'mpasswd';
(5)开启主从同步。
首先依次启动3个节点的MySQL服务:
[root@master ~# systemctl start mysqld
然后在Master 节点上执行如下命令:
mysql> show master status;
从上面SQL的输出中找到Master 节点对应的binlog日志文件名和编号,并记录下来。本
例中是mysql-bin.000019和120.
接着,在两个Slave节点上执行如下同步操作:
mysql> change master to master host='192.168.1.18',master_user='repl_user',master_
password= ' repl_passwd',master_log_file='mysql-bin.000019',master_log_pos=120;
执行完成后,分别在两个Slave节点上启动Slave服务:
mysql> start slave;

安装MHA软件

[root@master-]#rpm-ivh https://d1.fedoraproject.org/pub/epe1/epel-release-1ates.7.noarch.rpm
[root@master~]#rpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[root@master~]#yum -y install per1-DBD-MysQL ncftp
MHA的安装分为Manager的安装和Node的安装。MHA提供了源码和rpm包两种安装方
式,推荐使用rpm包安装方式,安装过程如下。
(1)在3个MySQL节点上依次安装MHA Node包。
[root@master~#yum install perl-DBD-mysql
[root@master~#rpm -ivh mha4mysql-node-0.58-0.e17.noarch.rpm
(2)在MHA Manager 节点上安装MHA Manager包。
[root@mha~#yum install perl-DBD-MySQL  perl-Config-Tiny  perl-Log-Dispatch  perl-Parallel-ForkManager perl-Config-IniFiles perl-Time-HiRes
[root@mha~#rpm -ivh mha4mysql-node-0.58-0.e17.noarch.rpm
[root@mha~#rpm -ivh mha4mysql-manager-0.58-0.e17.noarch.rpm
配置MHA集群
MHA的配置是在Manager主机上完成的。在MHA安装完成后,在Manager 主机的/etc/mha
目录下手动创建一个文件,该文件用来作为MHA的主配置文件,文件名称任意。这里创建了
一个appl.cnf文件。
1.MHA主配置文件
MHA主配置文件/etc/mha/appl.cnf的常用配置选项内容如下:

[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_ip_failover_script=/usr/local/bin/master_ip_failover
password= “mysql的root密码这里是mpasswd”
ping_interval=1
repl_password=“主从同步密码repl_passwd”
repl_user=repl_user
ssh_user=root
user=root

[server1]
candidate_master=1
hostname=192.168.1.18
port=3306

[server2]
candidate_master=1
hostname=192.168.1.19

check_repl_delay=0

port=3306

[server3]
hostname=192.168.1.20
no_master=1
port=3306

每个配置选项含义的介绍如下。

user:默认root,表示MySQL的用户名,MHA要通过此用户执行很多命令,如STOP
SLAVE、CHANGE MASTER、RESET SLAVE等。

password:user的密码,如果指定了MySQL用户为root,那么它就是root用户的密码。
ssh_user:操作系统的用户名(Manager节点和MySQL主从复制节点)。因为要应用、
解析各种日志,所以推荐使用root用户,默认是MHA管理的当前用户。
repl _user: MySQL 主从复制线程的用户名(最好加上)。

repl password:MySQL 主从复制线程的密码(最好加上)。

ping_interval:MHA 通过ping SQL的方式监控Master状态,此选项用来设置MHA
管理多久去检查一次主机,默认3秒,如果3次间隔都没反应,那么MHA就会认为
主机已经现问题了。如果MHA Manager连不上Master是因为连接数过多或者认证
失败,那此时MHA将不会认为主机出问题。

secondary_check_script:默认情况下,MHA通过单个路由(即从Manager到Master)
来检查主机的可用性,这种默认的监控机制不够完善。不过,MHA还提供了一个监
控主机的接口,那就是调用 secondary_check_script 参数,通过定义外部脚本来实现

多路由监测。
例如:
secondary_check_acript -masterha_secondary_check-a remote_host1 -s renote_host2
其中masterha_secondary_check 是 MHA 提供的一个监测脚本,remote_host1、remote_
host2是两台远程主机,建议不要和MHA Manager 主机放在同一个网段中。
secondary_check脚本的监测机制是:
Manager-(A)->remote_host1-(B)->master_host
Manager-(A)->remote_host2-(B)->master_host
脚本会首先通过Manager主机检测远程主机的网络状态,这个过程是A.接着,它再
通过远程主机检查master_host的状态,这个过程为B.
在过程A中,Manager 主机需要通过SSH连接到远程的机器上,所以需要Manager主机
到远程机器上建立public key信任。在过程B中,masterha_secondary_check通过远程主机和
Master 建立TCP连接来测试Master是否存活。
在所有的路由中,如果A成功,B失败,那么MHA才认为Master出现了问题,进而执行
故障转移操作。其他情况下,一律认为Master是正常状态,也就是不会进行故障转移操作。
股来讲,强烈推荐使用多个网络上的机器,通过不同路由策略来检查MySQL Master存活状态。
master ip failover script.此选项用来设置VIP漂移动作,默认MHA不会做VIP漂移,
但可以通过 master ip failover _script来指定一个VIP漂移脚本。MHA源码包中自带了
一个VIP 漂移脚本 master_ip_failover,稍加修改就能使用,后面会介绍这个脚本。
master_ip_online _changes_script.这个参数有点类似于master_ip_failover_script,但这
个参数不用于Master故障转移,而用于Master在线切换。使用masterha _master_switch
命令手动切换MySQL主服务器后会调用此脚本。
shutdown_script.设置故障发生后关闭故障主机的脚本(该脚本的主要作用是关闭主
机,防止发生脑裂)。此脚本是利用服务器的远程控制IDRAC、使用ipmitool强制去
关机,以避免Fence设备重启主服务器,造成脑裂现象。
report_script.当新主服务器切换完成以后通过此脚本发送邮件报告。


manager_workdir. MHA Manager的工作目录,默认为/var/tmp.

manager_log.MHA Manager的日志目录,如果不设置,默认为标准输出和标准错误
输出。
master_binlog_dir.Master上产生 binlog日志对应的binlog目录。默认是/var/lib/mysql,


check_repl_delay.默认情况下,如果从机落后主机100MB左右的relay log,MHA会
放弃选择这个从机作为新主机,但是,如果设置check repl delay=0,MHA会忽略这
个限制,如果想让某个candidate_master=1的从机成为主机,那么candidate_master-1

这个参数特别有用。

candidate_master.候选Master,如果将其设置为1,那么这台机器被选举为新Master
的机会就越大(还要满足:binlog开启,没有大的延迟)。如果设置了N台机器都为
candidate_master=1,那么选举的顺序为从上到下。

no_master.如果对某台机器设置了no_master=1,那么这台机器永远都不可能成为新
master,如果没有Master选举了,那么MHA会自动退出。
ignore_fail.默认情况下,如果Slave有问题(无法通过MySQL、SSH连接,SQL线
程停止等),MHA将停止故障转移。如果不想让 MHA Manager 停止,可以设置
ignore_fail=1.
配置MHA集群的VIP
VIP配置可以采用两种方式,一种通过Keepalived的方式管理虚拟IP的浮动;另外一种
通过脚本方式启动虚拟IP(即不需要Keepalived或者 heartbeat类似的软件)。
MHA提供了脚本管理方式,可从mha-manager的源码包中找到常用的一些MHA维护脚
本,如master_ip_failover、send_report、master_ip_online change等。master_ip_failover

脚本如下:此脚本需要修改$vip的变量值,以及“¥ssh_start_vip”"ssh_stop_vip"变量的网卡名称

根据自己的环境进行修改。

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.1.200';
my $brdc = '192.168.1.255';
my $ifdev = 'etho0';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 192.168.1.200";
my $exit_code = 0;
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);

exit &main();

sub main {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {

my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

 测试MHA环境以及常见问题总结
MHA提供了两个工具用来验证MHA环境配置的正确性,用户可通过masterha_check_ssh
和masterha_check_repl两个命令来验证。
1. masterha_check_ssh 验证 SSH无密码登录
想通过 masterha_check_ssh 验证SSH信任登录是否配置成功,可在Manager 主机上执行如
下命令:
[root@mha~#masterha_check_ssh --conf=/etc/mha/app1.cnf
2.masterha_check_repl 验证 MySQL 主从复制
想通过masterha_check_repl验证MySQL主从复制关系配置正常,可在Manager主机上执
行如下命令:
[root@mha ~# masterha_check_repl--conf=/etc/mha/app1.cnf

启动与管理MHA

首先再当前的master执行如下命令

[root@master ~]#  ifconfig  eth0:1  192.168.1.200

此操作只需执行一次,用来将vip绑定到目前的master上,当MHA接管了mysql主从复制后,就无需执行此操作了,所有vip漂移由MHA完成

通过masterrha_manager来启动MHA监控

[root@mha ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf  --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

 

手动故障转移:

[root@mha ~]# masterha_master_switch  --master_state=dead --conf=/etc/mha/app1.cnf --dead_master_host=192.168.1.18 --dead_master_port=3306  --new_master_host=192.168.1.19 --new_master_port=3306 --ignore_Last_failover

 

如何将故障节点重新加入集群
通常情况下,在自动换以后,原 Master可能已经废弃掉,如果原 Master修复好,那么在数据完整的情况下,还可以把原来的 Master重新作为新 Slave主库的,入到MHA集群中
 MySQL

这时可以借助当时自动切换时刻的MHA日志来完成将原master新加入集群中的操作

修改管理配置文件
 
如果原 Master的配置已经删除,那么需要重新加入,打开/app1conf文件,将
如下内容添加进来:
 [server1]
 candidate_master=1
 hostnane=192.168.1.18
(2)修复老的Master,然后将其设置为 Slave,要修复老的 Master,需要在的 Master改障时自动切换时刻的MHA日志中查找一些日
志信息,从日志中找到类似以下内容的信息:
 sat May 27 14: 59:17 2017 linto] other slaves ahould stazt replication from hetn.
 tatenant ahoula be: CHANGE HASTS3 TO HASTER 1OST-=192.168.1.18, MASTER FORT-330e
 MA. TER_ FIL3-'nyl bin. 000009', MAUTEB LOC FOS-120, MASTER user'.
 MASTER_PASSMOR-'xxX':
这段日志的意思是说,如果 Master修复好了,那可以在修复好后的 Master上执行 CHANGE master操作,并将其作为新的slave库

mysql> change master to master host='192.168.1.19',master_user='repl_user',master_
password= ' repl_passwd',master_log_file='mysql-bin.000019',master_log_pos=120;

mysql> start slave;

mysql> show slave status\G;

这样数据就开始同步到老的master上了,此时老的master已经重新加入集群,变成了
MHA集群的一个slave了

在管理节点重新启动监控程序

[root@mha ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf  --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &