【MySQL Shell】8.8 InnoDB ClusterSet 的紧急故障切换

news2025/1/18 2:00:41

紧急故障切换会将选定的副本集群放入 InnoDB ClusterSet 部署的主 InnoDB 集群中。当当前主集群不工作或无法联系时,可以使用此过程。在紧急故障切换过程中,无法确保数据一致性,因此为了安全起见,在故障切换过程中将原始主集群标记为无效。如果原始主集群保持联机,则应在联系到它后立即关闭。您可以修复失效的主集群,然后将其重新连接到 InnoDB ClusterSet 拓扑,前提是您可以修复这些问题。

当 InnoDB ClusterSet 部署中的主 InnoDB 集群出现问题或您无法访问它时,不要立即执行到副本集群的紧急故障切换。相反,您应该始终从尝试修复当前活动的主集群开始。

重点
为什么不只是故障切换? InnoDB ClusterSet 拓扑中的副本集群正在尽最大努力保持与主集群的同步。然而,根据事务量以及主集群和副本集群之间的网络连接的速度和容量,副本集群在接收事务和将更改应用于其数据方面可能落后于主集群。这称为复制延迟(replication lag)。在大多数复制拓扑中,预期会出现一些复制延迟,在 InnoDB ClusterSet 部署中,集群在地理上分散在不同的数据中心,这种情况很可能发生。
此外,主集群可能因网络分区与 InnoDB ClusterSet 拓扑的其他元素断开连接,但仍保持在线。如果发生这种情况,一些副本集群可能和主集群保留在一起,而一些实例和客户端应用程序可能会继续连接到主集群并应用事务。在这种情况下,InnoDB ClusterSet 拓扑的分区区域开始彼此分离,每组服务器上都有不同的事务集。
当存在复制延迟或网络分区时,如果触发到副本集群的紧急故障切换,则主集群上任何未复制或不同的事务都有丢失的风险。在网络分区的情况下,故障切换会造成脑裂的情况,拓扑的不同部分具有不同的事务集。因此,在触发紧急故障切换之前,应始终尝试修复或重新连接主集群。如果无法足够快速地修复主集群或无法访问主集群,则可以继续进行紧急故障切换。

该图显示了 InnoDB ClusterSet 部署示例中紧急故障切换的效果。罗马数据中心的主集群已离线,因此已执行紧急故障切换,以使布鲁塞尔数据中心的副本集群成为 InnoDB ClusterSet 部署的主 InnoDB 集群。罗马集群已被标记为无效,其在 InnoDB ClusterSet 部署中的状态已降级为副本集群,尽管它目前无法从布鲁塞尔集群复制事务。

图 8.3 InnoDB ClusterSet 故障切换

在这里插入图片描述

被设置为跟随主节点的 MySQL 路由器实例已将读写流量路由到布鲁塞尔集群,该集群现在是主节点。MySQL 路由器实例在复制集群时按名称将读取流量路由到布鲁塞尔集群,并继续将流量路由到该集群,并且不受该集群现在是主集群而不是复制集群这一事实的影响。然而,通过名称将读取流量路由到罗马集群的 MySQL Router 实例当前无法在那里发送任何流量。本例中的报告应用程序不需要报告本地数据中心何时离线,但如果应用程序仍需要运行,MySQL 路由器实例的路由选项应更改为遵循主路由或向布鲁塞尔集群发送流量。

