MHA 如何工作的?

MHA是如何工作的?
=======================================================================================================================
* 参见 https://code.google.com/p/mysql-master-ha/wiki/HowMHAWorks
- 创始人的ppt文档描述设计的原理 http://www.slideshare.net/matsunobu/automated-master-failover
尽管排版不是特别吸引人,但是确实涵盖了内部设计笔记,不过可能不是最新的。 - 源码参见
https://github.com/yoshinorim/mha4mysql-manager/tree/master/lib/MHA perl写的操作binlog的接口
https://github.com/yoshinorim/mha4mysql-node/tree/master/lib/MHA
https://github.com/ovaistariq/mha-helper python封装的工具脚本,用来调用perl写的命令接口。 * 如何辨别从哪个偏移量开始进行中继日志补偿?!
很久之前,MHA的作者使用mysqlbinlog来识别中继日志的偏移,但现在不用了,自己解析那个二进制文件的事件头部
就行了,就可以辨别事件的起始偏移量。
不适用mysqlbinlog的原因有几个,最主要是因为mysqlbinlog总是打印出所有事件的所有内容,不仅仅只是打印出事件头部,
但我们仅仅需要的是去分析头部而已。因为必要的定位信息都在头部,包括事件类型、master id、事件长度、下一个事件的偏移量。
事件体我们并不关心,那么,使用mysqlbinlog不仅在读取二进制日志时增加了性能开销,也让我们需要格外警惕一些与日志中的关键字
“撞衫”的sql语句,比如end_log_pos\# at等等。
为了避免错误的识别起始偏移信息,mysqlbinlog加上--base64-output=always选项是有帮助的,但是这个选项只在mysql 5.1和mysql 5.5
中支持,5.0不支持,5.6中被移除了。而且这个选项说不定会漏掉某些事件。
上面的行不通的话,只能逆向来搜索了,rotate事件是个好的地标。 * 快速的中继日志定位
假定待恢复的目标从库中的master_log_file:pos是mysqld-bin.000001:504810023,最新从库中的io线程的读头在 mysqld-bin.000001:504810689,
而且最新的中继日志文件是mysqld-relay-bin.000001并且超过了500M。目标从库和最新从库的IO线程读头只相差几百个字节。如果MHA从中继日志
头部开始解析,那么故障切换的时间就太长了。
$latest_mlf = Master_Log_File on the latest slave
$target_mlf = Master_Log_File on the recovery target slave
$latest_rmlp = Read_Master_Log_Pos on the latest slave
$target_rmlp = Read_Master_Log_Pos on the recovery target slave
$offset = $latest_rmlp - $target_rmlp
$filesize = File size of the latest relay log file on the latest slave if ($latest_mlf eq $target_mlf) && ($filesize > $offset),那么MHA就可以决定下来,起始恢复点是最新从库的最新中继文件中的
($filesize - $offset)偏移处, * 如何为待恢复的目标从库生成relaylog补偿和binlog补偿
总的来说,分三段来完成补偿:
- 目标从库的exec_master_log_pos到目标从库的read_master_log_pos
由于中继日志中待回放的事件必须组成一个完整的事务,begin和commit之间的所有内容,如果主库宕机前从库并未收到完整的事务事件,
那么exec_master_log_pos < read_master_log_pos,他们之间只是事务的一部分,没得到重放执行。
- 目标从库的read_master_log_pos到最新从库的read_master_log_pos
目标从库的中继日志可能落后于最新从库。
- 最新从库的read_master_log_pos到崩溃主库的binlog结尾处 之前,MHA的作者是每段都采用mysqlbinlog输出的,这样会带来两个问题:
- 在每个binlog文件开始处和每次mysqlbinlog输出的结尾处都添加rollback语句。需要显式过滤。
- 如果row-based event刚好被割裂到两个文件中,那么mysqlbinlog的输出可能不正确。
现在,改为三段都是通过直接解析二进制文件的事件头部来定位和搜索,接着将三段组合成一个大的二进制文件,然后再交给
mysqlbinlog来输出,只输出一次,方便过滤rollback,也没有了割裂row event的问题。
  

  

