MHA方案简介
MHA简介
MHA目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本的youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。
在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA的优点
方案比较成熟被很多公司使用;
故障切换会尽量减少数据丢失来保证数据一致性;
自动主监控和10-30秒内故障转移;
无需修改当前的MySQL设置;
无性能损失;
适用于任何存储引擎(这个优势不太明显,因为大多数都会用innodb)。
MHA的缺点
MHA本身逻辑较为复杂,发生故障后排查问题,定位问题更加困难;
数据一致性靠原生半同步复制保证,理论上仍然存在数据不一致的风险;
MHA Manager网络分区情况下切还是不切这是个问题,切库的话容易发生脑裂现象;
MHA自身Manager也存在单点的问题;
MHA目前已无人维护,以后对高版本MySQL的兼容是个问题。
MHA工作原理
它由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。其中,MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave上。MHA Node则运行在每个mysql节点上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它自动将最新数据的slave提升为master,然后将其它所有的slave指向新的master。
在MHA自动故障切换过程中,MHA试图保存master的二进制日志,从而最大程度地保证数据不丢失,当这并不总是可行的,譬如,主服务器硬件故障或无法通过ssh访问,MHA就没法保存二进制日志,这样就只进行了故障转移但丢失了最新数据。可结合MySQL 5.5中推出的半同步复制来降低数据丢失的风险。
一、准备工作
1.准备工作
1.1 修改主机配置文件
vim etc/hosts
# 添加对应主机
192.168.222.139 Node_Master #写入,数据节点
192.168.222.142 Node_Slave #读,数据节点,备选主库
192.168.222.143 Manager_Slave #读,数据节点,也作为Manager server
1.2 关闭防火墙并且修改selinux配置文件
systemctl stop firewalld # 临时关闭防火墙
systemctl disable firewalld # 关闭自启动
# 修改selinux
vim etc/sysconfig/selinux
SELINUX=disabled # 设置为disabled
注意:为了节省机器,第二三台机器作为两用。实际环境中,一般有单独的机器的作为备份和Manager server。如果运行有误,需要关闭iptables服务。
1.3 机器互信
博主参考大佬教程,如果有需要让三台机器进行免密互通,请按照如下方法操作。注意用户,是三台机器。【推荐让机器互信】
[root@Node_Master ~]# ssh-copy-id 192.168.222.139
[root@Node_Master ~]# ssh-copy-id 192.168.222.142
[root@Node_Master ~]# ssh-copy-id 192.168.222.143
[root@Node_Slave ~]# ssh-copy-id 192.168.222.139
[root@Node_Slave ~]# ssh-copy-id 192.168.222.142
[root@Node_Slave ~]# ssh-copy-id 192.168.222.143
[root@Manager_Slave ~]# ssh-copy-id 192.168.222.139
[root@Manager_Slave ~]# ssh-copy-id 192.168.222.142
[root@Manager_Slave ~]# ssh-copy-id 192.168.222.143
1.4 Mysql主从复制环境
一主二从的结构:
主库:Node_Master 192.168.222.139
主库的配置文件:
server-id=1
log-bin=mysql-bin
binlog-ignore-db=mysql
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
从库一:Node_Slave 192.168.222.142
从库一的配置:
server-id=2
log-bin=mysql-bin
binlog-ignore-db=mysql # 千万要注意:主从同步中的过滤字段要一致,否则后面使用masterha_check_repl 检查复制时就会出错!
slave-skip-errors = all
从库二:Manager_Slave 192.168.222.143
从库二的配置:
server-id=3
log-bin=mysql-bin
binlog-ignore-db=mysql
slave-skip-errors = all
注意数据库里的参数配置:(必须要有)
server-id=1 # 每个节点不能相同
log-bin=/data/mysql3306/logs/mysql-bin # 不写路径默认在目录下
relay-log=/data/mysql3306/logs/relay-log # 不写路径默认在目录下
skip-name-resolve # 建议加上 非必须项
#read_only = ON # 从库开启,主库关闭只读
relay_log_purge = 0 # 关闭自动清理中继日志
log_slave_updates = 1 # 从库通过binlog更新的数据写进从库二进制日志中,必加,否则切换后可能丢失数据
1.5 创建用户mha管理的账号(在三台节点上都需要执行)
特别注意:mha的密码不要出现特殊字符,否则后面无法切换主库,很多人踩坑
mysql> GRANT SUPER,RELOAD,REPLICATION CLIENT,SELECT ON *.* TO manager@'192.168.222.%' IDENTIFIED BY 'manager_1234';
Query OK, 0 rows affected (0.06 sec)
mysql> GRANT CREATE,INSERT,UPDATE,DELETE,DROP ON*.* TO manager@'192.168.222.%';
Query OK, 0 rows affected (0.05 sec)
创建主从账号(在三台节点上都需要执行):
mysql> GRANT RELOAD, SUPER, REPLICATION SLAVE ON*.* TO 'repl'@'192.168.222.%' IDENTIFIED BY 'repl_1234';
Query OK, 0 rows affected (0.09 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)
在主库上添加VIP
ip addr add 192.168.222.139/24 dev ens33 # 其中 192.168.2222.139为VIP ens33为网卡名
二、MHA部署
2.1 在所有节点上安装MHA node
1.在MySQL服务器上安装MHA node所需的perl模块(DBD:mysql)
yum install perl-DBD-MySQL -y
2.在所有的节点上安装MHA node
下载地址:https://pan.baidu.com/s/15zzwcgvUXjzJXYxorVO_Cg
提取码:1314
[root@Node_Master ~]# yum -y install perl-DBD-MySQL //先安装所需的perl模块
[root@Node_Master ~]# tar -zvxf mha4mysql-node-0.56.tar.gz
[root@Node_Master ~]# cd mha4mysql-node-0.56
[root@Node_Master mha4mysql-node-0.56]# perl Makefile.PL
这一步可能报错如下:(两个错误分别操作)
1)Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5......
2)Can't locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5....
解决办法:
[root@Node_Master mha4mysql-node-0.56]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
[root@Node_Master mha4mysql-node-0.56]# yum install -y perl-CPAN
然后:
[root@Node_Master mha4mysql-node-0.56]# make && make install
2.2 在manager节点(192.168.222.143)上安装MHA Manager(注意manager节点也要安装MHA node)
1.首先下载第三方yum源
[root@Manager_Slave ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
2.安装perl的mysql包:
[root@Manager_Slave ~]# yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles perl-Time-HiRes -y
3.安装MHA Manager软件包:
mha4mysql-manager-0.56-0.el7.centos.noarch.rpm
[root@Manager_Slave ~]# tar -vxf mha4mysql-manager-0.56.tar
[root@Manager_Slave ~]# cd mha4mysql-manager-0.56
[root@Manager_Slave mha4mysql-manager-0.56]# perl Makefile.PL
[root@Manager_Slave mha4mysql-manager-0.56]# make && make install
安装完MHA Manager后,在/usr/local/bin目录下会生成以下脚本:
[root@Manager_Slave mha4mysql-manager-0.56]# ll /usr/local/bin/
总用量 84
-r-xr-xr-x. 1 root root 16367 10月 15 21:37 apply_diff_relay_logs
-r-xr-xr-x. 1 root root 4807 10月 15 21:37 filter_mysqlbinlog
-r-xr-xr-x. 1 root root 1995 10月 15 22:23 masterha_check_repl
-r-xr-xr-x. 1 root root 1779 10月 15 22:23 masterha_check_ssh
-r-xr-xr-x. 1 root root 1865 10月 15 22:23 masterha_check_status
-r-xr-xr-x. 1 root root 3201 10月 15 22:23 masterha_conf_host
-r-xr-xr-x. 1 root root 2517 10月 15 22:23 masterha_manager
-r-xr-xr-x. 1 root root 2165 10月 15 22:23 masterha_master_monitor
-r-xr-xr-x. 1 root root 2373 10月 15 22:23 masterha_master_switch
-r-xr-xr-x. 1 root root 5171 10月 15 22:23 masterha_secondary_check
-r-xr-xr-x. 1 root root 1739 10月 15 22:23 masterha_stop
-r-xr-xr-x. 1 root root 8261 10月 15 21:37 purge_relay_logs
-r-xr-xr-x. 1 root root 7525 10月 15 21:37 save_binary_logs
解释:
masterha_check_repl 检查MySQL复制状况
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_status 检测当前MHA运行状态
masterha_conf_host 添加或删除配置的server信息
masterha_manager 启动MHA
masterha_stop 停止MHA
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_secondary_check 多种线路检测master是否存活
2.3 在管理节点(192.168.222.143)上进行下面配置
[root@Manager_Slave mha4mysql-manager-0.56]# mkdir -p /etc/masterha
[root@Manager_Slave mha4mysql-manager-0.56]# cp samples/conf/app1.cnf /etc/masterha/
[root@Manager_Slave mha4mysql-manager-0.56]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1 //设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log //设置manager的日志
ssh_user=root //ssh免密钥登录的帐号名
repl_user=repl //mysql复制帐号,用来在主从机之间同步二进制日志等
repl_password=repl_1234 //设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1 //设置监控主库,发送ping包的时间间隔,用来检查master是否正常,默认是3秒,尝试三次没有回应的时候自动进行railover
master_ip_failover_script= /usr/local/bin/master_ip_failover //设置自动failover时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change //设置手动切换时候的切换脚本
[server1]
hostname=182.48.115.236
port=3306
master_binlog_dir=/data/mysql/data/ //设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
[server2]
hostname=182.48.115.237
port=3306
candidate_master=1 //设置为候选master,即master机宕掉后,优先启用这台作为新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
master_binlog_dir=/data/mysql/data/
[server3]
hostname=182.48.115.238
port=3306
#candidate_master=1
master_binlog_dir=/data/mysql/data/
注意:
1.在编辑该文件时,后面的注释切记要去掉,MHA并不会将后面的内容识别为注释。
2.配置文件中设置了master_ip_failover_script,secondary_check_script,master_ip_online_change_script,report_script,对应的文件见文章末尾。
2.4 设置relay log的清除方式(在两台slave节点上)
[root@Node_Slave ~]# mysql -p(密码) -e 'set global relay_log_purge=0'
[root@Manager_Slave ~]# mysql -p(密码) -e 'set global relay_log_purge=0'
温馨提示:
MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)
注意:
MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,再执行SET GLOBAL relay_log_purge=0。
下面看看脚本的使用方法:
# purge_relay_logs --user=monitor --password=monitor123 -disable_relay_log_purge --workdir=/tmp/
pure_relay_logs脚本参数如下所示:
2020-10-15 22:27:46: purge_relay_logs script started.
Found relay_log.info: /var/lib/mysql/relay-log.info
Opening /var/lib/mysql/mysqld-relay-bin.000001 ..
Opening /var/lib/mysql/mysqld-relay-bin.000002 ..
Opening /var/lib/mysql/mysqld-relay-bin.000003 ..
Opening /var/lib/mysql/mysqld-relay-bin.000004 ..
Opening /var/lib/mysql/mysqld-relay-bin.000005 ..
Opening /var/lib/mysql/mysqld-relay-bin.000006 ..
Executing SET GLOBAL relay_log_purge=1; FLUSH LOGS; sleeping a few seconds so that SQL thread can delete older relay log files (if i
t keeps up); SET GLOBAL relay_log_purge=0; .. ok.2020-10-15 22:27:50: All relay log purging operations succeeded.
其中,参数解释如下:
--user mysql 用户名
--password mysql 密码
--port 端口号
--workdir 指定创建relay log的硬链接的位置,默认是/var/tmp,由于系统不同分区创建硬链接文件会失败,故需要执行硬链接具体位置,成功执行脚本后,硬链接的中继日志文件被删除
--disable_relay_log_purge 默认情况下,如果relay_log_purge=1,脚本会什么都不清理,自动退出,通过设定这个参数,当relay_log_purge=1的情况下会将relay_log_purge设置为0。清理relay log之后,最后将参数设置为OFF。
2.41 设置定期清理relay脚本(在两台slave节点上操作)
MHA在切换的过程中会直接调用mysqlbinlog命令,故需要在环境变量中指定mysqlbinlog的具体路径。
[root@Node_Slave ~]# vim /root/purge_relay_log.sh
#!/bin/bash
user=root
passwd=123456
port=3306
host=localhost
log_dir='/data/masterha/log'
work_dir='/data'
purge='/usr/local/bin/purge_relay_logs'
if [ ! -d $log_dir ]
then
mkdir $log_dir -p
fi
$purge --user=$user --host=$host --password=$passwd --disable_relay_log_purge --port=$port --workdir=$work_dir >> $log_dir/purge_relay_logs.log 2>&1
注意:最好是每台slave服务器在不同时间点执行该计划任务。
[root@Node_Slave ~]# chmod 755 /root/purge_relay_log.sh
添加到crontab定期执行
[root@Node_Slave ~]# crontab -e
purge_relay_logs脚本删除中继日志不会阻塞SQL线程。下面手动执行看看什么情况。
[root@Node_Slave ~]# /usr/local/bin/purge_relay_logs --user=root --host=localhost --password=123456 --disable_relay_log_purge --port=3306 --workdir=/data
[root@Node_Slave ~]# ll /data/masterha/log/
三、SSH配置的检查
检查MHA Manger到所有MHA Node的SSH连接状态:
[root@Manager_Slave ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
四、使用MHA工具检查repl(集群)环境
通过masterha_check_repl脚本查看整个mysql集群的复制状态
[root@Manager_Slave ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
错误1:通过root用户远程连接节点的mysql不通
解决办法:在三个节点机器上的mysql上授权,允许192.168.222.%的机器通过root用户无密码登陆,即:
mysql> update mysql.user set password=password("") where user="root" and host="192.168.222.%"; //如果没有这个权限,就grant命令创建这个用户权限
mysql> flush privileges;
mysql> select user,host,password from mysql.user;
然后再次通过masterha_check_repl脚本查看整个mysql集群的复制状态
[root@Manager_Slave ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
Bareword “FIXME_xxx” not allowed while “strict subs” in use at /usr/local/bin/master_ip_failover line 93.
然后发现还是错误,原来Failover两种方式:一种是虚拟IP地址,一种是全局配置文件。MHA并没有限定使用哪一种方式,而是让用户自己选择,虚拟IP地址的方式会牵扯到其它的软件,比如keepalive软件,而且还要修改脚本master_ip_failover。
解决办法如下:
添加软连接(所有节点):
[root@Manager_Slave ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
[root@Manager_Slave ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
先暂时注释掉管理节点的/etc/masterha/app1.cnf文件中的master_ip_failover_script= /usr/local/bin/master_ip_failover这个选项。后面引入keepalived后和修改该脚本以后再开启该选项。
[root@Manager_Slave ~]# cat /etc/masterha/app1.cnf
.........
#master_ip_failover_script= /usr/local/bin/master_ip_failover
最后用下面的命令检查状态,是成功的:
[root@Manager_Slave ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
五、检查MHA Manager的状态
[root@Manager_Slave ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
如果正常,会显示“PING_OK”,否则会显示“NOT_RUNNING”,代表MHA监控还没有开启。
六、开启MHA Manager监控
使用下面命令放在后台执行启动
[root@Manager_Slave ~]# 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 Manager监控是否正常:
[root@Manager_Slave ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
可以成功监控主库
查看启动日志:
[root@Manager_Slave ~]# tail -n20 /var/log/masterha/app1/manager.log
七、关闭MHA Manager监控
[root@Manager_Slave ~]# masterha_stop --conf=/etc/masterha/app1.cnf
查看MHA Manager监控
[root@Manager_Slave ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
八、VIP的配置
VIP配置可以采用两种方式,一是通过引入Keepalived来管理VIP,另一种是在脚本中手动管理。
对于keepalived管理VIP,存在脑裂情况,即当主从网络出现问题时,slave会抢占VIP,这样会导致主从数据库都持有VIP,造成IP冲突,所以在网络不是很好的情况下,不建议采用keepalived服务。
在实际生产中使用较多的也是第二种,即在脚本中手动管理VIP。
第一种方式:通过keepalive的方式管理vip
1.下载软件进行并进行安装(在两台master上都要安装,准确的说一台是master(192.168.222.139);另外一台是备选主库192.168.222.142)
[root@Node_Master ~]# yum install -y openssl-devel
[root@Node_Master ~]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@Node_Master ~]# tar -zvxf keepalived-1.3.5.tar.gz
[root@Node_Master ~]# cd keepalived-1.3.5
[root@Node_Master keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
[root@Node_Master keepalived-1.3.5]# make && make install
[root@Node_Master keepalived-1.3.5]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@Node_Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@Node_Master keepalived-1.3.5]# mkdir /etc/keepalived
[root@Node_Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Node_Master keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
2.keepalived配置
------------在master上配置(192.168.222.139节点上的配置)------------
[root@Node_Master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@Node_Master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
wangshibo@huanqiu.cn
}
notification_email_from ops@huanqiu.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-HA
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 150
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.222.144
}
}
其中router_id MySQL HA表示设定keepalived组的名称,将192.168.222.144这个虚拟ip绑定到该主机的eth1网卡上,并且设置了状态为backup模式,将keepalived的模式设置为非抢占模式(nopreempt),priority 150表示设置的优先级为150。
------------在备选库上配置(192.168.222.142)节点上的配置
[root@Node_Slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
wangshibo@huanqiu.cn
}
notification_email_from ops@huanqiu.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-HA
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 120
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.222.144
}
}
3.启动keepalived服务
在master上启动并查看日志:
[root@Node_Master ~]# /etc/init.d/keepalived start
[root@Node_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:5f:58:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.222.139/27 brd 192.168.222.255 scope global eth0
inet 192.168.222.144/32 scope global eth0
inet6 fe80::5054:ff:fe5f:58dc/64 scope link
valid_lft forever preferred_lft forever
[root@Node_Master ~]# tail -100 /var/log/messages
可以发现VIP资源成功绑定在192.168.222.139上面了
在candicate master上启动:
[root@Node_Slave ~]# /etc/init.d/keepalived start
[root@Node_Slave ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:1b:6e:53 brd ff:ff:ff:ff:ff:ff
inet 192.168.222.142//27 brd 192.168.222.255/ scope global eth0
inet6 fe80::5054:ff:fe1b:6e53/64 scope link
valid_lft forever preferred_lft forever
4.MHA引入keepalived(MySQL服务进程挂掉时通过MHA 停止keepalived)
要想把keepalived服务引入MHA,只需要修改切换时触发的脚本文件master_ip_failover即可,在该脚本中添加在master发生宕机时对keepalived的处理。相对于原文件,修改地方为93-95行。
[root@Manager_Slave ~]# vim /usr/local/bin/master_ip_failover
#!/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.222.144';
my $ssh_start_vip = "/etc/init.d/keepalived start";
my $ssh_stop_vip = "/etc/init.d/keepalived stop";
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";
#`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
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";
现在已经修改这个脚本了,现在打开在上面提到过的参数,再检查集群状态,看是否会报错
[root@Manager_Slave ~]# grep 'master_ip_failover_script' /etc/masterha/app1.cnf
[root@Manager_Slave ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
第二种方式:通过脚本的方式管理VIP
这里是修改/usr/local/bin/master_ip_failover,修改完成后内容如下。还需要手动在master服务器上绑定一个vip
1.现在master节点上绑定vip
[root@Master_node ~]# ifconfig eth0:0 192.168.222.144/27
[root@Master_node ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:5F:58:DC
inet addr:192.168.222.139 Bcast:192.168.222.255.255 Mask:255.255.255.224
inet6 addr: fe80::5054:ff:fe5f:58dc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25505 errors:0 dropped:0 overruns:0 frame:0
TX packets:3358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3254957 (3.1 MiB) TX bytes:482420 (471.1 KiB)
eth0:0 Link encap:Ethernet HWaddr 52:54:00:5F:58:DC
inet addr:192.168.222.144 Bcast:192.168.222.255 Mask:255.255.255.224
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
2.manager节点修改/usr/local/bin/master_ip_failover
[root@Manager_Slave ~]# cat /usr/local/bin/master_ip_failover
#!/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.222.144/27';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$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";
注意要将/etc/masterha/app1.cnf文件中的master_ip_failover_script注释打开
博主参考了诸位大佬的博客,和《深入浅出MySQL》 ,整理出了MHA的部署方案。希望能给大家有一个参考作用。
个人博客地址:www.save1314.vip