MHA工作原理

  主库挂了,但是主库的binlog都被全部从库接收,此时会选中应用binlog最全的一台从库作为新的主库,其他从主只需要重新指定一下主库即可(因为此时,所有从库都是一致的,所以只需要重新指定一下从库即可)。

  主库挂了,所有的binlog都已经被从库接收了,但是,主库上有几条记录还没有sync到binlog中,所以从库也没有接收到这个event,如果此时做切换,会丢失这个event。此时,如果主库还可以通过ssh访问到,binlog文件可以查看,那么先copy该event到所有的从库上,最后再切换主库。如果使用半同步复制,可以极大的减少此类风险。

  主库挂了,从库上有部分从库没有接收到所有的events,选择出最新的slave,从中拷贝其他从所缺少的events。

问题1、

  如何确定哪些event没有成功接收。

问题2、

  如何让所有从库保持一致。

导致复制问题的原因是因为MySQL采用异步复制,并不保证所有事件被从库接收,对于此类问题的解决方案:

1、Heartbeat + DRBD

  代价:额外的被动master,并且不处理任何流量。

  性能:为了保证事件被及时写入,innodb_flush_log_at_trx_commit=1,sync_binlog=1. 这样就会导致性能急速下降。

2、MySQL Cluster

  真正的高可用,但是只支持InnoDB。

3、Semi_synchronous Replication (5.5+)

  半同步复制极大减少了"binlog事件只存在于master上"的风险。保证至少有一台从库接收到了提交的binlog事件。其他的从可能没有接收,但是不影响提交了。

4、Global Transaction ID

  由谷歌开发的插件。

MHA的切换步骤

1、从down的主上面获取到binlog事件。

2、确定最新(最全)的从库。

3、分别应用不同的relay log事件到其他从库。

4、应用从主库上获取的binlog事件(发生故障时的事件)。

5、提升一个从库为新的主库(此时从库已经一致)。

6、将其他从库的主库重新指定,同时,自动检测主库故障。

如何确定最近从库以及丢失的events

1、Master_Log_File,Read_Master_Log_Pos 可以确定(从库的IO线程)读取主库的binlog的最新进度。

2、Relay_Log_File,Relay_Log_Pos 确定SQL线程执行本地Relay_Log的最新进度。

3、由于Relay_Log的进度和binlog是不一样的。所以如果只看Relay_Log的信息无法确定执行事件的实际位置,Relay_Master_Log_File,Exec_Master_Log_Pos 本地SQL线程实际上执行binlog位置(用于计算seconds_behind_master)。

4、各个从库之间,比较Master_Log_File,Read_Master_Log_Pos可以确定哪台从库接收到的日志是最完整的。

5、当找出最新最全的从库之后,应用diff到其他从库。

  仅仅比较上面2个参数是不够确定具体缺失的events,在relay log中日志开头会指定是读哪个binlog,文尾的end_log_pos表示最后读到binlog的位置。通过对比不同从库上,最新的relay_log中的binlog file和end_log_pos位置来对比还有哪些events缺失(每个at xxx就是一个event)。如果是一个很大的事务,产生了很多日志信息(事务只会保存在一个binlog文件中,但是会出现在2个relay_log中。)面对这种情形,如果只接受到了部分的events信息。从库是不会重做这些relay_log。此时的Master_Log_File,Read_Master_Log_Pos 会指向读取到的binlog的最新位置(这是IO线程负责的),而Relay_Master_Log_File,Exec_Master_Log_Pos只会指向最后执行的commit事务。这样就保证了不会使数据库进入不一致状态。那么在接受到其他从库最新日志的时候,也是完整的执行一次该事务(即使自己的Relay log已经有部分记录了)。

MHA需要考虑的注意事项

1、如果使用mysqlbinlog打开binlog和relaylog,会自动在文本里面添加rollback关键字所以要在日志中清理掉由mysqlbinlog添加的rollback。

  ROLLBACK /* added by mysqlbinlog */

2、由于mha默认关闭relay_log_purge。所以要手动定期清理。为了保证在发生故障时,能有足够多的relay log用户恢复,所以不应该自动清理。关闭这个参数之后,SQL线程不会定期清理Relay_log,所以很快会填满磁盘空间。Relay_log没有像binlog一样有自动过期参数expire_logs_days。

定期清理的方式:

  set global relay_log_purge=1;

  flush logs;/* SQL线程会自动清理多余的Relay_Log_File */

  set global relay_log_purge=0;

  如果有较大的日志,让SQL线程自动删,会导致SQL线程锁住,从库落后主库。

  ln relay-log.* /tmp/archive_dir/

  mysql -e"set global relay_log_purge=1;flush logs;set global relay_log_purge=0;"

  rm -rf /tmp/archive_dir/*   */

  这样就不会占用宝贵的SQL线程了。即便如此也不要在所有的从库上同一时间执行一个计划任务(清除Relay_Log),否则会导致没有Relay_Log用户恢复的情形出现。

3、要确定SQL线程是否执行完所有的events。

  (1)、等待事物执行。

  (2)、select MASTER_POS_WAIT(master_log_file,read_master_log_pos);如果所有从库已经与主库一致了,上面的命令失效,如果只有部分事物日志传送到从库,SQL线程也不会同步到Read_Master_Log_Pos。

  (3)、show processlist查看输出。提示:"Has read all relay log;waiting for the slave I/O thread to update it"

  (4)、要处理恶意查询,恶意查询:insert into t1 values(0,0,"ROLLBACK");

  (5)、有多个从库时,并行恢复。

  (6)、采用ROW FORMAT,对于采用row格式记录的日志,可能出现多个"#at"条目+相同的"end_log_pos"条目。Table_map+Write_rows+STMT_END