高可用mysql之MHA的原理的更多相关文章

  1. 高可用mysql之MHA源码剖析

    * MHA的整个故障(离线)切换过程 - 检测主库的状态,确认是否崩溃. - 确认服务崩溃,保存binlog,推送到主控机,并可以强制关闭主库避免脑裂. - 找出数据最新的从库(也就是read_mas ...

  2. mysql实现高可用架构之MHA

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

  3. MySQL系列:高可用架构之MHA

    前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...

  4. (转)MySQL高可用架构之MHA

    MySQL高可用架构之MHA  原文:http://www.cnblogs.com/gomysql/p/3675429.html 简介: MHA(Master High Availability)目前 ...

  5. MySQL高可用系列之MHA(二)

    一.參数说明 MHA提供了一系列配置參数.深入理解每一个參数的详细含义,对优化配置.合理使用MHA非常重要.非常多高可用性也都是通过合理配置一些參数而实现的. MHA包含例如以下配置參数,分别说明例如 ...

  6. MySQL高可用集群MHA方案

    MySQL高可用集群MHA方案 爱奇艺在用的数据库高可用方案 MHA 是目前比较成熟及流行的 MySQL 高可用解决方案,很多互联网公司正是直接使用或者基于 MHA 的架构进行改造实现 MySQL 的 ...

  7. mysql高可用架构之MHA,haproxy实现读写分离详解

    MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理    权限的管理] 3.容灾       保证数据不丢失. 二.工作中MySQ ...

  8. centos 7 Atlas keepalived 实现高可用 MySQL 5.7 MHA环境读写分离

    目录 简介 相关链接 环境准备 Atlas 环境 MySQL 集群环境 Atlas 安装 和 配置 为数据库的密码加密 修改配置文件 启动 Keepalived 安装配置 安装 master 配置 K ...

  9. 《高可用MySQL》1 – Windows环境下压缩版MySQL安装

    近日在读O’REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容.Master-Slave这东西吧,在许多公司都是标配,开发中基本天 ...

随机推荐

  1. 基于pcDuino-V2的无线视频智能小车 - UBUNTU系统上的gtk编程

    详细的代码已经上传到git网站:https://github.com/qq2216691777/pcduino_smartcar

  2. 杂项之使用qq邮箱发送邮件

    杂项之使用qq邮箱发送邮件 本节内容 特殊设置 测试代码 1. 特殊设置 之前QQ邮箱直接可以通过smtp协议发送邮件,不需要进行一些特殊的设置,但是最近使用QQ邮箱测试的时候发现以前使用的办法无法奏 ...

  3. Java泛型及实践

    代码及说明: package com.zsm.crazyjava; import java.util.ArrayList; import java.util.Collection; import ja ...

  4. 细说 Form (表单)

    细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...

  5. CodeBlocks及LCM应用

    以下是在开发过程中遇到的一些细节点: 1)called after throwing an instance of std::bad_alloc 此问题是由于publish(data),当中data赋 ...

  6. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

  7. C# Webbrowser 常用方法及多线程调用

    设置控件的值 /// <summary> /// 根据ID,NAME双重判断并设置值 /// </summary> /// <param name="tagNa ...

  8. 【转】线程及同步的性能 - 线程池 / ThreadPoolExecutors / ForkJoinPool

    线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自 ...

  9. java中jqGrid时间戳格式转换

    找到如下代码 if( !isNaN( date - 0 ) && String(format).toLowerCase() == "u") { //Unix tim ...

  10. SSH框架的简单上传功能的实现

    1.创建项目. 2.导入开发包. 3.配置web.xml. 配置内容就是配置struct2的内容如下: <?xml version="1.0" encoding=" ...