http://www.chocolee.cn/archives/276


MHA介绍

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本人youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能最大程度上保证数据库的一致性,以达到真正意义上的高可用。

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当Master出现故障是,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的。

1.1存在隐患

在MHA自动故障切换的过程中,MHA试图从宕掉的主服务器上保存二进制日志,最大程度保证数据的不丢失,但这并不总是可行的。

例如,如果主服务器硬件故障或无法通过SSH访问,MHA没有办法保存二进制日志,只能进行故障转移而丢失了最新数据。

拓:MySQL服务挂了,但是可以从服务器拷贝二进制。但如果硬件宕机或者SSH不能连接,不能获取到最新的binlog日志,如果复制出现延迟,会丢失数据。

使用MySQL5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以和半同步复制结合起来。如果只有一个Slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有Slave服务器上,保持数据一致性。

最新版0.56版本,增加了支持GTID的功能,建议在MySQL5.6及之后版本使用。MySQL5.5建议使用管理节点版本0.55,数据节点0.54

1.2 适用场景

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,另一台充当从库。出于成本考虑,淘宝在此基础上进行了改造,目前淘宝开发的TMHA已经支持一主一从。

1.3 MHA工作原理

1.png

1. 从宕机崩溃的Master保存二进制日志事件(binlog event);

2. 识别含有最新更新的Slave;

3. 应用差异的中继日志(relay log)到其他Slave;

4. 应用从Master保存的二进制日志事件;

5. 提升一个Slave为新的Master;

6. 使其他的Slave连接新的Master进行复制;

1.4 MHA的组成

MHA软件由两部分组成,Manager工具包和Node工具包,具体如下。

Manager工具包情况如下:

masterha_check_ssh:检查MHA的SSH配置情况。

masterha_check_repl:检查MySQL复制状况。

masterha_manager:启动MHA。

masterha_check_status:检测当前MHA运行状态。

masterha_master_monitor:检测Master是否宕机。

masterha_master_switch:控制故障转移(自动或手动)。

masterha_conf_host:添加或删除配置的server信息。

 

Node工具包(通常由MHA Manager的脚本触发,无需人工操作)情况如下:

save_binary_logs:保存和复制Master的binlog日志。

apply_diff_relay_logs:识别差异的中级日志时间并将其应用到其他Slave。

filter_mysqlbinlog:去除不必要的ROOLBACK事件(已经废弃)

purge_relay_logs:清除中继日志(不阻塞SQL线程)

注:为了尽可能的减少因为主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置MySQL5.5半同步复制。如果对性能要求较高允许丢失一小部分数据可以不做半同步复制

拓展思想:为了保证数据一致性,MySQL复制中,常常会在Master上使用sync_binlog参数保证binlog持久化,保证数据一致性。但这种方式对磁盘I/O会造成10~20%的影响。但是还有另外一个思路,就是使用MySQL半同步复制来保证数据一致性,MySQL半同步复制是在从服务器的内存中处理数据并进行发聩,虽然也会造成性能影响,但是相对于对Master造成的磁盘I/O的影响来说,反而是个更好的方法。据《高性能MySQL》 第三版中10.9的测试,写入远程的内存(一台从库的反馈)比写入本地的磁盘(写入并刷新)要更快。使用半同步复制相比主在主库上进行强持久化的性能有两倍的改善。


2.1 软件部署表

lvs版本:ipvsadm-1.26

keepalived版本:keepalived-1.1.19

mysql版本:mysql-5.5.32

mha-manger版本:mha4mysql-manager-0.55-0.el6.noarch

mha-node版本:mha4mysql-node-0.54-0.el6.noarch



3.png 

4.png 

2.2架构实现原理

1. 读操作
1) LVS实现读操作的负载均衡;
2) Keepalived在上层管理LVS,并对两台从库进行健康检测(通过定义Check脚本)
3) 一台从库出现故障后,Keepalived将其剔除出负载均衡集群;
2. 写操作
1) 在Master上绑定写VIP(MHA启动后会通过脚本进行操作);
2) MHA监控Master状态,当Master出现故障后(宕机、复制暂停)时;
3) 通过Failover脚本,卸载Master上的WVIP;
4) 通过Failover脚本在Backup Master上绑定WVIP,提升其为主库;
5) 同步并应用差异日志,并将从库指向新主库;

问题:当MHA把Master切换到了Backup Master上后,LVS如何处理分发在Backup Master上的读操作?

解释:由于Keepalived会通过脚本定期监控Backup Master的状态,包括同步、SQL线程、I/O线程,所以当Backup Master升级为主库后,这些状态都将消失,Keepalived将自动将Backup Master剔除出负载均衡集群。