故障自动转移的内容

1、检测master failure。

2、Node Fencing(通过干掉故障master 避免脑裂)。

3、更新写入IP(VIP)。

通过脚本完成自动转移,同时在故障发生时要自动调用脚本。

  (1)、确保文件和对应的目录存在,SSH互信成功----避免因为低级错误导致转移失败。

  (2)、如果有从库服务器挂掉,或者SQL线程挂掉,或者在8个小时内发生过转移了----都不再执行故障转移。

如果发生故障:发送邮件报警,停掉新主库上的备份任务,更新内部工具的管理地址(从旧库指向新库)。

MHA工具介绍

在manager上

  master_monitor:检测master状态。

  master_switch:执行故障转移(手动执行,如果自动则要使用masterha_manager)。

  masterha_manager:启动mha,执行mha的管理操作。

在node上

  save_binary_logs:复制主库二进制日志。

  apply_diff_relay_logs:从最全的slave上生成diff Relay log,应用所有从主库copy来的的binlog中的events。

  filter_mysqlbinlog:清理掉有mysqlbinlog工具带来的ROLLBACK events。

  purge_relay_logs:在不停止SQL线程的前提下删除Relay_log。

MHA处理案例

master上内核崩溃,10内检查master状态,确定master不可用之后power off,选择新的master,recovery,并行恢复其他从库。

MHA的限制

不支持多级复制 M->M->S。且不支持日志为statment级别(SBR)的load data infile和MySQL5.0以前的版本。

MHA原理的更多相关文章

  1. MySQL高可用架构之MHA 原理与实践

    MHA简介 关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到mas ...

  2. MySQL高可用方案--MHA原理

    简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是日 ...

  3. MHA原理及搭建

    MYSQL5.7下搭建MHA 环境说明 在主机1,主机2,主机3上安装MySQL服务端和客户端. 主机1 主机2 主机3 操作系统 CentOS7.4 CentOS7.4 CentOS7.4 主机名 ...

  4. 数据库MHA原理

    一.数据库的高可用MHA (1):详细的步骤 1.master mysql宕机了,MHA manager :无法连接master 2.MHA在S1 S2找一个延迟最小的slave,确定为未来的mast ...

  5. MySQL MHA工作原理

    MHA工作组件 MHA(Master High Availability)是一种MySQL高可用解决方案,由日本DeNA公司开发,主要用于在故障切换和主从提升时进行快速切换,并最大程度保证数据一致性. ...

  6. mysql高可用研究(一) 主从+MHA架构 (转)

    最近在研究mysql的高可用架构,自己想总结下常用的高可用方案都有哪些.有哪些优缺点以及应用的场景?搞得是头昏脑涨,天昏地暗,看了诸多资料,每次都觉得公说公有理婆说婆有理.其实嘛,大家说的都有一定的道 ...

  7. MySQL--MHA原理

    ##==============================================================##MHA(Master High Availability)是一种My ...

  8. MySQL入门篇(五)之高可用架构MHA

    一.MHA原理 1.简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Faceb ...

  9. 029:高可用之MHA

    高可用之MHA 一.MHA 简介 MHA(Master High Availability)是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能 ...

随机推荐

  1. VMware workstation安装Windows Server 2012 R2步骤详解(附下载链接)

    话不多说,直接上链接.所需工具: 1.VMware workstation 14.0(版本无所谓)                   附链接:https://pan.baidu.com/s/1CrH ...

  2. Java入门第二季学习总结

    课程总概 该门课程作为java入门学习的第二季,是在有一定的java基础上进行的进一步学习.由于该季涉及到了java的一些核心内容,所以相对第一季来说,课程难度有所提升.大致可将该季的课程分为五部分: ...

  3. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...

  4. selenium开发-C#/java/Python

    背景:之前由于自己有编写CefSharp.WinForms 窗体版以及 接口化 WCF+CefSharp.WinForms的网站版本,但是由于某些原因,延伸出Selenium学习与研究 总结:sele ...

  5. django channels

    django channels django channels 是django支持websocket的一个模块. 1. 安装 `pip3 install channels` 2. 快速上手 2.1 在 ...

  6. Python 3.8.0 正式版发布,新特性初体验 全面介绍

    Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...

  7. 简易计算器-leetcode

    今天,开始在leetcode上面开始做题,第一个题目是: Implement a basic calculator to evaluate a simple expression string. Th ...

  8. Python验证数据的抽样分布类型

    假如要对一份统计数据进行分析,一般其来源来自于社会调研/普查,所以数据不是总体而是一定程度的抽样.对于抽样数据的分析,就可以结合上篇统计量及其抽样分布的内容,判断数据符合哪种分布.使用已知分布特性,可 ...

  9. X86逆向2:提取按钮通杀特征码

    本章我们将学习特征码的提取与定位,特征码是软件中一段固定的具有标志性的代码片段,特征码的用途非常广泛,最常见的就是杀毒软件的查杀了,查杀就是根据特征码定位技术实现的,再比如木马的免杀也是修改了特征码的 ...

  10. DVWA reCAPTCHA key: Missing

    修改dvwa文件夹下文件config.inc.php change: $_DVWA[ 'recaptcha_public_key' ] = ' '; $_DVWA[ 'recaptcha_privat ...