转载至:
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,整个故障转移对应用程序完全透明的。
在MHA自动故障切换的过程中,MHA试图从宕掉的主服务器上保存二进制日志,最大程度保证数据的不丢失,但这并不总是可行的。
例如:如果主服务器硬件故障或无法通过SSH访问,MHA没有办法保存二进制日志,只能进行故障转移而丢失了最新数据。mysql服务挂了,但是可以从服务器拷贝二进制。但如果硬件宕机或者SSH不能连接,不能获取到最新阿binlog日志,如果复制出现延迟,会丢失数据。
使用MySQL5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以和半同步复制结合起来,如果只有一个Slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其它所有Slave服务器上,保持数据一致性。
最新版0.56版本,增加了支持GTID的功能,建议在MySQL5.6及之后版本使用。MySQL5.5建议使用管理节点版本0.55,数据节点0.54
适用场景
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,另一个台充当从库。出于成本考虑,淘宝在此基础上进行了改造,目前淘宝开发的TMHA已经支持一主一从。
MHA工作原理
1.从宕机崩溃的Master保存二进制日志事件(binlog event)。
2.识别含有最新更新的Slave.
3.应用差异的中继日志(relay log)到其它Slave.
4.应用从Master保存的二进制日志事件
5.提升一个Slave为新的Master
6.使其它的Slave连接新的Master进行复制
MHA的组成:
- 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信息
2.Node工具包(通常由MHA Manager的脚本触发,无需人工操作)情况如下:
- save_binary_log:保存和复制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的测试,写入远程的内存(一台从库的反馈)比写入本地的磁盘(写入并刷新)要更快,使用半同步复制相比在主库上进行强持久化的性能有两倍的改善.