基于GTID的半同步复制的Mysql高可用架构之MHA之主从切换(手动切换,在线切换,自动切换)

Mysql高可用架构之MHA的搭建部署

为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA之前配置成半同步复制。

1.清空环境
server1和server2:
先停掉mysql,再清空/var/lib/mysql目录下的所有mysql缓存记录

在这里插入图片描述
清空server3的环境:

停掉之前的mysql-proxy服务(安装killall命令,然后利用killall命令杀掉,所有mysql-proxy的进程)

在这里插入图片描述
利用killall命令杀掉所有关于mysql-proxy的进程,杀掉之后,可以利用“ps ax”命令进行确认

在这里插入图片描述
2.配置server1:

<1>编辑配置文件

[root@server1 ~]# vim /etc/my.cnf
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON 
log_bin=binlog
 
#log_slave_updates:默认值是off。如果不手动设置,那么log-bin只会记录直接在该库上执行SQL语句,由replication机制的SQL线程读取relay-log而执行的SQL语句不会记录到binlog,那么无法实现三级级联的同步。

在这里插入图片描述
<2>开启mysql,获取初始密码,进行安全初始化,创建半同步复制用户并授权,创建数据库以便后面的测试(创建数据库需要在加载半同步的插件之前进行操作)

[root@server1 ~]# systemctl start mysqld
[root@server1 ~]# grep password /var/log/mysqld.log
[root@server1 ~]# mysql_secure_installation
[root@server1 ~]# mysql -uroot -pXinjiaojiao+523
mysql> grant replication slave on *.* to 'xin'@'172.25.83.%' identified by 'Xinjiaojiao+523';
mysql> create database westos;

<3>登录数据库,安装半同步插件及配置

[root@server1 ~]# mysql -uroot -pXinjiaojiao+523
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_master_timeout=1000000;
mysql> show variables like '%semi%';  #查看半同步的一些变量设置(来查看timeout的设置是否有效)
mysql> show status like '%semi%';    #查看半同步的一些状态的设置(来查看半同步的master端是否是打开的。)
mysql> show plugins;     #查看插件(来查看半同步的插件是否加载成功)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<4>为了使得上述的半同步设置在重启mysqld服务之后,仍能生效。将半同步设置的参数加入mysqld服务的配置文件(/etc/my.cnf),并重启mysqld服务。

在这里插入图片描述

[root@server1 ~]# ststemctl start mysql

<5>下载MHA数据节点对应的安装包:mha4mysql-node-0.58-0.el7.centos.noarch.rpm,并进行安装
在这里插入图片描述
3.配置server2:
<1>编辑配置文件

[root@server2 ~]# vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON 
log_bin=binlog
 
#log_slave_updates:默认值是off。如果不手动设置,那么log-bin只会记录直接在该库上执行SQL语句,由replication机制的SQL线程读取relay-log而执行的SQL语句不会记录到binlog,那么无法实现三级级联的同步。

在这里插入图片描述
<2>开启mysql,获取初始密码,进行安全初始化,将从库和主库连接起来,开启slave,查看slave的状态,并查看数据库以确保基于gtid的半同步复制部署成功。

[root@server2 ~]# systemctl start mysqld
[root@server2 ~]# grep password /var/log/mysqld.log
[root@server2 ~]# mysql_secure_installation
[root@server2 ~]# mysql -uroot -p
mysql> change master to master_host='172.25.83.1',master_user='xin',master_password='Xinjiaojiao+523',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
mysql> show databases;

在这里插入图片描述

在这里插入图片描述
<3>登录数据库,安装半同步插件及配置

[root@server2 ~]# mysql -uroot -pXinjiaojiao+523
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_slave_enabled=1;
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show status like '%semi%';    #查看半同步的一些状态的设置(来查看半同步的slave端是否是打开的。)
mysql> show plugins;     #查看插件(来查看半同步的插件是否加载成功)

