* MHA的整个故障(离线)切换过程
- 检测主库的状态,确认是否崩溃。
- 确认服务崩溃,保存binlog,推送到主控机,并可以强制关闭主库避免脑裂。
- 找出数据最新的从库(也就是read_master_log_pos最大的),确定下新主库。
- 从最新从库上生成差异的relaylog,再加上未读取的binlog,应用到新主库,记下偏移。
- (并发)的为其他从库生成差异的relaylog和binlog,应用到各个从库。
- 从库指向新主库的偏移处,开始复制。

*  源码部分关键逻辑
** 读取配置
** 检查配置
- 检查apply_diff_relay_log的版本号
- 连接所有服务器并读取状态(得知老主库)
- 检查参数传进来的崩溃主库是否与老主库地址一致,否则终止切换
- 检查老主库是否在离线主机列表中,不在的话就终止切换
- 检查是否真的连接不上mysql服务
- 检查所有在线从库,是否都指向老主库
- 检查是否有些不该忽略失败的从库已经离线
- 检查上次切换是否失败
- 检查上次切换发生时间与本次切换的时间间隔,太短则终止
- 从所有从库获取“切换锁”
- 保证所有从库的slave sql线程已经启动
** 如果支持gtid自动定位但未启用,那么应该强制apply_diff_relay_log禁用log_bin??
** 强制关闭
- (并发)强制停止所有从库的slave io线程
- 探测从主控机到崩溃主库所在主机的ssh可达性
- 执行master_ip_failover_script,保证崩溃主库所在主机的ip失活防脑裂,否则终止切换
- 只要有一个在线从库的salve io线程停止失败,那么就终止切换 ** 探测出复制延迟最小的从库、复制延迟最大的从库
** 根据最新从库的slave io线程的读头,保存老主库的binlog。
- 如果崩溃主库所在主机不可达,那么就会丢失binlog(Read_Master_Log_Pos to the tail)
- 如果可达,ssh连接上去,然后执行save_binary_logs --command=save,将保存后的binlog拷贝到主控机,这步称呼read_to_tail。
** 根据最新、最老从库的读头以及某些从库的可忽略失败,来决定哪个从库作为relaylog、binlog补偿的基准
- 如果所有从库的读头一致,跳过
- ssh逐一连接最新从库,执行apply_diff_relay_logs --command=find,看是否realylog包含了最老从库的读头。
- 如果没有用来补偿的基准从库,终止切换
** 选择新主库(新主库不一定是最新从库,参照“在线切换”中的描述)
** 恢复新主库
- 若果新主库的读头落后于最新从库,那么ssh连接上最新从库,执行apply_diff_relay_logs --command=generate_and_send,
从最新从库的relaylog中提取新主库读头直到最新从库读头处的二进制日志,这步称呼为read_to_latest,
$latest_slave->{Master_Log_File}:$latest_slave->{Read_Master_Log_Pos}
- 将主控机保存好的最新从库读头到主库binlog尾部的日志(read_to_tail),拷贝到新主库
- 如果不是最新从库或者有保存过read_to_tail,那么就应用差异日志。
-- 首先等待新主库上已经有的relaylog都重放完毕,停止slave sql线程
-- 读取最新复制状态
-- ssh执行save_binary_logs --command=save, 从自身relaylog中恢复exec_to_read
-- ssh执行apply_diff_relay_logs --command=apply,将前面生成的3部分补偿日志全部导入。
- 执行主控机上的master_ip_failover --command=start脚本,激活新主库的ip。
- 关闭新主库的只读,开启可写模式。
** 恢复所有从库(类似单独恢复主库的过程)
- (并发)中继补偿,生成read_to_latest
- (并发)将早生成的read_to_tail部分,拷贝到各个从库,应用差异日志,指向新主库,启动复制
- 新主库执行reset slave * MHA(在线)主库切换过程
sudo /usr/bin/masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.cnf --new_master_host=192.168.128.130 --new_master_port=3309 --orig_mast\
er_is_new_slave ** 识别老主库。
- 读取配置MHA配置文件; - 连接并读取所有的数据库服务状态;
- (并发)连接所有从库,看mysql服务是否在运行,如果机器都宕机了,那就终止本次切换。
- 遍历每台从库,获取所有能获取的信息,比如:msyql服务版本号、是否开启了gtid、是否开启了log-bin、
是否只读、复制相关系统变量和状态变量。
- 统计服务器信息:离线服务器、在线服务器、在线从库、失败从库等。
- 比较所有从库的mysql服务版本,找出最老和最新的版本。
- 验证当前真正的主库是谁?
- 统计在线服务器中的“非从库”(not_slave)标记,只能为1,否则终止本次切换过程。
- 根据从库的指向来找出存在哪些主库(支持3层复制结构(主-从-从的从))。
真正的主库必须是在“线并且可写”,如果没有一台主库可写或者存在两台可写,那么终止切换。
- 判断本次切换是否支持gtid。 - 检查所有在线从库上是否有复制账户并有相应的REPLICATION SLAVE权限;
- 必要时在老主库上进行flush tables操作;
- 从老主库获取“监视锁”;
- 从所有从库获取“切换锁”;
- 检查所有在线从库的复制健康状况;
- 读取当前的复制状态;
- 判断是否有问题(IO、SQL线程是否在运行,数据延迟多久) ** 识别新主库。
- 识别数据最新的从库;
- 比较master_log_file:read_master_log_pos。
- 选择新主库;
- 识别优先从库,在线的并带有candidate_master标记。
- 识别应该忽略的从库,带有no_master标记、或者未开启log_bin、或者mysql服务版本不是最老、与最新从库相比数据延迟比较大。
- 选择优先级依次为:优先列表、最新从库列表、所有从库列表,但一定要排除忽略列表。
- 检查新老主库的复制过滤规则是否一致;
- Binlog_Do_DB、Binlog_Ignore_DB、Replicate_Do_Table等。 ** 拒绝更新,防止脑裂。
- 调用master_ip_online_change脚本,stop子命令。新主库上,设置为只读;
老主库上,禁止会话级别的log_bin、优雅等待所有sql线程退出、设置为只读、
- 必要时,在老主库,锁住所有表,并检查binlog是否已经停止前进。
binlog停止前进后,记下偏移位置。 ** 重新读取所有在线从库的运行状态。 ** 新主库从老主库应用完所有的事件日志。
- 新主库上,执行master_pos_wait,然后记下新主库binlog的file:pos。
- 调用master_ip_online_change脚本,start。新主库上,设置为只读。 ** (并发)从库应用完老主库所有的事件日志并指向新主库。
- master_pos_wait
- change_master_and_start_slave

