• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > MHA故障切换和在线切换的代码解析

MHA故障切换和在线切换的代码解析

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了华为 mha al00,华为mha al00多少钱,nike x mha,华为手机mha al00,德国mha官网等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

MHA故障切换和在线切换的代码解析



前段时间我的同事沈龙星整理了一下MHA故障切换和在线切换的代码流程,在征得其同意后,在此转发。以下是正文

本文是以MySQL5.5为基础的,因此没有涉及到gtid相关内容。MHA的主从切换过程分为failover和rotate两种,前者适用于原Master down的情况,后者是在在线切换的情况下使用。下面分别讲解



failover的处理流程


  1. MHA::MasterFailover::main()
  2. ->do_master_failover
  3. Phase 1: Configuration Check Phase
  4. -> check_settings:
  5. check_node_version:查看MHA的版本信息
  6. connect_all_and_read_server_status:确认各个node的MySQL实例是否可以连接
  7. get_dead_servers/get_alive_servers/get_alive_slaves:double check各个node的死活状态
  8. start_sql_threads_if:查看Slave_SQL_Running是否为Yes,若不是则启动SQL thread

  9. Phase 2: Dead Master Shutdown Phase:对于我们来说,唯一的作用就是stop IO thread
  10. -> force_shutdown($dead_master):
  11. stop_io_thread:所有slave的IO thread stop掉(将stop掉master)
  12. force_shutdown_internal(实际上就是执行配置文件中的master_ip_failover_script/shutdown_script,若无则不执行):
  13. master_ip_failover_script:如果设置了VIP,则首先切换VIP
  14. shutdown_script:如果设置了shutdown脚本,则执行

  15. Phase 3: Master Recovery Phase
  16. -> Phase 3.1: Getting Latest Slaves Phase(取得latest slave)
  17. read_slave_status:取得各个slave的binlog file/position
  18. check_slave_status:调用"SHOW SLAVE STATUS"来取得slave的如下信息:
  19. Slave_IO_State, Master_Host,
  20. Master_Port, Master_User,
  21. Slave_IO_Running, Slave_SQL_Running,
  22. Master_Log_File, Read_Master_Log_Pos,
  23. Relay_Master_Log_File, Last_Errno,
  24. Last_Error, Exec_Master_Log_Pos,
  25. Relay_Log_File, Relay_Log_Pos,
  26. Seconds_Behind_Master, Retrieved_Gtid_Set,
  27. Executed_Gtid_Set, Auto_Position
  28. Replicate_Do_DB, Replicate_Ignore_DB, Replicate_Do_Table,
  29. Replicate_Ignore_Table, Replicate_Wild_Do_Table,
  30. Replicate_Wild_Ignore_Table
  31. identify_latest_slaves:
  32. 通过比较各个slave中的Master_Log_File/Read_Master_Log_Pos,来找到latest的slave
  33. identify_oldest_slaves:
  34. 通过比较各个slave中的Master_Log_File/Read_Master_Log_Pos,来找到oldest的slave

  35. -> Phase 3.2: Saving Dead Master's Binlog Phase:
  36. save_master_binlog:
  37. 如果dead master可以ssh连接,则走如下分支:
  38. save_master_binlog_internal:(使用node节点的save_binary_logs脚本在dead master上做拷贝)
  39. save_binary_logs --command=save --start_file=mysql-bin.000281 --start_pos=107 --binlog_dir=/opt/mysql/data/binlog --output_file=/opt/mha/log/saved_master_binlog_from_10.27.177.245_3306_20160108211857.binlog --handle_raw_binlog=1 --disable_log_bin=0 --manager_version=0.55
  40. generate_diff_binary_log:
  41. concat_all_binlogs_from:
  42. dump_binlog:就是将binlog文件dump到target文件中,用的就是binmode read
  43. dump_binlog_header_fde:从0读到position-1
  44. dump_binlog_from_pos:从position开始,dump binlog file到target file
  45. file_copy:
  46. 文件拷贝,是将上述生成的binlog文件拷贝到manage节点的manager_workdir目录下
  47. 如果dead master无法ssh登录,则master上未同步到slave的txn丢失

  48. -> Phase 3.3: Determining New Master Phase
  49. find_latest_base_slave:
  50. find_latest_base_slave_internal:
  51. pos_cmp( $oldest_mlf, $oldest_mlp, $latest_mlf, $latest_mlp )
  52. 判断latest/oldest slave的binlog位置是不是相同,若相同则不需要同步relay log
  53. apply_diff_relay_logs --command=find --latest
  54. 查看latest slave中是否有oldest缺少的relay log,若无则继续,否则failover失败
  55. 查找的方法很简单,就是逆序的读latest slave的relay log文件,一直找到file/position为止

  56. select_new_master:选出新的master节点
  57. If preferred node is specified, one of active preferred nodes will be new master.
  58. If the latest server behinds too much (i.e. stopping sql thread for online backups),
  59. we should not use it as a new master, we should fetch relay log there. Even though preferred
  60. master is configured, it does not become a master if it's far behind.
  61. get_candidate_masters:
  62. 就是配置文件中配置了candidate_master>0的节点
  63. get_bad_candidate_masters:
  64. # The following servers can not be master:
  65. # - dead servers
  66. # - Set no_master in conf files (i.e. DR servers)
  67. # - log_bin is disabled
  68. # - Major version is not the oldest
  69. # - too much replication delay(slave与master的binlog position差距大于100000000)
  70. Searching from candidate_master slaves which have received the latest relay log events
  71. if NOT FOUND:
  72. Searching from all candidate_master slaves
  73. if NOT FOUND:
  74. Searching from all slaves which have received the latest relay log events
  75. if NOT FOUND:
  76. Searching from all slaves

  77. -> Phase 3.4: New Master Diff Log Generation Phase
  78. recover_relay_logs:
  79. 判断new master是不是latest slave,若不是则使用apply_diff_relay_logs --命令生成差分log,
  80. 并发送到新new master
  81. recover_master_internal:
  82. 将3.2中生成的daed master上的binlog发送到new master

  83. -> Phase 3.5: Master Log Apply Phase
  84. recover_slave:
  85. apply_diff:
  86. 0. wait_until_relay_log_applied,等待new master将relaylog执行完
  87. 1. 判断Exec_Master_Log_Pos == Read_Master_Log_Pos,
  88. 如果不相等则使用save_binary_logs --command=save生成差分log
  89. 2. 调用apply_diff_relay_logs命令,让new master进行recover.其中:
  90. 2.1 recover的log分为三部分:
  91. exec_diff:Exec_Master_Log_Pos和Read_Master_Log_Pos的差分
  92. read_diff:new master与lastest slave的relay log的差分
  93. binlog_diff:lastest slave与daed master之间的binlog差分
  94. 实际上apply_diff_relay_logs就是调用mysqlbinlog command进行recover
  95. //如果设置了vip,则需要调用master_ip_failover_script进行vip的failover

  96. Phase 4: Slaves Recovery Phase
  97. -> Phase 4.1: Starting Parallel Slave Diff Log Generation Phase
  98. 生成Slave与New Slave之间的差异日志,并将该日志拷贝到各Slave的工作目录下。

  99. -> Phase 4.2: Starting Parallel Slave Log Apply Phase
  100. recover_slave:
  101. 对各个slave进行恢复,同Phase3.5
  102. change_master_and_start_slave:
  103. 通过CHANGE MASTER TO命令将这些Slave指向新的New Master,最后开始复制(start slave)

  104. Phase 5: New master cleanup phase
  105. reset_slave_on_new_master
  106. 清理New Master其实就是重置slave info,即取消原来的Slave信息。至此整个Master故障切换过程完成