要为主要 InnoDB 集群执行紧急故障切换,请执行以下步骤:

  1. 使用 MySQL Shell, 使用 InnoDB Cluster 管理员帐户(使用 cluster.setupAdminAccount() 创建)连接到 InnoDB ClusterSet 部署中仍处于活动状态的任何成员服务器。您也可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。

    建立连接后,使用 dba.getClusterSet()cluster.getClusterSet() 命令从该成员服务器获取 ClusterSet 对象。以前从现在脱机的成员服务器检索的 ClusterSet 对象将不再工作,因此需要从联机的服务器再次获取该对象。使用 InnoDB Cluster 管理员帐户或服务器配置帐户非常重要,以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。例如:

    mysql-js> \connect admin2@127.0.0.1:4410
    Creating a session to 'admin2@127.0.0.1:4410'
    Please provide the password for 'admin2@127.0.0.1:4410': ********
    Save password for 'admin2@127.0.0.1:4410'? [Y]es/[N]o/Ne[v]er (default No):
    Fetching schema names for autocompletion... Press ^C to stop.
    Closing old connection...
    Your MySQL connection id is 71
    Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial
    No default schema selected; type \use <schema> to set one.
    <ClassicSession:admin2@127.0.0.1:4410>
    
    mysql-js> myclusterset = dba.getClusterSet()
    <ClusterSet:testclusterset>	
    ```
    
    
  2. 使用 MySQLShell 中 AdminAPI 的 clusterSet.status() 函数检查整个部署的状态。使用扩展选项查看问题的确切位置和内容。例如:

    mysql-js> myclusterset.status({extended: 1})
    

    有关输出的说明,请参阅 第 8.6 节 “InnoDB ClusterSet 的状态和拓扑” 。

  3. InnoDB 集群可以容忍一些问题,并且运行良好,可以继续作为 InnoDB ClusterSet 部署的一部分。当您使用 clusterSet.status() 命令检查运行正常的主集群时,它的全局状态为 OK 。 例如,如果集群中的一个成员服务器脱机,即使该服务器是主服务器,底层组复制技术也可以处理这种情况并重新配置自己。

    如果根据报告的状态,主集群在 InnoDB ClusterSet 部署中仍能正常运行,但您需要进行维护或修复一些小问题以改进主集群的功能,则可以进行受控切换到副本集群。然后,如果需要,您可以使主集群离线,修复任何问题,并使其在 InnoDB ClusterSet 部署中重新运行。有关此操作的说明,请参阅 第 8.7 节 “InnoDB ClusterSet 的受控切换” 。

  4. 如果主集群在 InnoDB ClusterSet 部署中运行不正常(全局状态为 NOT_OK ), 但您可以联系它,首先尝试通过 MySQL Shell 使用 AdminAPI 修复任何问题。例如,如果主集群已失去法定人数,则可以使用 cluster.forceQuorumUsingPartitionOf 命令恢复它。有关此操作的说明,请参阅 第 8.9 节“ InnoDB ClusterSet 的修复和重新加入” 。

  5. 如果无法执行受控切换,并且无法通过使用主集群快速解决问题(例如,因为无法联系主集群),请继续执行紧急故障切换。首先确定一个合适的副本集群,它可以作为主集群来接管。副本集群的紧急故障切换资格取决于其全局状态,如 clusterSet.status() 命令所报告的:

    表 8.2 允许的集群操作(按状态)

    ClusterSet 内的 InnoDB Cluster 全局状态是否可路由受控切换紧急故障切换
    OK
    OK_NOT_REPLICATING是,如果使用名称指定目标集群
    OK_NOT_CONSISTENT是,如果使用名称指定目标集群
    OK_MISCONFIGURED
    NOT_OK
    INVALIDATED是,如果使用名称指定目标集群并且设置 accept_ro 路由策略
    UNKNOWN已连接的MySQL路由器实例可能仍在将流量路由到该集群

    您选择的副本集群必须具有所有可访问的副本集群中最新的事务集( GTID 集)。如果有多个副本集群符合紧急故障切换条件,请检查每个集群的复制延迟(这在 clusterSet.status() 命令的扩展输出中显示)。选择复制延迟最少的副本集群,因此它应该具有最多的事务。紧急故障转移过程检查当前可访问的所有副本集群的 GTID 集,并告诉另一个集群是否更为最新,以便您可以使用该集群重试。

  6. 当连接到 InnoDB ClusterSet 部署中的任何成员服务器时,通过在 MySQL Shell 中执行 clusterSet.routingOptions() 命令,检查为每个 MySQL Router 实例设置的路由选项以及 InnoDB ClusterSet 部署的全局策略。例如:

    	mysql-js> myclusterset.routingOptions()
    {
        "domainName": "testclusterset",
        "global": {
            "invalidated_cluster_policy": "drop_all",
            "target_cluster": "primary"
        },
        "routers": {
            "Rome1":  {
                "target_cluster": "primary"
            },
            "Rome2": {}
        }
    }
    

    如果所有 MySQL 路由器实例都设置为遵循主集群( "target_cluster": "primary" ), 则流量将在故障切换后几秒内自动重定向到新的主集群。如果没有为 MySQL Router 实例显示路由选项,如上面针对 Rome2“target_cluster” 示例所示,这意味着该实例没有该策略集,而是遵循全局策略。

    如果将任何实例设置为按名称( "target_cluster": "name_of_primary_cluster" ) 将当前主集群作为目标,则它们不会将流量重定向到新的主集群。当主集群不工作时,clusterSet.setRoutingOptions() 命令不能用于更改路由选项,因此在故障切换到新的主集群之前,您无法重定向该 MySQL 路由器实例处理的流量。

  7. 如果可以,请尝试验证原始主集群是否处于脱机状态,如果处于联机状态,请尝试将其关闭。如果它保持在线并继续接收来自客户端的流量,则可能会出现脑裂的情况,即 InnoDB ClusterSet 的分离部分发生分歧。

  8. 要继续进行紧急故障转移,请执行 clusterSet.forcePrimaryCluster() 命令,指定要接管的副本集群为新的主集群。例如:

    mysql-js> myclusterset.forcePrimaryCluster("clustertwo")
    Failing-over primary cluster of the clusterset to 'clustertwo'
    * Verifying primary cluster status
    None of the instances of the PRIMARY cluster 'clusterone' could be reached.
    * Verifying clusterset status
    ** Checking cluster clustertwo
      Cluster 'clustertwo' is available
    ** Checking whether target cluster has the most recent GTID set
    * Promoting cluster 'clustertwo'
    * Updating metadata
    
    PRIMARY cluster failed-over to 'clustertwo'. The PRIMARY instance is '127.0.0.1:4410'
    Former PRIMARY cluster was INVALIDATED, transactions that were not yet replicated may be lost.
    

    clusterSet.forcePrimaryCluster() 命令中:

    • clusterName 参数是必需的,它指定用于 InnoDB ClusterSet 中副本集群的标识符,如 clusterSet.status() 命令的输出所示。在本例中,clustertwo 是要成为新主集群的集群。
    • 如果要执行验证并记录更改而不实际执行,请使用 dryRun 选项。
    • 使用 invalidateReplicaClusters 选项来指定任何无法访问或不可用的副本集群。这些将在故障切换过程中标记为无效。如果在此过程中发现了任何您未指定的不可访问或不可用的副本集群,则会取消故障切换。在这种情况下,您必须修复并重新加入副本集群,然后重试该命令,或者在重试该命令时指定其为该选项的值,然后稍后修复。
    • 使用 timeout 选项定义等待在集群的每个实例中应用挂起事务的最大秒数。确保 GTID_EXECUTED 具有最新的 GTID 集。默认值从 dba.gtidWaitTimeout 选项中检索。

    当您执行 clusterSet.forcePrimaryCluster() 命令时,MySQLShell 会检查目标副本集群是否符合接管主集群的要求,如果不符合,则返回错误。

    如果目标副本集群满足要求,MySQL Shell 将执行以下任务:

    • 尝试联系当前主集群,如果确实可以联系到,则停止故障切换。
    • 检查未使用 invalidateReplicaClusters 指定的任何无法访问或不可用的副本集群,如果发现任何副本集群,则停止故障转移。
    • invalidateReplicaClusters 中列出的所有副本集群标记为无效,并将旧的主集群标记为失效。
    • 检查目标副本集群是否具有可用副本集群中的最新 GTID 集。 这涉及停止所有副本集群中的 ClusterSet 复制通道。
    • 更新从以新的主集群作为目标集群、复制到所有副本集群上的 ClusterSet 复制通道。
    • 在 ClusterSet 元数据中将目标集群设置为主集群,并将旧的主集群更改为副本集群,尽管它当前未作为副本集群运行,因为它被标记为无效。

    在紧急故障切换期间,MySQL Shell 不会尝试将目标副本集群与当前主集群同步,也不会锁定当前主集群。如果原始主集群保持联机,则应在联系到它后立即关闭。

  9. 如果您有任何 MySQL 路由器实例要切换到新的主集群,请立即切换。您可以将它们更改为跟随主集群( "target_cluster": "primary" ), 或指定已作为主集群来接管的副本集群( "target_cluster": "name_of_new_primary_cluster" )。 例如:

    mysql-js> myclusterset.setRoutingOption('Rome1', 'target_cluster', 'primary')
    或
    mysql-js> myclusterset.setRoutingOption('Rome1', 'target_cluster', 'clustertwo')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.
    

执行 clusterSet.routingOptions() 命令,检查所有 MySQL 路由器实例现在是否正确路由。

  1. 使用扩展选项再次执行 clusterSet.status() 命令,以验证 InnoDB clusterSet 部署的状态。

  2. 如果您能够再次联系旧的主集群,请首先确保没有应用程序流量被路由到该集群,然后使其脱机。然后按照 第 8.9 节“ InnoDB ClusterSet 的修复和重新加入” 中的流程检查事务并决定如何安排 InnoDB ClusterSet 拓扑结构。

    在发生紧急故障切换后,如果 ClusterSet 的各个部分之间存在事务集不同的风险,则必须保护集群不受写入流量或所有流量的影响。有关详细信息,请参阅 隔离 InnoDB ClusterSet 中的集群 。

    如果您必须在切换过程中使任何副本集群失效,并且当您能够再次联系它们时,您可以使用第 8.9 节“ InnoDB ClusterSet 的修复和重新加入” 中的过程来修复它们并将它们添加回 InnoDB ClusterSet。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openHarmony的UI开发

自适应布局 拉伸能力 ​ Blank在容器主轴方向上&#xff0c;空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效&#xff0c;即是线性布局。这样便可以在两个固定宽度或高度的组件中间添加一个Blank()&#xff0c;将剩余空间占满&#xff0c;从而实现…

通过python 调用OpenAI api_key提交问题解答

通过python 调用OpenAI api_key提交问题解答✨可以通过网页版的jupyter notebook调用&#xff0c;也可以通过spyder窗口等IDE窗口. &#x1f33c;通过python 调用OpenAI api_key接口&#xff0c;可以避免国内网页不能访问的问题。前提是需要自己已经注册了OpenAI帐号&#xff…

linux中crontab定时任务导致磁盘满和云监控未报警的的坑

一个后台开发者&#xff0c;兼职运维工作中&#xff0c;配置linux中crontab定时任务&#xff0c;导致磁盘满和云监控未报警的问题的坑。 1.磁盘满 使用命令 df -h2.问题排查 2.1排查日志 命令 cat /var/log/messages日志文件的默认路径是&#xff1a;/var/log 下面是几个…

外贸常用工具(建议顶置收藏)

领英精灵 推荐理由&#xff1a;可批量群发消息并单独显示&#xff0c;相当于20人的发送效率。 做外贸的人一定会在Linkedin平台开发客户&#xff0c;但Linkedin平台没有提供群发消息的功能&#xff0c;如果要快速发消息的话&#xff0c;只能一个一个发&#xff0c;这种发送效…

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么&#xff1f; 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式&#xff0c;项目要求最后的文件需要是mp3格式&#xff0c;于…

tomcat10部署报错WebStatFilter cannot be cast to jakarta.servlet.Filter

异常信息09-Feb-2023 23:08:49.946 严重 [main] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[DruidWebStatFilter]java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter cannot be cast to jakarta.servlet.Filterat org.ap…

上科大最新工作!实时面捕天花板,微表情像素级一致,AI让你告别手Key|SIGGRAPH Asia 2022

驱动一个数字人往往被拆分为追踪 (Tracking) 与重定向 (Retargeting) 两个环节。 追踪由专业的面部捕捉设备及其辅助算法完成&#xff0c;负责记录演员的面部动作信息&#xff0c;重定向则是将捕捉到的动作信息迁移到新的角色。 在传统的流程中&#xff0c;这两个环节往往是分…

全价值链赋能,数字化助力营销价值全力释放 | 爱分析报告

报告编委 张扬 爱分析联合创始人&首席分析师 文鸿伟 爱分析高级分析师 王鹏 爱分析分析师 外部专家&#xff08;按姓氏拼音排序&#xff09; 黄洵 客易达 联合创始人 毛健 云徙科技 副总裁 & COO 特别鸣谢&#xff08;按拼音排序&#xff09; 报告摘要 在…

SpringSecurity前后端分离(一篇就够了)

SpringSecurity前后端分离 从上至下操作&#xff0c;直接上手SpringSecurity 文章目录SpringSecurity前后端分离1、项目环境maven依赖数据库表2、自定义UserService接口3、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑1、表…

鉴源论坛 ·观擎丨民机机载软件的开发与验证

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 机载软件过程保证的目的和背景 民机机载软件研制过程一直是行业内公认的要求最为严苛、开发验证难度最大的软件开发实例之一。由于其高安全以及严格的政府监管特性&#xff0c;使得传统其他领域的软件…

1. 用Qt开发的十大理由

用Qt的十大理由 原因最主要的是很多大公司都在用&#xff0c;有钱景。 先来看看各大公司的评价&#xff1a; 奔驰&#xff1a;们用 Qt 开发了绝大部分的UI体验和软件&#xff0c;包括屏幕动画&#xff0c;屏幕间的过渡和小组件。 FORMLABS&#xff1a;凭借Qt的快速迭代&…

记录一下slf4j2打印一直不成功

整理一个之前的老项目问题&#xff0c;发现日志一直打印不出来&#xff0c;本地启动发现了第一个问题日志如下&#xff1a;此处可发现&#xff0c;jar包冲突问题&#xff0c;去掉冲突的jar包即可&#xff0c;此处不做过多赘述。然后发现了重新启动项目&#xff0c;发现jar包冲突…

工业废水的种类及其处理工艺简析

随着工业的迅速发展&#xff0c;工业废水的种类和数量随之增加&#xff0c;对水体的污染也日趋严重&#xff0c;威胁人类的健康和正常生活。所以工业废水的处理对于环保至关重要。 保护生态环境、更好地做好工业废水的处理&#xff0c;了解工业废水及其种类与处理非常必要。 工…

国内chatgpt 在VRAR上的应用场景

人工智能不鸣则已&#xff0c;一鸣惊人! 近日OpenAI发布了聊天AI ChatGPT&#xff0c;短短几天&#xff0c;其用户量直冲百万级&#xff0c;甚至服务器一度被注册用户挤爆了。 这种被网友惊叹“超越谷歌搜索”的神器究竟是怎么做到的? ChatGPT 简而言之&#xff1a;ChatGPT是一…

三行按键扫描详细解析

三行按键扫描基础 核心算法&#xff1a; unsigned char trg; unsigned char cont; void KeyRead( void ) {unsigned char readDate P3^0xff; // 第一行trg readDate & (ReadData ^ cont); // 第二行cont readDate; // 第三行 }用定时器每隔10ms执行一次按键扫描读取函…

C++:类和对象(上)

文章目录1 面向过程与面向对象的初步认识2 类的引入3 类的定义4 类的访问限定符及封装4.1 访问限定符4.2 封装5 类的实例化6 类对象模型6.1 如何计算类的大小6.2 类对象的存储方式猜测7 this指针7.1 this指针的引出7.2 this指针的特性8 C语言和C栈&#xff08;Stack&#xff09…

J-Tech Talk|如何使用Grafana Cloud Alert进行实时监控

J-Tech Talk由 Jina AI 社区为大家带来的技术分享围绕 Python 的相关话题工程师们将深入细节地讲解具体的问题分享 Jina AI 在开发过程中所积累的经验在新一代基于云原生的微服务架构中&#xff0c;不管是业务还是基础设施&#xff0c;服务的可观测性 至关重要&#xff01;它涵…

git、gitee、github关系梳理及ssh不对称加密大白话解释

温馨提示&#xff1a;本文不会讲解如何下载、安装git&#xff0c;也不会讲解如何注册、使用gitee或GitHub&#xff0c;这些内容网上一大把&#xff0c;B站上的入门课程也很多&#xff0c;自己看看就好了。 本文仅对 git、gitee、github的关系梳理及ssh公钥私钥授权原理用白话讲…

whistle 一个神奇的前端调试工具(抓包\代理工具)

在进行前端开发过程中&#xff0c;我们常常需要对一些接口进行处理&#xff0c;以及当后端接口没有弄好需要我们mock一些假数据&#xff0c;针对这些场景&#xff0c;我们就可以使用whistle 来解决。首先&#xff0c;我们要知道能满足我们需求的工具有很多&#xff0c;例如&…

第十五章 栅格数据重分类、栅格计算器、插值分析

文章目录第十五章 栅格数据分析第一章 栅格数据重分类第一节 栅格数据重分类第二节 栅格重分类的使用第三节 重分类的使用中的空值使用第四节 重分类的案例&#xff1a;分类统计面积第五节 坡度矢量分级图生成第二章 栅格计算器第一节 栅格计算器介绍第二节 栅格计算器使用第三…