一、故障切换的过程

当master_manager监控到主库mysqld服务停止后,首先对主库进行SSH登录检查(save_binary_logs -command=test),然后对mysqld服务进行健康检查(PING(SELECT)每个3秒检查一次,持续3次),最后作出Master is down!的判断,master failover开始

第1步:先根据配置文件检测当前的复制环境中有哪些服务器,MHA也会校验诸如复制异常以及是否存在一些从库有不同的主库,启动failover(排除上次failover失败或者failover时间间隔太短)

第2步:隔离master server,把故障主库的VIP停掉(前提是你需要指定相关的脚本,比如:如果有master_ip_failover_script则会调用脚本停掉VIP、如果有shutdown_script脚本则调用脚本关闭master避免脑裂,在安装包的samples/scriptes目录下)

第3步:选举新主库并尽量补全新主库的数据。

3.1 获取同步位置最靠前的从库:对比所有从库的master_log_file和read_master_log_pos位置找出执行位置最新和最旧的从库对应的故障主库的binlog位置。

3.2保存dead master的binlog:在故障主库上执行save_binary_logs命令获得lastest slave同步位置与master间的binlog差异(使用3.1步骤找到的同步最靠前的从库binlog位置,如果故障主库系统没挂的情况下)并scp到monitor server上。

3.3 确定新的主库:先使用命令apply_diff_relay_logs --command=find把前面3.1步骤中找出的同步位置最靠前和最靠后的对应主库的binlog位置作为参数,在同步位置最靠前的从库上执行这个命令在其中继日志中找出两个binlog位置之间的relay log并生成文件用于恢复其他从库(这里就是检查同步最靠前的从库是否有从最老的位置开始的中继日志,这也是为什么MHA环境中执行过的中继日志不能删除的原因,否则这个对比就比较麻烦)。

接着寻找及决定新的主库,根据配置选择如何提升新主库(检查是否有设置candidate_master=1和no_master=1,如果有设置候选主库,那么候选主库中标,但候选库不一定就是有最新数据的slave,所以需要跟其他从库进行比较,当然如果候选主库恰好是同步位置最靠前的从库,就不需要跟其他从库进行relay log比较了;如果没有设置候选主库,那么同步位置最靠前的从库中标)。monitor server也会将之前复制的差异binlog复制到新主库上。

3.4 新的主库应用日志(如果有任何错误从这个阶段会发生,需要手动恢复):新的主库首选需要对比master_log_file=relay_master_log_file,read_master_log_pos=exec_master_log_pos确认自己已经执行完成复制,如果新的主库不是同步位置最靠前的从库,那么需要使用apply_diff_relay_logs --command=generate_and_send命令比较自己和同步位置最靠前的从库之间的relay log是否存在差异,如果存在则需要生成一个差异relay log(如果新主库就是同步位置最靠前的从库,那么只需要执行monitor server发过来的差异日志即可),然后使用这两个差异日志进行恢复数据(apply_diff_relay_logs --command=apply命令)。恢复完成后获取binlog位置并生成change master语句准备用于其他从库change master到新的主库上,并设置read_only=0。然后把VIP绑定到新的主库上。到这步骤新的主库切换完成。

第4步:其他从库恢复:将其他从库数据尽量补全(所有从库并行执行)。

4.1 并行使用apply_diff_relay_logs --command=generate_and_send命令判断各个从库的relay log位置和同步位置最靠前的从库之间的relay log差异,并把差异文件从同步位置最靠前的从库上发送到对应的各个从库上。

4.2 并行使用两个差异日志进行恢复:将monitor server上的binlog差异拷贝到各个从库上,然后各个从库通过master_log_file=relay_master_log_file,read_master_log_pos=exec_master_log_pos先确认自己已经执行完成复制,再应用两个差异日志恢复数据。最后,执行reset slave,并重新CHANG MASTER到新主库上。

第5步:新主库执行reset slave操作清除之前slave信息,到这里故障主库切换到新主库完成。

注意:如果中途有意外发生会终止failover操作,并产生mha_manager.failover.error的文件,下一次必须要删除该文件才能正常failover,New Master延时超过30s或者binglog差100M时不会Auto Failover。

二、在线手动切换过程

第1步:配置检测:根据配置文件检测主从关系以及确定有哪些存活的服务器,然后在master上执行FLUSH NO_WRITE_TO_BINLOG TABLES命令关闭打开的表。再检查从库到主库的复制是否正常。并根据配置决定新的主库。

