Mysql 的高可用之 MHA
MHA作为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,另外一台充当从库,因为至少需要三台服务器。
MHA工作原理:
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log) 到其他slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新master;
(6)使用其他的slave连接新的master进行复制。
MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
Manager工具包主要包括以下几个工具:
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
Node工具包主要包括以下几个工具:
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
配置环境,高可用要在主从复制基础前提下实现
实验:
Monitor host and master server1 192.168.122.11
Candicate master server2 192.168.122.12
Slave server3 192.168.122.13
首先确保主从复制
查看slave状态时发现,IO线程为NO;
如下解决:
重启master库:/etc/init.d/mysqld restart
mysql> show master status;
关闭slave,mysql> slave stop;
mysql> change master to master_log_file='binlog.000004',master_log_pos=154;
如下,已经OK!
继续实验:
主上授权 mysql> grant replication slave on *.* to cara@'192.168.122.%' identified by 'LH=liuhuan123';
两从 mysql> change master to master_host='192.168.122.11',master_user='cara',master_password='LH=liuhuan123',master_log_file='mysql-bin.000003',master_log_pos=1401;
最好禁掉密码插件(server2,3同理)
[root@server1 ~]# vim /etc/init.d/mysqld
一、进行环境配置
在master上进行授权
修改配置文件my.cnf
master(server1)
slave(server2)
slave (server3)
查看状态
二、安装 MHA 及相关配置
1)Server1 安装
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
perl-Email-Date-Format-1.002-5.el6.noarch.rpm
perl-Log-Dispatch-2.27-1.el6.noarch.rpm
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
perl-MIME-Lite-3.027-2.el6.noarch.rpm
perl-MIME-Types-1.28-2.el6.noarch.rpm
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
Server2,3 安装
mha4mysql-node-0.56-0.el6.noarch.rpm
2).编辑配置文件
将配置文件拷贝到指定目录下
修改配置文件
[server default]
user=root
password=LH=liuhuan123
ssh_user=root
repl_password=LH=liuhuan123
repl_user=repl
master_binlog_dir=/var/lib/mysql
remote_workdir=/tmp
ping_interval=1
#master_ip_failover_script=/script/masterha/master_ip_failover
#shutdown_script=/script/masterha/power_manager
#report_script=/script/masterha/send_report
#master_ip_online_change_script=/script/masterha/master_ip_online_change
#secondary_check_script=masterha_secondary_check -s remote_host1 -s
remote_host2
manager_workdir=/usr/local/masterha/
manager_log=/usr/local/masterha/manager.log
[server1]
hostname=192.168.122.11
[server2]
hostname=192.168.122.12
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.122.13
no_master=1
3).使 master 和 slave 相互之间可以无密码连接
[root@server1 masterha]# ssh-keygen -t rsa
[root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.11
[root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.12
[root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.13
[root@server2 ~]# ssh-keygen -t rsa
[root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.11
[root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.12
[root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.13
[root@server3 ~]# ssh-keygen -t rsa
[root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.11
[root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.12
[root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.13
ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh
, 和~/.ssh/authorized_keys
设置合适的权限。
三、测试及结果
[root@server1 masterha]# masterha_check_ssh --conf=/usr/local/masterha/app1.cnf
[root@server1 masterha]# masterha_check_repl --conf=/usr/local/masterha/app1.cnf
分析报错后发现时没有在master端给prel和root授权的缘故
mysql> grant replication slave on *.* to repl@'%' identified by 'LH=liuhuan123';
mysql> grant replication slave on *.* to root@'%' identified by 'LH=liuhuan123';
建立授权用户
授权后,可远程登录
mysql> grant all on *.* to root@'%' identified by 'LH=liuhuan123';
测试,master是否切换
[root@server1 masterha]# nohup masterha_manager --conf=/usr/local/masterha/app1.cnf & 在管理主机启动管理程序
[root@server1 masterha]# pkill -9 mysqld 杀掉master端的进程
在server2和server3上查看
server2已经继承master
server3上看到master状态已经变为server2
手动切换:当master端数据库关掉后可用下面手动方法切换
masterha_master_switch --master_state=dead --conf=/usr/local/masterha/app1.cnf --dead_master_host=192.168.122.12 --dead_master_port=3306 --new_master_host=192.168.122.11 --new_master_port=3306 --ignore_last_failover
手动热切换:可以在master正常工作时使其数据库关掉,让备用mastre机接替其工作
masterha_master_switch --conf=/usr/local/masterha/app1.cnf --master_state=alive --new_master_host=192.168.122.12 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
当把master切换到备用master上时,若再次想切回master,需要手动将备master和slave上做change master
备用master上:
查看日志 [root@server2 ~]# cat /var/log/mysqld.log
slave端:
网上查找得如下:
不带MASTER_LOG_FILE,MASTER_LOG_POS参数,执行change master 语句,按照mysql官方文档的说法,执行语句后的复制点应该与之前的复制点一致
测试: 停掉备用主机的io,然后在master主机加入数据,造成备用master和master主机二进制数据不一致,然后关掉master主机的mysql,执行manager命令,使备用master成为master,看数据是否会一致
change master to master_host='192.168.122.11', master_user='cara', master_password='LH=liuhuan123', master_auto_position=1; #使master指向server1(注意:每次执行需删除app1.failover.complete,否则出错)
1)stop slave io_thread; 停掉备用主机io线程(server2)
2)在主master主机插入数据(server1)
3)在另一台slave中查看数据是否同步过去(server3)
4)主master上,关掉mysql
5)使备用成为master后,查看数据是否根据差异日志恢复过来
slave端master已经改变
再切回master
server2上: 指定master_auto_position=1,不会遇到上面change master 时的错误;
server3上:
四、使用脚本控制master状态
将所需脚本移至指定目录
修改app1.cnf文件
vim master_ip_failover #给master添加虚拟ip
vim master_ip_online_change #同样只需添加虚拟ip
vim send_report #添加邮箱和密码
chmod +x send_report master_ip_failover master_ip_online_change #给脚本添加执行权限
在测试时需要虚拟机进行联网
在物理主机添加路由
[root@foundation12 MHA]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
在需要联网的虚拟机上添加网关,为物理机ip
[root@server1 masterha]# vim /etc/sysconfig/network-scripts/ifcfg-eth0或
[root@server1 masterha]#route add default gw 192.168.122.1
添加本地解析,使其可以上网
[root@server1 masterha]# vim /etc/resolv.conf
重启网络使其生效
[root@server1 masterha]# /etc/init.d/network restart
以上可以实现邮件报警!
[root@server1 masterha]# masterha_master_switch --conf=/usr/local/masterha/app1.cnf --master_state=alive --new_master_host=192.168.122.11 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000