centos7搭建mysql5.7 高可用(MHA)

时间:2022-09-19 20:17:06

数据库架构:一主二从

master:192.168.0.11
slave1:192.168.0.201
slave2:192.168.0.202

MHA软件:下载地址

mha4mysql-manager-0.57.tar.gz
mha4mysql-node-0.57.tar.gz

Manager工具包主要包括以下几个工具:

masterha_check_ssh              检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息

Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs                保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)

一、配置msyql5.7
1.在配置文件添加,三台服务器一样,只需修改server-id和log-bin。
注意:binlog-do-db 和 replicate-ignore-db 设置必须相同。 MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移,这里没有设置。

server-id=266
log-bin=mysql-bin
gtid_mode = on
#开启gtid,必须主从全开
enforce_gtid_consistency = 1
log_slave_updates = 1
#开启半同步复制 否则自动切换主从的时候会报主键错误
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

2.启动服务器,配置主从 (这里简写,百度很多)

mysql5.7会默认加载validate_password 模块,是来控制密码长度和规则的,可以在配置文件里面关闭该模块  加上validate_password = off ,或者在mysql命令行执行set global validate_password_policy=0;来临时取消密码规则。

在三台服务器上配置复制用户和监控用户,三台服务器都要添加。

添加复制用户

 grant replication slave on *.* to 'repl'@'192.168.0.%' identified by '123456';
这里注意一定要用repl用户,否则后边会报找不到复制用户

加监控用户

 grant all privileges on *.* to 'root'@'192.168.0.%' identified by '123456';

在master上执行

show master status;

记住File 和Position列的数字

在salve1 和salve2上执行

change master to master_host='192.168.0.11',master_user='repl',master_password='123456',master_log_file='mysql-master.000001',master_log_pos=194;
#设置从服务器只读,不要在配置文件里写,重点!!!不然不小心从服务器写入了数据,有你哭的
set global read_only=1

主从配置完毕

二、安装MHA
1.安装依赖包

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

2.这里把slave2作为监控服务器,因为开的虚拟机,开三台电脑就快扛不住了,有资源的可以使manager单独做一台服务器

安装 manager (在slave2上)

tar xf mha4mysql-manager-0.57.tar.gz 
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

安装node (三台服务器都安装)

tar xf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

安装完成后会在/usr/local/bin目录下面生成相应的脚本,前边说过

复制相关脚本到/usr/local/bin目录(manager 服务器执行)

cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

master_ip_failover #自动切换时vip管理的脚本,不是必须,如果我们使用keepalived的,我们可以自己编写脚本完成对vip的管理,比如监控mysql,如果mysql异常,我们停止keepalived就行,这样vip就会自动漂移
master_ip_online_change #在线切换时vip的管理,不是必须,同样可以可以自行编写简单的shell完成
power_manager #故障发生后关闭主机的脚本,不是必须
send_report #因故障切换后发送报警的脚本,不是必须,可自行编写简单的shell完成。

3.配置SSH登录无密码验证

master上

ssh-keygen -t rsa
sh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.201
sh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.202

slave1上

ssh-keygen -t rsa
sh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.11
sh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.202

slave2上

ssh-keygen -t rsa
sh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.11
sh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.201

3.配置MHA
修改/usr/local/bin/master_ip_failover,这里使用脚本管理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.0.88/24'; #此处为你要设置的虚拟ip
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig enp0s3:$key $vip"; #此处改为你的网卡名称
my $ssh_stop_vip = "/sbin/ifconfig enp0s3:$key down";

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() {
return 0 unless ($ssh_user);
`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";
}

4.添加修改MHA配置文件

mkdir -p /etc/masterha
cp mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
cat /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1.log //设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log //设置manager的日志
master_binlog_dir=/data/mysql //设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_ip_failover_script= /usr/local/bin/master_ip_failover //设置自动failover时候的切换脚本,也就是上边的哪个脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change //设置手动切换时候的切换脚本
password=123456 //设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
user=root 设置监控用户root
ping_interval=1 //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
remote_workdir=/tmp //设置远端mysql在发生切换时binlog的保存位置
repl_password=123456 //设置复制用户的密码
repl_user=repl //设置复制环境中的复制用户名
report_script=/usr/local/send_report //设置发生切换后发送的报警的脚本
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 192.168.0.201 -s 192.168.0.202
shutdown_script="" //设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root //设置ssh的登录用户名

[server1]
hostname=192.168.0.11
port=3306

[server2]
hostname=192.168.0.201
port=3306
candidate_master=1 //设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
check_repl_delay=0 //默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

[server3]
hostname=192.168.0.202
port=3306

5.测试连接情况
测试ssh的连接情况

masterha_check_ssh –conf=/etc/masterha/app1.cnf
centos7搭建mysql5.7 高可用(MHA)

测试mysq集群的连接情况

masterha_check_repl –conf=/etc/masterha/app1.cnf
centos7搭建mysql5.7 高可用(MHA)

检查MHA的状态

masterha_check_status --conf=/etc/masterha/app1.cnf

启动MHA

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 & 

–remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
–manger_log 日志存放位置
–ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover。

停止MHA

masterha_stop –conf=/etc/masterha/app1.cnf

6.检查MHA的启动状态

tail /var/log/masterha/app1/manager.log
如果最后一行是
[info] Ping(SELECT) succeeded, waiting until MySQL doesn’t respond..
表明启动成功

7.使用 ip addr命令查看master上的ip地址,是否有虚拟ip 192.168.0.88
ip addr

ip addr
enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:9a:ef:e5 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global dynamic enp0s3
valid_lft 66813sec preferred_lft 66813sec
inet 192.168.0.88/24 brd 192.168.0.255 scope global secondary enp0s3:1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe9a:efe5/64 scope link
valid_lft forever preferred_lft forever

8.杀死master,slave1和salve2成功成为 主从,vip成功移植到slave1上面。

9.修复master,让挂掉的主作为从继续使用,在manager上执行(192.168.0.202)

grep -i "All other slaves should start" /var/log/masterha/app1/manager.log 


[info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.0.11', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

在挂掉的主上面执行(192.168.0.11)

CHANGE MASTER TO MASTER_HOST='192.168.0.11', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123456';
#设置只读
set global read_only=1

停到目前主上的(192.168.0.201)slave进程

mysql -e -u root -p123456 'stop slave'
mysql -e -u root -p123456 'reset slave'

然后修改MHA的配置文件将新的架构配置到新的MHA配置文件当中,检查集群的状况,最后启动MHA,根据前面的讲解修改,这里不再贴出。