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