高可用mysql之MHA的原理
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的原理的更多相关文章
- 高可用mysql之MHA源码剖析
* MHA的整个故障(离线)切换过程 - 检测主库的状态,确认是否崩溃. - 确认服务崩溃,保存binlog,推送到主控机,并可以强制关闭主库避免脑裂. - 找出数据最新的从库(也就是read_mas ...
- mysql实现高可用架构之MHA
一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...
- MySQL系列:高可用架构之MHA
前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...
- (转)MySQL高可用架构之MHA
MySQL高可用架构之MHA 原文:http://www.cnblogs.com/gomysql/p/3675429.html 简介: MHA(Master High Availability)目前 ...
- MySQL高可用系列之MHA(二)
一.參数说明 MHA提供了一系列配置參数.深入理解每一个參数的详细含义,对优化配置.合理使用MHA非常重要.非常多高可用性也都是通过合理配置一些參数而实现的. MHA包含例如以下配置參数,分别说明例如 ...
- MySQL高可用集群MHA方案
MySQL高可用集群MHA方案 爱奇艺在用的数据库高可用方案 MHA 是目前比较成熟及流行的 MySQL 高可用解决方案,很多互联网公司正是直接使用或者基于 MHA 的架构进行改造实现 MySQL 的 ...
- mysql高可用架构之MHA,haproxy实现读写分离详解
MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理 权限的管理] 3.容灾 保证数据不丢失. 二.工作中MySQ ...
- centos 7 Atlas keepalived 实现高可用 MySQL 5.7 MHA环境读写分离
目录 简介 相关链接 环境准备 Atlas 环境 MySQL 集群环境 Atlas 安装 和 配置 为数据库的密码加密 修改配置文件 启动 Keepalived 安装配置 安装 master 配置 K ...
- 《高可用MySQL》1 – Windows环境下压缩版MySQL安装
近日在读O’REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容.Master-Slave这东西吧,在许多公司都是标配,开发中基本天 ...
随机推荐
- linux基本知识2
date:时间管理 linux时钟: 硬件时钟:hwclock -s:硬件时钟到系统时钟 -w:系统时钟到硬件时钟 系统时钟:date 如何查看是外部命令还是内部命令: type COMMAND ...
- 揭开C++类中虚表的“神秘面纱”
C++类中的虚表结构是C++对象模型中一个重要的知识点,这里咱们就来深入分析下虚表的在内存中的结构. C++一个类中有虚函数的话就会有一个虚表指针,其指向对应的虚表,一般一个类只会有一个虚表,每个虚表 ...
- IO操作工具类
package com.imooc.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
- javaWeb实现登录功能
1.三要素 (1) 入口 就是我们所在的页面 入口到处理的数据请求会出现乱码,用request.SetCharacterEncoding("UTF-8");来解决,仅仅是用用于Po ...
- LINUX操作系统VIM的安装和配置
VIM的安装 在命令行敲入"vi"后按"tab"键,可以看到目前系统中只安装了vi和vim.tiny. vim是从VI发展而来的一个文本编辑器,功能更强大. ...
- C#中两个Form窗口之间的传值(父->子)(子->父)
//首先定义两个Form,一个为Form1,一个为Form2,其中Form1作为父窗口,Form2作为子窗口 //1.父窗口传值给子窗口 //Form1中代码: public Form1() { In ...
- redis分片
本文是在window环境下测试 什么是分片 当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力,实现海量数据存储 那么当多个请求来取数据时,如何知道数据在哪个redis呢,redis有 ...
- Java jdbc访问sqlserver,oracle数据库
1.JDBC访问Oracle数据库 public class Jdbc_Oracle { // 静态代码块,只会执行一次,类似C#静态构造方法 static { try { // 加载数据库驱动一次 ...
- java中jqGrid时间戳格式转换
找到如下代码 if( !isNaN( date - 0 ) && String(format).toLowerCase() == "u") { //Unix tim ...
- 学习Struts2的第一个应用步骤
---恢复内容开始--- 一.在官网 http://struts.apache.org/下载struts-2.3.31-all 1. 打开struts-2.3.31-all,将struts-2.3. ...