Mysql——基于MHA的Mysq高可用架构搭建

梦想与她 提交于 2019-11-27 03:39:29

一.知识剖析:

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上面查看

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!