在这里插入图片描述
在这里插入图片描述
<4>为了使得上述的半同步设置在重启mysqld服务之后,仍能生效。将半同步设置的参数加入mysqld服务的配置文件(/etc/my.cnf),并重启mysqld服务。(此时再次查看半同步的一些状态的设置,会看到半同步的master端和slave端都是打开的。)
在这里插入图片描述
[root@server2 ~]# systemctl restart mysql

<5>下载MHA数据节点对应的安装包:mha4mysql-node-0.58-0.el7.centos.noarch.rpm,并进行安装

在这里插入图片描述
4.配置server3,配置过程同server2

5.在server1,server2,server3做好基于gtid的办同步复制的前提下:配置server1
<1>登陆数据库,给root用户全部的权限

[root@server1 ~]# mysql -uroot -pXinjiaojiao+523
mysql> grant all on *.* to 'root'@'%' identified by 'Wsp+123ld';

<2>登陆数据库,创建 用户virtual,并赋予virtual用户insert,update,select的权限,以便后续测试虚拟ip。

[root@server1 ~]# mysql -uroot -pWsp+123ld
mysql> grant insert,update,select on *.* to 'virtual'@'%' identified by 'Wsp+123ld';

6.配置server4
<1>下载下面的.rpm包,并进行安装
在这里插入图片描述
在这里插入图片描述
<2>配置MHA管理节点到MHA数据节点之间的免密服务,并进行测试

[root@server4 ~]# ssh-keygen   #生成密钥
[root@server4 ~]# ssh-copy-id server1    #将密钥发送给server1(MHA数据节点)
[root@server4 ~]# ssh-copy-id server2  
[root@server4 ~]# ssh-copy-id server3 

在这里插入图片描述
在这里插入图片描述

[root@server4 ~]# ssh server1       #测试是否实现了免密
[root@server4 ~]# ssh server2   
[root@server4 ~]# ssh server3       

在这里插入图片描述
<3>配置MHA数据节点之间的免密服务,并进行测试

[root@server4 ~]# scp -r ~/.ssh/ server1:
[root@server4 ~]# scp -r ~/.ssh/ server2:
[root@server4 ~]# scp -r ~/.ssh/ server3:
[root@server2 ~]# ssh server1 
[root@server2 ~]# ssh server3 

在这里插入图片描述
<4>配置MHA:创建MHA的工作目录,并且创建相关配置文件

[root@server4 ~]# mkdir /etc/masterha
[root@server4 ~]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/etc/masterha           #设置manager的工作目录
manager_log=/var/log/masterha.log       #设置manager的日志
master_binlog_dir=/var/log/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=Xinjiaojiao+523     #设置mysql中root用户的密码
user=root                    #设置监控用户root
ping_interval=1              #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp                 #设置远端mysql在发生切换时binlog的保存位置
repl_password=Xinjiaojiao+523       #设置复制用户的密码
repl_user=xin                       #设置复制环境中的复制用户名
#report_script=/usr/local/send_report   #设置发生切换后发送的报警的脚本
#secondary_check_script=/usr/local/bin/masterha_secondary_check -s server03 -s server02            
#shutdown_script=""        #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root              #设置ssh的登录用户名
 
[server1]
hostname=172.25.83.1
port=3306
 
[server2]
hostname=172.25.83.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
 
[server3]
hostname=172.25.83.3    
port=3306
#no_master=1       #其中上面的candidate_master=1和check_repl_delay=0与no_master=1的意思相反,所以只需设置一个。(此参数的意思是:不会称为备选的master)

在这里插入图片描述
<5>检查SSH配置:检查MHA Manger到所有MHA Node的SSH连接状态:

[root@server4 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

在这里插入图片描述

<6>检查整个复制环境状况:通过masterha_check_repl脚本查看整个集群的状态

在测试过程中,会发现有些卡,这是因为在server1,server2及server3的配置文件中添加了半同步的配置
( rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000000
rpl_semi_sync_slave_enabled=1 )
,可能其中timeout设置的数字有点大,为了测试,我们将server1,server2及server3中的这三行注释,并重启服务,再次在server4进行测试。
在这里插入图片描述
在这里插入图片描述

在server2和server3上设置只读

mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

<7>配置VIP

vip配置可以采用两种方式,一种通过keepalived的方式管理虚拟ip的浮动;另外一种通过脚本方式启动虚拟ip的方式(即不需要keepalived或者heartbeat类似的软件)。

这里采用脚本的方式来管理虚拟ip。

(1)下载虚拟ip对应的配置文件(master_ip_failover 和master_ip_online_change),并进行相应的修改,配置文件的内容如下。
[root@server4 bin]# vim master_ip_failover #注意11-13行内容的修改

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
[root@server4 bin]# vim master_ip_online_change #注意7-9行内容的修改

在这里插入图片描述
(2)给这两个脚本赋予可执行的权限

在这里插入图片描述
MHA集群配置完毕。

6.测试:
<1>测试1:手动failover(MHA Manager必须没有运行)

(1)在server1上关闭mysqld服务

[root@server1 ~]# systemctl stop mysqld

(2)在server1上添加虚拟ip,以便进行虚拟ip的实验。
在这里插入图片描述
(3)在server4上手动failover

[root@server4 ~]#  masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.83.1 --dead_master_port=3306 --new_master_host=172.25.83.2 --new_master_port=3306 --ignore_last_failover
 
 --ignore_last_failover可加可不加,(因为每次手动failover完成之后,都会在/etc/masterha目录下生成app1.failover.complete文件),这个参数的含义是忽略该文件的存在(因为如果该文件存在,且不加该参数,再次failover时会报错。因此要么该文件存在,加此参数;要么就将该文件删除,再进行测试)

在这里插入图片描述

此时在server2上登陆数据库,查看master的状态;在server3上登陆数据库,查看slave的状态会看到server3显示的master是server2而不再是server1;在server1上启动mysqld服务,登陆数据库,执行命令,使得server1从库连接server2主库,并查看slave的状态,会看到server1作为从库指向server2的主库。

[root@server1 ~]# systemctl start mysqld

此时在server1上查看ip,发现已经没有虚拟ip。而在server2上查看ip,发现虚拟ip在server2上。即成功实现了虚拟ip的漂移

在这里插入图片描述
<2>测试2:在线进行切换(热切换)
在模拟在线切换主库之前,删除之前切换时生成的文件,若有此文件,是不可以完成切换的。

在这里插入图片描述
模拟在线切换主库,原主库172.25.83.2变为slave,172.25.83.1提升为新的主库

[root@server4 ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.83.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000       #三次输入yes

在这里插入图片描述

在这里插入图片描述

此时在server1上登陆数据库,查看master的状态;在server3上登陆数据库,查看slave的状态会看到server3显示的master是server1而不再是server1;在server2上登陆数据库,查看slave的状态,会看到server2作为从库指向server2的主库。

<3>测试3:自动failover(必须先启动MHA Manager监控,否则无法自动切换)

在模拟自动failover之前,删除之前切换时生成的文件,
在这里插入图片描述
(1)自动切换监听打开并打入后台,并查看自动监听是否打开,以确保实验的正常进行

[root@server4 masterha]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /dev/null &        #打开自动监听,并打入后台
[root@server4 masterha]# masterha_check_status --conf=/etc/masterha/app1.cnf   #检查MHA Manager的状态,以查看自动监听是否已经打开

(2)关闭server1上的mysqld服务,模拟宕机
(3)此时在server2上登陆数据库,查看master的状态;在server3上登陆数据库,查看slave的状态会看到server3显示的master是server2而不再是server1;在server1上启动mysqld服务,登陆数据库,执行命令,使得server1从库连接server2主库,并查看slave的状态,会看到server1作为从库指向server2的主库。

[root@server4 masterha]# cat /var/log/masterha.log
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值