MHA GTID based failover代码解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 作为以下文章的补充,说明MHA GTID based failover的处理流程。http://blog.chinaunix.net/uid-20726500-id-5700631.html MHA判断是GTID based failover需要满足下面3个条件(参考函数get_g...
作为以下文章的补充,说明MHA GTID based failover的处理流程。
http://blog.chinaunix.net/uid-20726500-id-5700631.html

MHA判断是GTID based failover需要满足下面3个条件(参考函数get_gtid_status)
所有节点gtid_mode=1
所有节点Executed_Gtid_Set不为空
至少一个节点Auto_Position=1


GTID based MHA故障切换

点击(此处)折叠或打开

  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.              
  10.         Phase 2: Dead Master Shutdown Phase:对于我们来说,唯一的作用就是stop IO thread
  11.             -> force_shutdown($dead_master)
  12.                 stop_io_thread:所有slave的IO thread stop掉(将stop掉master)
  13.                 force_shutdown_internal(实际上就是执行配置文件中的master_ip_failover_script/shutdown_script,若无则不执行)
  14.                     master_ip_failover_script:如果设置了VIP,则首先切换VIP
  15.                     shutdown_script:如果设置了shutdown脚本,则执行
  16.  
  17.         Phase 3: Master Recovery Phase
  18.             -> Phase 3.1: Getting Latest Slaves Phase(取得latest slave)
  19.                 read_slave_status:取得各个slave的binlog file/position
  20.                     check_slave_status:调用"SHOW SLAVE STATUS"来取得slave的如下信息:
  21.                          Slave_IO_State, Master_Host,
  22.                          Master_Port, Master_User,
  23.                          Slave_IO_Running, Slave_SQL_Running,
  24.                          Master_Log_File, Read_Master_Log_Pos,
  25.                          Relay_Master_Log_File, Last_Errno,
  26.                          Last_Error, Exec_Master_Log_Pos,
  27.                          Relay_Log_File, Relay_Log_Pos,
  28.                          Seconds_Behind_Master, Retrieved_Gtid_Set,
  29.                          Executed_Gtid_Set, Auto_Position
  30.                          Replicate_Do_DB, Replicate_Ignore_DB, Replicate_Do_Table,
  31.                          Replicate_Ignore_Table, Replicate_Wild_Do_Table,
  32.                          Replicate_Wild_Ignore_Table
  33.                 identify_latest_slaves:
  34.                     通过比较各个slave中的Master_Log_File/Read_Master_Log_Pos,来找到latest的slave
  35.                 identify_oldest_slaves:
  36.                     通过比较各个slave中的Master_Log_File/Read_Master_Log_Pos,来找到oldest的slave
  37.  
  38.             -> Phase 3.2: Determining New Master Phase
  39.                 get_most_advanced_latest_slave:找到(Relay_Master_Log_File,Exec_Master_Log_Pos)最靠前的Slave
  40.                      
  41.                 select_new_master:选出新的master节点
  42.                     If preferred node is specified, one of active preferred nodes will be new master.
  43.                     If the latest server behinds too much (i.e. stopping sql thread for online backups),
  44.                     we should not use it as a new master, we should fetch relay log there. Even though preferred
  45.                     master is configured, it does not become a master if it's far behind.
                        get_candidate_masters:
                            就是配置文件中配置了candidate_master>0的节点
                        get_bad_candidate_masters:
                            # The following servers can not be master:
                            # - dead servers
                            # - Set no_master in conf files (i.e. DR servers)
                            # - log_bin is disabled
                            # - Major version is not the oldest
                            # - too much replication delay(slave与master的binlog position差距大于100000000)
                        Searching from candidate_master slaves which have received the latest relay log events
                        if NOT FOUND:
                            Searching from all candidate_master slaves
                                if NOT FOUND:
                                    Searching from all slaves which have received the latest relay log events
                                        if NOT FOUND:
                                            Searching from all slaves
                                 
                -> Phase 3.3: Phase 3.3: New Master Recovery Phase
                    recover_master_gtid_internal:
                        wait_until_relay_log_applied
                        stop_slave
                        如果new master不是拥有最新relay的Slave
                            $latest_slave->wait_until_relay_log_applied:等待直到最新relay的Slave上Exec_Master_Log_Pos等于Read_Master_Log_Pos
                            change_master_and_start_slave( $target, $latest_slave)
                            wait_until_in_sync( $target, $latest_slave )
                        save_from_binlog_server:
                            遍历所有binary server,执行save_binary_logs --command=save获取后面的binlog
                        apply_binlog_to_master:
                            应用从binary server上获取的binlog(如果有的话)
                    如果设置了master_ip_failover_script,调用$master_ip_failover_script --command=start进行启用vip
                    如果未设置skip_disable_read_only,设置read_only=0
     
            Phase 4: Slaves Recovery Phase
                recover_slaves_gtid_internal
                -> Phase 4.1: Starting Slaves in parallel
                    对所有Slave执行change_master_and_start_slave
                    如果设置了wait_until_gtid_in_sync,通过"SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(?,0)"等待Slave数据同步
     
            Phase 5: New master cleanup phase
                reset_slave_on_new_master
                    清理New Master其实就是重置slave info,即取消原来的Slave信息。至此整个Master故障切换过程完成



启用GTID时的在线切换流程和不启用GTID时一样(唯一不同的是执行的change master语句),所以省略。
相关文章
|
11天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
40 10
|
10天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
19 1
|
23天前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
54 2
|
30天前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
29 3
|
26天前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
1月前
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
2月前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
2月前
|
SQL 人工智能 机器人
遇到的代码部份解析
/ 模拟后端返回的数据
16 0
|
2月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
3月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
72 1

推荐镜像

更多