zoukankan      html  css  js  c++  java
  • MySQL高可用方案--MHA原理

    简介

    MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是日本的一位
    MySQL专家采用Perl语言编写的一个脚本管理工具,该工具仅适用于MySQLReplication(二层)环境,目的在于维持Master主库的高可用性。是一套优秀的作为MySQL高可用性
    环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上
    保证数据的一致性,以达到真正意义上的高可用。

    MHA是自动的master故障转移和Slave提升的软件包.它是基于标准的MySQL复制(异步/半同步).该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
    1)MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Manager会定时探测集群中的node节点,当发现master
    出现故障的时候,它可以自动将具有最新数据的slave提升为新的master,然后将所有其它的slave导向新的master上.整个故障转移过程对应用程序是透明的。
    2)MHA Node运行在每台MySQL服务器上,它通过监控具备解析和清理logs功能的脚本来加快故障转移的。

    在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,
    MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5或者以后的版本的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave
    已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。

    目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至
    少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。

    工作架构

    展示了如何通过MHA Manager管理多组主从复制。可以将MHA工作原理总结为如下:

    具体的工作流程如下:

    相较于其它HA软件,MHA的目的在于维持MySQL Replication中Master库的高可用性,其最大特点是可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致,
    然后从中选择一个充当新的Master,并将其它Slave指向它。工作流程主要如下:
    1)从宕机崩溃的master保存二进制日志事件(binlog events);
    2)识别含有最新更新的slave;
    3)应用差异的中继日志(relay log)到其他的slave;
    4)应用从master保存的二进制日志事件(binlog events);
    5)提升一个slave为新的master;
    6)使其他的slave连接新的master进行复制;

    工作原理

    当master出现故障时,通过对比slave之间I/O线程读取master binlog的位置,选取最接近的slave做为latest slave。其它slave通过与latest slave对比生成差异中继日志。
    在latest slave上应用从master保存的binlog,同时将latest slave提升为master。最后在其它slave上应用相应的差异中继日志并开始从新的master开始复制。

    在MHA实现Master故障切换过程中,MHA Node会试图访问故障的master(通过SSH),如果可以访问(不是硬件故障,比如InnoDB数据文件损坏等),会保存二进制文件,以最大程度
    保证数据不丢失。MHA和半同步复制一起使用会大大降低数据丢失的危险。

    优势

    1)故障切换快
    在主从复制集群中,只要从库在复制上没有延迟,MHA通常可以在数秒内实现故障切换。9-10秒内检查到master故障,可以选择在7-10秒关闭master以避免出现裂脑,几秒钟内,
    将差异中继日志(relay log)应用到新的master上,因此总的宕机时间通常为10-30秒。恢复新的master后,MHA并行的恢复其余的slave。即使在有数万台slave,也不会
    影响master的恢复时间。

    DeNA在超过150个MySQL(主要5.0/5.1版本)主从环境下使用了MHA。当mater故障后,MHA在4秒内就完成了故障切换。在传统的主动/被动集群解决方案中,4秒内完成故障切换是不可能的。

    2)master故障不会导致数据不一致
    当目前的master出现故障时,MHA自动识别slave之间中继日志(relay log)的不同,并应用到所有的slave中。这样所有的salve能够保持同步,只要所有的slave处于存活
    状态。和Semi-Synchronous Replication一起使用,(几乎)可以保证没有数据丢失。

    3)无需修改当前的MySQL设置
    MHA的设计的重要原则之一就是尽可能地简单易用。MHA工作在传统的MySQL版本5.0和之后版本的主从复制环境中。和其它高可用解决方法比,MHA并不需要改变MySQL的部署环境。
    MHA适用于异步和半同步的主从复制。

    启动/停止/升级/降级/安装/卸载MHA不需要改变(包扩启动/停止)MySQL复制。当需要升级MHA到新的版本,不需要停止MySQL,仅仅替换到新版本的MHA,然后重启MHA Manager
    就好了。

    MHA运行在MySQL 5.0开始的原生版本上。一些其它的MySQL高可用解决方案需要特定的版本(比如MySQL集群、带全局事务ID的MySQL等等),但并不仅仅为了master的高可用才迁移应用的。在大多数情况下,已经部署了比较旧MySQL应用,并且不想仅仅为了实现Master的高可用,花太多的时间迁移到不同的存储引擎或更新的前沿发行版。MHA工作的包括5.0/5.1/5.5的原生版本的MySQL上,所以并不需要迁移。

    4)无需增加大量的服务器
    MHA由MHA Manager和MHA Node组成。MHA Node运行在需要故障切换/恢复的MySQL服务器上,因此并不需要额外增加服务器。MHA Manager运行在特定的服务器上,因此需要
    增加一台(实现高可用需要2台),但是MHA Manager可以监控大量(甚至上百台)单独的master,因此,并不需要增加大量的服务器。即使在一台slave上运行MHA Manager也是
    可以的。综上,实现MHA并没用额外增加大量的服务。

    5)无性能下降
    MHA适用与异步或半同步的MySQL复制。监控master时,MHA仅仅是每隔几秒(默认是3秒)发送一个ping包,并不发送重查询。可以得到像原生MySQL复制一样快的性能。

    6)适用于任何存储引擎
    MHA可以运行在只要MySQL复制运行的存储引擎上,并不仅限制于InnoDB,即使在不易迁移的传统的MyISAM引擎环境,一样可以使用MHA。

    软件架构

    MHA软件的架构:由两部分组成,Manager工具包和Node工具包
    Manager工具包主要包括以下几个工具:
    masterha_check_ssh      检查MHA的SSH配置状态
    masterha_check_repl     检查MySQL复制的状态
    masterha_check_status   检查MHA当前的运行状态
    masterha_manger         启动MHA
    masterha_master_monitor 检测master是否宕机
    masterha_master_switch  控制故障转移(手动或者自动)
    masterha_conf_host      添加或者删除配置的server信息

    Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
    save_binary_logs        保存和复制master的二进制日志
    apply_diff_relay_logs   识别差异的中继日志事件并将其差异的事件应用于其他的slave服务器
    filter_mysqlbinlog      去除不必要的ROLLBACK事件(MHA已经不在使用这个工具了)
    purge_relay_logs        清除中继日志(不会阻塞SQL线程)

    MHA如何保持数据的一致性呢?主要通过MHA node的以下几个工具实现,但是这些工具由mha manager触发:
    save_binary_logs        如果master的二进制日志可以存取的话,保存复制master的二进制日志,最大程度保证数据不丢失
    apply_diff_relay_logs   相对于最新的slave,生成差异的中继日志并将所有差异事件应用到其他所有的slave

    注意:
    对比的是relay log,relay log越新就越接近于master,才能保证数据是最新的。
    purge_relay_logs        删除中继日志而不阻塞sql线程

    MHA环境部署

    更加精彩部署篇点击链接:https://www.cnblogs.com/brianzhu/p/10155053.html

  • 相关阅读:
    python学习日记——基本数据类型
    python学习日记——安装及初识
    STF平台探索
    fiddler基本操作梳理
    fly.js抛物线连续不断加入购物车
    判断是否存在某个字段hasOwnProperty
    vue中提示toFixed不是函数
    vue中父组件给子组件传值,子组件给父组件传值
    js判断用户的浏览器设备是移动端还是pc端
    css预处理器--sass学习($变量名)
  • 原文地址:https://www.cnblogs.com/brianzhu/p/10154708.html
Copyright © 2011-2022 走看看