一、故障切换的过程

当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切换输出日志整理,个人理解如有错误,还望指正!

作者:xiaoboluo

出处:xiaoboluo的博客 http://www.cnblogs.com/xiaoboluo768/

感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

转载于:https://blog.51cto.com/arthur376/1812358

MHA故障切换和在线手工切换原理相关推荐

  1. freertos内核 任务定义与切换 原理分析

    freertos内核 任务定义与切换 原理分析 主程序 任务控制块 任务创建函数 任务栈初始化 就绪列表 调度器 总结任务切换 主程序 这个程序目的就是,使用freertos让两个任务不断切换.看两个 ...

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

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

  3. 《Linux内核分析》(二)——从一个简单Linux内核分析进程切换原理

    转载:https://blog.csdn.net/FIELDOFFIER/article/details/44280717 <Linux内核分析>MOOC课程http://mooc.stu ...

  4. vue动态切换css文件_vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件we ...

  5. 在C语言中实现协程库(一)----------协程切换原理详解

    从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释. 感兴趣的小伙伴欢迎一起参与 代码地址 协程切换原理 使用glibc中<ucontext.h&g ...

  6. Redis集群配置(手工切换主Redis,哨兵自动切换主Redis)

    1.单机节点弊端 单点故障 容量有限 连接压力 2.集群模型 说明: AKF X:全量,镜像,横向扩容 Y:业务,功能,根据业务纵向扩容 Z:优先级,逻辑再拆分,纵向的集群根据一定规则再次划分 3.集 ...

  7. html5页面图片切换,HTML5单页面手势滑屏切换原理

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

  8. SQL手工注入原理万能密码及默认密码登陆后台

    SQL手工注入原理: 下面就是比较笨的方法了==    一个一个试 (* ̄rǒ ̄) 针对于.asp后缀网 + ?id_  在后面加入下面代码,返回正确那就是无注入点,反正就是有注入点 一.什么是SQL ...

  9. SQL手工注入原理(含环境搭建) ─=≡Σ(((つ•̀ω•́)つ 知己知彼百战百胜 web安全

    文章目录 SQL测试环境环境搭建 下载与安装环境 开启与使用环境 sqli-labs环境部署 dvwa环境部署 SQL手动注入 SQL注入原理 SQL注入分类 SQL注入手段 寻找注点 利用注点 ge ...

最新文章

  1. Spring 面试问题 TOP 50,你会哪些?
  2. MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引(二)
  3. python 对axis的理解
  4. Java并发教程–锁定:内在锁
  5. Bootstrap 2.2.2 发布,重要的 Bug 修复版本
  6. android 点赞飘心,点赞飘心动画组件FlyHeartView
  7. C# 获取鼠标屏幕坐标有误差,鼠标定位误差问题,Windows10 C#获取鼠标坐标不准 的解决方法
  8. 不删除其他盘的文件情况下扩充C盘空间
  9. java声卡录音_win10下程序无法录音或使用麦克风
  10. A*算法最合理的数据结构
  11. 【四二学堂】标准GPS坐标,转换成百度坐标
  12. 定制海报、AI扣人像小程序
  13. 海尔简爱s11装Linux,海尔简爱S11值得买吗 海尔简爱S11全面深度评测详解
  14. jquery实现截取pc图片_Cropper.js 实现裁剪图片并上传(PC端)
  15. 高效构建基于Python的商品评论文本挖掘网页APP
  16. PGM学习之七 MRF,马尔科夫随机场
  17. Spring aop开发步骤
  18. 全球最大电音音乐节Tomorrowland | FTX Europe将与电子音乐节Tomorrowland合作
  19. 宏观经济学_宏观经济指标
  20. HCIA(5)动态路由实验

热门文章

  1. 供销合作社对话中国农民丰收节交易会 谋定为农服务主业
  2. Spring MVC的框架组件
  3. 转:MFC中创建多线程
  4. ajax传值到ashx接收反序列
  5. 转 一个SMD 0805的LED的电流,电压,亮度关系表
  6. ubuntu11.10+git+svn works
  7. 设计模式学习(六)结构型模式初步了解
  8. 词汇量贫乏只会说yes、no?试试这些高级感替代词!
  9. “乘客迟到5分钟,滴滴司机无责取消订单”是一个好策略吗?
  10. 和君:建设你的知识结构书单