4-1-1 MHA 架构介绍和原理

最后更新于:2022-04-02 07:43:48

原文出处:http://www.cnblogs.com/gomysql/p/3675429.html 本人在原文基础上增加了一些自己的认知 #### 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的组成 MHA软件由两部分组成,Manager工具包和Node工具包,具体如下。 1. 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_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的测试,写入远程的内存(一台从库的反馈)比写入本地的磁盘(写入并刷新)要更快。使用半同步复制相比主在主库上进行强持久化的性能有两倍的改善。
';