一.知识剖析:
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于 Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。
在MySQL故障切换过程中,MHA能做到在 0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
-
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
-
MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库
注意:
- 1.需要奇数个结点
- 2.每一个节点都要安装master和master,因为所有数据节点都有可能作为master,当master挂点之后,一般选出数据差异性最小的slave节点作为新的master节点
二.部署Mysql的高可用
前提:因为我们前面做过mysql—proxy,所以我们需要将其清理掉,还原一个纯净的实验环境在配置基于GTID的主从复制
寻找killall命令的软件包并杀死mysql-proxy的进程
[root@meng2 html]# yum whatprovides /usr/bin/killall
[root@meng2 html]# yum install -y psmisc-22.20-15.el7.x86_64
[root@meng2 html]# ps ax
[root@meng2 html]# killall -9 mysql-proxy
配置基于GTID的主从复制(一主两从)
编辑配置文件,然后再重启mysqld(meng1/2/3一样)
[root@meng2 conf]# vim /etc/my.cnf
[root@meng2 conf]# tail -n 5 /etc/my.cnf
server_id=2 #meng2是2,meng3是3,以此类推
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
[root@meng2 html]# systemctl restart mysqld
meng1
meng2
meng3
meng1(master):
[root@meng1 html]# mysql -uroot -pWsp+123ld
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_master_enabled =1;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout =10000000000000000000;
mysql> show variables like '%rpl%';
在meng3:
[root@meng3 html]# mysql -uroot -pWsp+123ld
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show slave status\G
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
在meng2里面:
[root@meng2 conf]# cd /var/lib/mysql
[root@meng2 mysql]# ls
[root@meng2 mysql]# systemctl stop mysqld
[root@meng2 mysql]# rm -fr *
[root@meng2 mysql]# ls
[root@meng2 mysql]# systemctl start mysqld
[root@meng2 mysql]# ls
[root@meng2 mysql]# grep password /var/log/mysqld.log
[root@meng2 mysql]# mysql_secure_installation
[root@meng2 mysql]# mysql -uroot -pWsp+123ld
mysql> change master to master_host='172.25.11.1',master_user='repl',master_password='Wsp+123ld',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
mysql> show global variables like '%gtid%';
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_master_timeout =10000000000000000000;
配置MHA的高可用:
实验环境:
主机 | 服务 |
---|---|
meng1 | 主master |
meng2 | 从slave |
meng3 | 从slave |
meng4 | MHA管理节点 |
[root@foundation11 images]# qemu-img create -f qcow2 -b meng.qcow2 meng4
第一步:meng4安装MHA,实现与各个节点以及节点之间的ssh免密登陆
[root@meng4 mnt]#yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-* mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@meng4 mnt]# ssh-keyg
[root@meng4 mnt]# ssh-copy-id meng1
[root@meng4 mnt]# ssh-copy-id meng2
[root@meng4 mnt]# ssh-copy-id meng3
免密结果:第一次连接要输入yes,但是不用输入密码
实现各个节点之间的免密
[root@meng4 masterha]# scp -r ~/.ssh meng1:
[root@meng4 masterha]# scp -r ~/.ssh meng2:
[root@meng4 masterha]# scp -r ~/.ssh meng3:
结果如下所示(以meng2为例子):
第二步:在meng1/2/3上面安装MHA节点软件包
[root@meng1 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
[root@meng2 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
[root@meng3 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
在meng4上面将meng1/2/3所需安装包发送过去
第三步:meng4编辑配置文件
[root@meng4 mnt]# cd
[root@meng4 ~]# mkdir /etc/masterha
[root@meng4 ~]# cd /etc/masterha
[root@meng4 masterha]# ls
[root@meng4 masterha]# vim master.cnf
[meng default]
manager_workdir=/etc/masterha #设置manager的工作目录
manager_log=/var/log/masterha.log ##设置manager的日志
master_binlog_dir=/etc/masterha #设置master 保存binlog的位置,以便MHA可以找到master的日志
password=Wsp+123ld # 设置root用户的登陆mysql的密码
user=root #设置监控用户root
ping_interval=1 ##设置监控主库,发送ping包的时间间隔,默认是3秒,尝试
#三次没有回应的时候自动进行railover
remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
repl_password=Wsp+123ld #设置复制(slave)用户的密码
repl_user=repl #设置复制(slave)用户
ssh_user=root
[server1]
hostname=172.25.11.1
port=3306
[server2]
hostname=172.25.11.2
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
candidate_master=1
check_repl_delay=0
[server3]
hostname=172.25.11.3
port=3306
no_master=1 #不能成为master
第四步:检测(两个都要没问题才可以)
检测ssh登陆是否成功
[root@meng4 masterha]# masterha_check_ssh --conf=/etc/masterha/master.cnf (要允许远程登陆)
检测mysql的用户状况:
[root@meng4 masterha]# masterha_check_repl --conf=/etc/masterha/master.cnf #(失败)
[root@meng1 ~]# mysql -uroot -pWsp+123ld
mysql> grant all on *.* to root@'%' identified by 'Wsp+123ld';
mysql> flush privileges;
[root@meng4 masterha]# masterha_check_repl --conf=/etc/masterha/master.cnf (这次成功)
进行用户授权:
这次成功:
第五步:管理MHA服务,查看进程
[root@meng4 masterha]# nohup masterha_manager --conf=/etc/masterha/master.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha.log 2>&1 & #后台运行MHA
[root@meng4 masterha]# ps ax #有进程产生
[root@meng4 masterha]# masterha_stop --conf=/etc/masterha/master.cnf #关闭服务
[root@meng4 masterha]# ps ax #进程消失
没有进程:
第六步:手动切换测试(注意后台运行服务)
在master挂掉时候手动切换master:
关闭meng1的mysql服务
[root@meng1 ~]# systemctl stop mysqld
meng4上面手动替换master
[root@meng4 masterha]# masterha_master_switch --master_state=dead --conf=/etc/masterha/master.cnf --dead_master_host=172.25.11.1 --dead_master_ip=172.25.11.1 --dead_master_port=3306 --new_master_host=172.25.11.2 --new_master_port=3306
#要输入两次yes
在meng2/3上面查看master此刻是谁:
在master还完好的时候手动切换master
恢复meng1的mysql,并使其加入主从复制
[root@meng1 ~]# systemctl start mysqld
[root@meng1 ~]# mysql -uroot -pWsp+123ld
mysql> change master to master_host='172.25.11.2',master_user='repl',master_password='Wsp+123ld',master_auto_position=1;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
[root@meng4 masterha]# ls
master.cnf master.failover.complete
[root@meng4 masterha]# rm -fr master.failover.complete
每一次转换master都会生成/etc/masterha/app1.failover.complete,要删除这个文件,否则再次转换不能成功
输入以下命令手动切换
[root@meng4 masterha]# masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf --new_master_host=172.25.11.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
(这个要输入三次yes)
再去meng2/3里面查看状态:
第七步:自动切换(使用脚本,采用虚拟ip)
在物理机将脚本上传到虚拟机(我这里是别人已经写好的脚本),并加上执行权限
[kiosk@foundation11 Desktop]$ scp master_ip_* root@172.25.11.4:/usr/local/bin/
[root@meng4 masterha]# cd /usr/local/bin
[root@meng4 bin]# ls
[root@meng4 bin]# chmod +x *
编辑MHA的配置文件:
[root@meng4 masterha]# vim master.cnf
加入以下内容:
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
查看网卡名称:
修改脚本:使其符合本次实验
[root@meng4 bin]# vim master_ip_failover
11 my $vip = '172.25.11.100/24';
12 my $key = '1';
13 my $ssh_start_vip = "/sbin/ip addr add $vip dev ens3";
14 my $ssh_stop_vip = "/sbin/ip addr del $vip dev ens3";
[root@meng4 bin]# vim master_ip_online_change
7 my $vip = '172.25.11.100/24'; # Virtual IP
8 my $key = "1";
9 my $ssh_start_vip = "/sbin/ip addr add $vip dev ens3";
10 my $ssh_stop_vip = "/sbin/ip addr del $vip dev ens3";
11 my $exit_code = 0;
在现在的master上面添加虚拟ip(中间我还做过一次切换,所以现在master是2)
[root@meng2 ~]# ip addr add 172.25.11.100/24 dev ens3
[root@meng2 ~]# ip a
在meng3上面查看master状态:
手动切换:
[root@meng4 bin]# masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf --new_master_host=172.25.11.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
此时meng2上面没有vip,vip会飘逸到1上面
在meng3上面查看:
自动切换
发起自动转换命令
[root@meng4 masterha]# nohup masterha_manager --conf=/etc/masterha/master.cnf &>/dev/null &
[1] 4340
[root@meng4 masterha]# ps ax
meng1关闭mysql,没有vip
vip会到meng2
在meng3上面查看
来源:https://blog.csdn.net/bmengmeng/article/details/99313051