高可用mysql之MHA源码剖析的更多相关文章

  1. 高可用mysql之MHA的原理

    MHA 如何工作的? MHA是如何工作的? ============================================================================== ...

  2. 分布式架构高可用架构篇_06_MySQL源码编译安装(CentOS-6.7+MySQL-5.6)

    redhat: 下载:http://dev.mysql.com/downloads/mysql/ 选择5.6 source包 解压 cmake . -DCMAKE_INSTALL_PREFIX=/us ...

  3. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

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

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

  5. MySQL高可用集群MHA方案

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

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

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

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

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

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

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

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

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

随机推荐

  1. 为Ubuntu的root设置密码

    问题描述:当安装好Ubuntu系统的时候,root用户没有密码,需要设置. 解决方法:

  2. 用普通计算机假设基于liunx系统的NAS部署FineReport决策系统

    何为NAS? 简单说就是连接在网络上,具备资料存储功能的装置因此也称为“网络存储器”.它是一种专用数据存储服务器.他以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽.提高性能.降低 ...

  3. Java Web中的中文编码

    Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...

  4. D3D三层Texture纹理经像素着色器实现渲染YUV420P

    简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...

  5. 实现数据库的跨库join

    功能需求 首先要理解原始需求是什么,为什么要跨库join.举个简单的例子,在日志数据库log_db有一份充值记录表pay_log,里面的用户信息只有一个userid:而用户的详细信息放在主库main_ ...

  6. JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

    前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己 ...

  7. C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP

    本代码的编译环境为MAC,系统版本为10.11.6: #include <string.h> #include <netdb.h> #include <stdio.h&g ...

  8. PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)

    今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...

  9. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  10. 【poj2096】 Collecting Bugs

    http://poj.org/problem?id=2096 (题目链接) 题意 有一个程序,其中有s个子结构,每个子结构出bug的概率相等.bug总共分成n类,每种bug出现的概率相等.每天找出一个 ...