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,另外一台充当从库,因为至少需要三台服务器。

Mysql 的高可用之 MHA


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;

Mysql 的高可用之 MHA


如下解决:

重启master库:/etc/init.d/mysqld restart

mysql> show master status;

Mysql 的高可用之 MHA

关闭slave,mysql> slave stop;

mysql> change master to master_log_file='binlog.000004',master_log_pos=154;

如下,已经OK!

Mysql 的高可用之 MHA



继续实验:


主上授权  mysql> grant replication slave on *.* to [email protected]'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同理)

[[email protected] ~]# vim /etc/init.d/mysqld

Mysql 的高可用之 MHA


一、进行环境配置


在master上进行授权

Mysql 的高可用之 MHA


修改配置文件my.cnf

master(server1)

Mysql 的高可用之 MHA

slave(server2)

Mysql 的高可用之 MHA

slave (server3)

Mysql 的高可用之 MHA

查看状态

Mysql 的高可用之 MHA


二、安装 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).编辑配置文件

将配置文件拷贝到指定目录下

Mysql 的高可用之 MHA


修改配置文件


Mysql 的高可用之 MHA


[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 相互之间可以无密码连接

[[email protected] masterha]# ssh-****** -t rsa
[[email protected] masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[[email protected] masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[[email protected] masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[[email protected] ~]# ssh-****** -t rsa
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[[email protected] ~]# ssh-****** -t rsa
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]


ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。


三、测试及结果


[[email protected] masterha]# masterha_check_ssh --conf=/usr/local/masterha/app1.cnf

Mysql 的高可用之 MHA


Mysql 的高可用之 MHA



[[email protected] masterha]# masterha_check_repl --conf=/usr/local/masterha/app1.cnf

Mysql 的高可用之 MHA

Mysql 的高可用之 MHA


分析报错后发现时没有在master端给prelroot授权的缘故


mysql> grant replication slave on *.* to [email protected]'%' identified by 'LH=liuhuan123';

mysql> grant replication slave on *.* to [email protected]'%' identified by 'LH=liuhuan123';

Mysql 的高可用之 MHA


Mysql 的高可用之 MHA


建立授权用户

授权后,可远程登录


mysql> grant all on *.* to [email protected]'%' identified by 'LH=liuhuan123';

Mysql 的高可用之 MHA

Mysql 的高可用之 MHA


Mysql 的高可用之 MHA


测试,master是否切换

[[email protected] masterha]# nohup masterha_manager --conf=/usr/local/masterha/app1.cnf &  在管理主机启动管理程序


Mysql 的高可用之 MHA

[[email protected] masterha]# pkill -9 mysqld    杀掉master端的进程

在server2和server3上查看

server2已经继承master


Mysql 的高可用之 MHA


server3上看到master状态已经变为server2


Mysql 的高可用之 MHA


手动切换:当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上:

Mysql 的高可用之 MHA

Mysql 的高可用之 MHA


查看日志 [[email protected] ~]# cat /var/log/mysqld.log 

Mysql 的高可用之 MHA


Mysql 的高可用之 MHA


Mysql 的高可用之 MHA


Mysql 的高可用之 MHA


slave端:

Mysql 的高可用之 MHA

网上查找得如下:

不带MASTER_LOG_FILE,MASTER_LOG_POS参数,执行change master 语句,按照mysql官方文档的说法,执行语句后的复制点应该与之前的复制点一致


Mysql 的高可用之 MHA



测试: 停掉备用主机的io,然后在master主机加入数据,造成备用mastermaster主机二进制数据不一致,然后关掉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)

Mysql 的高可用之 MHA

2)在主master主机插入数据(server1)

Mysql 的高可用之 MHA

3)在另一台slave中查看数据是否同步过去(server3)

Mysql 的高可用之 MHA


4)主master上,关掉mysql

Mysql 的高可用之 MHA


Mysql 的高可用之 MHA


5)使备用成为master后,查看数据是否根据差异日志恢复过来

Mysql 的高可用之 MHA


slave端master已经改变

Mysql 的高可用之 MHA


再切回master

Mysql 的高可用之 MHA

server2上:  指定master_auto_position=1,不会遇到上面change master 时的错误;
Mysql 的高可用之 MHA


server3上:

Mysql 的高可用之 MHA


四、使用脚本控制master状态


Mysql 的高可用之 MHA

将所需脚本移至指定目录

Mysql 的高可用之 MHA


修改app1.cnf文件

Mysql 的高可用之 MHA

Mysql 的高可用之 MHA

vim master_ip_failover  #master添加虚拟ip


Mysql 的高可用之 MHA


vim master_ip_online_change #同样只需添加虚拟ip

Mysql 的高可用之 MHA

vim send_report  #添加邮箱和密码

Mysql 的高可用之 MHA


chmod +x send_report master_ip_failover master_ip_online_change   #给脚本添加执行权限

在测试时需要虚拟机进行联网

在物理主机添加路由

[[email protected] MHA]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE

在需要联网的虚拟机上添加网关,为物理机ip

[[email protected] masterha]# vim /etc/sysconfig/network-scripts/ifcfg-eth0或

[[email protected] masterha]#route add default gw 192.168.122.1

添加本地解析,使其可以上网

[[email protected] masterha]# vim /etc/resolv.conf

Mysql 的高可用之 MHA

重启网络使其生效

[[email protected] masterha]# /etc/init.d/network restart 

Mysql 的高可用之 MHA


以上可以实现邮件报警!

[[email protected] 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


Mysql 的高可用之 MHA

Mysql 的高可用之 MHA

Mysql 的高可用之 MHA