第2步:执行FLUSH TABLES WITH READ LOCK锁住所有的表阻塞主库的写操作。等待其他从库复制追赶上主库。这里建议部署master_ip_online_change_script 脚本,该脚本会自动阻塞以及kill原master session,置原master为只读,停掉VIP(获取旧主库的binlog位置,使用master_log_wait()函数追赶主库)。同步完成之后,获取新主库的binlog位置,生成change master语句准备用于其他从库切换到新主库。

第3步:所有其他从库并行切换主库到新主库。使用第二步骤获取的旧主库的binlog位置,所有其他从库使用master_log_wait()函数追赶主库。然后使用change master切换到新的主库上。

第4步:旧主库unlock tables,并change master到新的主库上。

第5步:新的主库reset slave,绑定VIP在新的主库上。

注:本文为根据MHA切换输出日志整理,个人理解如有错误,还望指正!

MHA故障切换和在线手工切换原理的更多相关文章

  1. MHA故障切换方案

    mha故障切换当master 挂掉后会自动切换到slave01上去,可以看 tailf /var/mha_log/manager.log4个问题:1,切换后且原master01mysql服务启动OK, ...

  2. 【Cocos2d-x 3.x】 场景切换生命周期、背景音乐播放和场景切换原理与源码分析

    大部分游戏里有很多个场景,场景之间需要切换,有时候切换的时候会进行背景音乐的播放和停止,因此对这块内容进行了总结. 场景切换生命周期 场景切换用到的函数: bool Setting::init() { ...

  3. leaflet-webpack 入门开发系列二加载不同在线地图切换显示(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  4. AbstractRoutingDataSource 实现动态数据源切换原理简单分析

    AbstractRoutingDataSource 实现动态数据源切换原理简单分析 写在前面,项目中用到了动态数据源切换,记录一下其运行机制. 代码展示 下面列出一些关键代码,后续分析会用到 数据配置 ...

  5. Android的Handler线程切换原理

    Handler是我们在开发中经常会接触到的类,因为在Android中,子线程一般是不能更新UI的. 所以我们会使用Handler切换到主线程来更新UI,那Handler是如何做到实现不同线程之间的切换 ...

  6. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  7. EventBus 线程切换原理

    主要问题其实只有两个,其一:如何判断当前发送事件的线程是否是主线程:其二:如何在接收事件时指定线程并执行: 一个一个来看. 1.如何判断是否在主线程发送 EventBus在初始化的时候会初始化一个Ma ...

  8. SharePoint2013与SharePoint2016语言切换原理以及如何使用代码进行语言切换

    1.前言 在SharePoint 2010版本,在首页面直接"选择显示语言"的菜单(如下图所示),如下图 : 在sharepoint2013和sharepoint2016并非如此. ...

  9. 虚IP切换原理

    高可用性HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性.HA系统是目前企业防止核心计算机系统因故 ...

随机推荐

  1. 允许asp.net MVC报 错说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。错误消息 401.2。: 未经授权

    运行mvc3程序报以下错误 详细报错如下: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未 ...

  2. Mybatis缓存处理机制

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  3. python学习道路(day6note)(time &datetime,random,shutil,shelve,xml处理,configparser,hashlib,logging模块,re正则表达式)

    1.tiim模块,因为方法较多我就写在code里面了,后面有注释 #!/usr/bin/env python #_*_coding:utf-8_*_ print("time".ce ...

  4. 【转】 NGUI 监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类

    http://blog.csdn.net/icefantasylcj/article/details/49450555 大家好,我是雨中祈雨.一直以来,CSDN都是我最好的编程助手.这是我在CSDN的 ...

  5. 数字和为sum的方法数

    [编程题] 数字和为sum的方法数 给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数. 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案. 输入描 ...

  6. maven---install报错

    若maven项目在install或者run的时候出现莫名奇妙的问题,应该考虑是否在pom.xml中引入的包是否为最新的包: 因为在本地maven仓库中已经存在的包就不会再下载,所以可以从这方面排查问题 ...

  7. php面试题

    1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) <?php date_default_timezone_set('Asia/shanghai'); echo d ...

  8. java.lang.IllegalArgumentException: Result Maps collection does not contain value for java.lang.Integer

    今天做springmvc+mybatis+spring的项目的时候发现了一个异常.如下: org.apache.ibatis.builder.IncompleteElementException: C ...

  9. 16C554(8250)驱动分析

    参考: http://www.cnblogs.com/zym0805/p/4815041.html 一. 硬件数据手册 The ST16C554D is a universal asynchronou ...

  10. Spark&Hive:如何使用scala开发spark访问hive作业,如何使用yarn resourcemanager。

    背景: 接到任务,需要在一个一天数据量在460亿条记录的hive表中,筛选出某些host为特定的值时才解析该条记录的http_content中的经纬度: 解析规则譬如: 需要解析host: api.m ...