rotate的处理过程

  1. MHA::MasterRotate::main()
    -> do_master_online_switch:
    Phase 1: Confi
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MHA故障切换和在线切换的代码解析

相关文章

  • 2017-05-26硅谷商城第二版3--分类模块,硅谷商城第二版3--
  • 2017-05-26Android开发必看-快速提高 Android 开发效率的 Web 工具,android必看
  • 2017-05-26Android 搜索 把软键盘上的回车键改为搜索
  • 2017-05-26手机影音2--软件架构分析,影音2--架构分析
  • 2017-07-23Android深入四大组件(一)应用程序启动过程
  • 2017-05-26Android基于监听的事件处理机制
  • 2017-05-26Android自定义控件系列案例【四】
  • 2017-05-26Ubuntu Android Studio 无法通过起动器开启,android起动器
  • 2017-05-26ImageLoader配合ImageSwitcher的使用,imageloader使用
  • 2017-05-26Android自动化构建之Ant多渠道打包实践分析(上)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 仿微信底部TAG完美渐变,tag渐变
    • Android Studio之代码提示快捷键冲突设置,androidstudio
    • 自动化运维之cobbler批量部署操作系统(一)
    • [Android]动态加载/热部署框架汇总,android框架
    • Android中Activity处理返回结果的实现方式,androidactivity
    • App单个页面的最佳文本框个数是多少个?,app文本框个数
    • Android Canvas之Path操作
    • 整理分享原生态mac AndroidStudio的快捷键,studio快速整理代码
    • svn环境搭建(不同目录、设置不同的权限)
    • android WebView控件显示网页,androidwebview

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有