【MySQL Shell】8.7 InnoDB ClusterSet 的受控切换

news2025/6/9 19:37:40

受控切换使选定的副本集群成为 InnoDB ClusterSet 部署的主集群。在受控切换过程中,确保了数据的一致性。该过程验证所选副本集群是否与主集群同步(如果存在复制延迟,这可能意味着需要短时间的等待),然后使该集群成为 InnoDB ClusterSet 的主集群。原始主集群降级为工作的只读副本集群。然后,如果需要,您可以使原始主集群脱机,修复任何问题,并使其在 InnoDB ClusterSet 部署中重新运行。

如果 InnoDB ClusterSet 部署中的主集群运行正常,但您需要进行维护或修复一些小问题以改进主集群的功能,请遵循受控切换程序。当您在 MySQLShell 中使用 AdminAPI 的 clusterSet.status() 命令检查时,运行正常的主集群的全局状态为 OK

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

如果无法通过使用主集群解决此问题(例如,因为无法联系主集群),则需要执行 紧急故障切换 。紧急故障切换旨在在主集群突然不可用时进行灾难恢复。该过程会带来丢失事务的风险,并为 InnoDB ClusterSet 造成脑裂的情况。如果您确实需要执行紧急故障切换,请遵循 第 8.8 节 “InnoDB ClusterSet 的紧急故障切换” 中的步骤,以确保风险得到管理。

该图显示了示例 InnoDB ClusterSet 部署中受控切换的效果。罗马数据中心的主集群需要维护,因此进行了受控切换,将布鲁塞尔数据中心的副本集群转换为 InnoDB ClusterSet 部署的主集群,并将罗马集群降级为副本集群。罗马集群上的 ClusterSet 复制通道已在受控切换过程激活,它正在从布鲁塞尔集群复制事务。现在,罗马集群是一个副本集群,如果需要执行维护工作,成员服务器或整个集群可以安全地离线。

图 8.2 InnoDB ClusterSet 切换
InnoDB ClusterSet 切换
示例 InnoDB Cluster 部署中的 MySQL 路由器实例被设置为跟随主集群,并将读写流量路由到布鲁塞尔集群,而布鲁塞尔集群现在是主集群。MySQL 路由器实例在复制集群时按名称将读取流量路由到布鲁塞尔集群,并继续将流量路由到该集群,并且不受该集群现在是主集群而不是复制集群这一事实的影响。类似地,通过名称将读取流量路由到 Rome 集群的 MySQL Router 实例可以继续这样做,因为副本集群仍然接受读取流量。

要对主 InnoDB Cluster 进行受控切换,请遵循以下步骤:

  1. 使用 MySQL Shell, 使用 InnoDB Cluster 管理员帐户(使用 cluster.setupAdminAccount() 创建)连接到主集群或副本集群中的任何成员服务器。您也可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。使用 dba.getClusterSet()cluster.getClusterSet() 命令获取 ClusterSet 对象。使用 InnoDB Cluster 管理员帐户或服务器配置帐户非常重要,以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。例如:

    mysql-js> \connect admin2@127.0.0.1:3310
    Creating a session to 'admin2@127.0.0.1:3310'
    Please provide the password for 'admin2@127.0.0.1:3310': ********
    Save password for 'admin2@127.0.0.1:3310'? [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 52
    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:3310>
    mysql-js> myclusterset = dba.getClusterSet()
    <ClusterSet:testclusterset>
    

    在本例中:

    • admin2@127.0.0.1:3310 是集群中联机的任何成员服务器实例的类似 URI 的连接字符串。
    • admin2 是 InnoDB Cluster 管理员帐户的用户名。
    • 127.0.0.1:3310 是成员服务器实例的主机和端口,如 cluster.status() 命令所示。
    • 将返回的 ClusterSet 对象分配给 myclusterset 变量。
  2. 在 MySQL Shell 中使用 AdminAPI 的 clusterSet.status() 命令检查整个 InnoDB ClusterSet 部署的状态。使用 extended 选项查看部署中所有集群的详细信息,并检查是否存在任何问题。例如:

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

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

  3. 确定可以作为主集群来接管的合适的副本集群。副本集群的受控切换资格取决于其全局状态,如 clusterSet.status() 命令所报告的:
    表 8.1 允许的集群操作(按状态)

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

    全局状态为 OK_NOT_CONSISTENT 的副本集群,在该集群上的一组事务( GTID 集)与主集群上的 GTID 集不一致。InnoDB ClusterSet 不允许受控切换到在该状态下的集群,因为客户端会访问不正确的数据。如果集群具有可选项中最新的一组事务,则可以进行紧急故障切换。

  4. 当连接到 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 路由器实例向 InnoDB ClusterSet 部署中当前的主集群发送流量。如果所有 MySQL 路由器实例都设置为遵循主集群("target_cluster": "primary"), 则流量将在切换后几秒内自动重定向到新的主集群。如果没有为 MySQL Router 实例显示路由选项,如上面的 Rome2 示例所示,这意味着该实例没有该策略集,并且遵循全局策略。

    如果将任何实例设置为按名称("target_cluster": "name_of_primary_cluster") 将当前主集群作为目标,则它们不会将流量重定向到新的主集群。在这种情况下,如果适用于应用程序,可以使用 clusterSet.setRoutingOption() 命令更改这些实例的路由策略。您可以将这些实例更改为遵循主实例("target_cluster": "primary"), 在这种情况下,现在可以设置该选项。例如:

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

    在本例中,myclustersetClusterSet 对象的变量,Rome1 是 MySQL 路由器实例的名称。

    或者,您可以指定将作为主集群来接管的副本集群,在这种情况下,在切换发生后,当您验证它是否生效时,设置选项("target_cluster": "name_of_new_primary_cluster")。

  5. 执行 clusterSet.setPrimaryCluster() 命令,将要接管的副本集群指定为新的主集群。使用使用 InnoDB Cluster 管理员帐户检索的 ClusterSet 对象,并使用 dba.getClusterSet()clusterSet.setPrimaryCluster() 命令。例如:

    mysql-js> myclusterset.setPrimaryCluster('clustertwo')
    Switching the primary cluster of the clusterset to 'clustertwo'
    * Verifying clusterset status
    ** Checking cluster clustertwo
      Cluster 'clustertwo' is available
    ** Checking cluster clusterone
      Cluster 'clusterone' is available
    
    * Refreshing replication account of demoted cluster
    * Synchronizing transaction backlog at 127.0.0.1:4410
    ** Transactions replicated  ############################################################  100%
    * Updating metadata
    
    * Updating topology
    ** Changing replication source of 127.0.0.1:3330 to 127.0.0.1:4410
    * Acquiring locks in replicaset instances
    ** Pre-synchronizing SECONDARIES
    ** Acquiring global lock at PRIMARY
    ** Acquiring global lock at SECONDARIES
    
    * Synchronizing remaining transactions at promoted primary
    ** Transactions replicated  ############################################################  100%
    * Updating replica clusters
    Cluster 'clustertwo' was promoted to PRIMARY of the clusterset. The PRIMARY instance is '127.0.0.1:4410'
    

    对于 clusterSet.setPrimaryCluster() 命令:

    • clusterName 参数是必需的,它指定用于 InnoDB ClusterSet 中副本集群的标识符,如 clusterSet.status() 命令的输出所示。在本例中,clustertwo 是要成为新主集群的集群。
    • 如果要执行验证并记录更改而不实际执行,请使用 dryRun 选项。
    • 使用 timeout 选项设置在切换发生之前等待副本集群与主集群同步的最大秒数。如果超时过期,切换将被取消。
    • 使用 invalidateReplicaClusters 选项来指定任何无法访问或不可用的副本集群。这些将在切换过程中标记为无效。如果在此过程中发现任何您未指定的不可访问或不可用的副本集群,则会取消切换。在这种情况下,您必须修复并重新加入副本集群,然后重试该命令,或者在重试该命令时将其指定为该选项的值,然后稍后修复。

    当您执行 clusterSet.setPrimaryCluster() 命令时,MySQLShell 会检查目标副本集群是否符合接管主集群的要求,如果不符合,则返回错误。如果目标副本集群满足要求,MySQL Shell 将执行以下任务:

    • 检查未使用 invalidateReplicaClusters 指定的任何无法访问或不可用的副本集群。
    • 通过应用来自主集群的任何未完成事务,等待目标副本集群与当前主群集同步。如果 timeout 选项设置的超时在副本集群完成应用事务之前过期,则切换将被取消。
    • 通过执行 FLUSH TABLES WITH READ LOCK 语句并在所有成员服务器上设置 super_read_only1 系统变量来锁定当前主集群,以防止在切换期间发生进一步更改。组复制成员操作 mysql_disable_super_read_only_if_primary 已禁用,以便在故障切换后 super_read_only 保持设置。
    • 协调当前主集群和副本集群之间视图更改事件的差异,以便 GTID 集相同。这些组复制内部事务由 group_replication_view_change_uuid 系统变量指定的 UUID 确定。MySQL Shell 在所有副本集群上注入空事务,以匹配主集群上的视图更改事件。
    • 更新从以新的主集群作为目标集群、复制到所有副本集群上的 ClusterSet 复制通道。
    • 在目标集群的主服务器上禁用 super_read_only , 并启用组复制成员操作 mysql_disable_super_read_only_if_primary 来处理对该集群中主服务器的任何更改。
    • 在旧主集群的主服务器上禁用组复制成员操作 mysql_disable_super_read_only_if_primary , 使其保持只读状态,并在该服务器上启用组复制成员动作 mysql_start_failover_channels_if_parimary , 以便为 ClusterSet 复制通道上的副本启用异步连接故障切换。
    • 将目标集群设置为 ClusterSet 元数据中的主集群,并将旧的主群集更改为副本集群。
  6. 再次使用 extended 选项执行 clusterSet.status() 命令,来验证 InnoDB ClusterSet 部署的状态。

  7. 如果您有任何 MySQL 路由器实例要切换到新的主集群,请立即切换。例如:

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

    在本例中,myclustersetClusterSet 对象的变量,Rome1 是 MySQL 路由器实例的名称,clustertwo 是目标的特定集群的名称。完成后,执行 clusterSet.routingOptions() 命令,检查所有 MySQL 路由器实例现在是否正确路由。

  8. 现在,您可以使用旧的主集群来修复问题或执行维护。如果您必须在切换过程中使任何副本集群失效,那么您也可以修复这些集群,并将它们重新添加到 InnoDB ClusterSet 中。第 8.9 节 “InnoDB ClusterSet 的修复和重新加入” 解释了如何修复集群问题,如何将集群重新加入 InnoDB ClusterSet ,以及如何将集群再次转变为主集群。


  1. super_read_only : https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_super_read_only ↩︎

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

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

相关文章

masscan的常用命令记录

目录 masscan介绍 常见参数 常见命令 输出格式 案例测试 masscan介绍 默认情况下&#xff0c;masscan的发包速率是100每秒&#xff0c;可以通过 ‘–rate’ 命令设置发包速率。 常见参数 --top-port 100&#xff1a;扫描100个常⻅端⼝ --adapter-ip&#xff1a;指定发包…

fwknop的安装和使用测试

SAP名为单包授权&#xff0c;是一种认证方法&#xff0c;它是一种端口敲门的方法&#xff0c;是之前早起端口敲门的升级版本。目的是为了隐藏服务端口&#xff0c;防止DOS等其他网络攻击&#xff0c;保证服务端的安全。SPA的具体定义这里不细说&#xff0c;网上有太多的资料&am…

微信小程序常用组件

文章目录微信小程序常用组件buttoniconimagescroll-viewswipercheckboxaudiovideo微信小程序常用组件 button 简单使用 wxml <view class"container"><button type"default">default</button><button type"default" siz…

配置与管理Web服务器

IIS是一个非常重要的Web服务器组件&#xff0c;包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器&#xff0c;分别用于网页浏览、文件传输、新闻服务和邮件发送。 Web服务的工作原理 HTTP是应用级的协议&#xff0c;主要用于分布式、协作的信息系统。HTTP协议是通用的、无状…

第二章:创建虚拟机

创建Windows server&#xff1a;首先第一步就是打开我们的vm&#xff0c;然后找到上一章讲的主页图标创建新的虚拟机。点击这上面类似的&#xff0c;然后转站。博文地址&#xff1a;https://blog.csdn.net/ryduijftgvhj/article/details/127934939?spm1001.2014.3001.5502视频…

工作进入第七年,开始幻想四十岁的生活

2022年度总结&#xff0c;推迟了一些时间&#xff0c;但终究还是来了&#xff0c;忙里偷闲。 突然发现自己很久没有更新文章了&#xff0c;主要是因为自己换了部门&#xff0c;调整了技术方向&#xff0c;对于新技术不知道该怎么写。 2022年&#xff0c;那就依旧从工作、生活…

今天面了一个来华为要求月薪25K,明显感觉他背了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

Pywirt:一款基于Python的Windows安全应急响应工具

关于Pywirt Pywirt是一款基于Python开发的网络安全工具&#xff0c;该工具专门针对Windows操作系统设计&#xff0c;可以帮助广大研究人员使用winrm并通过在Windows操作系统上收集各种信息来加快安全事件应急响应的速度。 该工具已在Windows 10操作系统上进行过完整测试。 功…

DVWA—CSRF 跨站请求伪造

注意&#xff1a; 1、这里对XSS(Stored)关卡不熟悉的可以从这里去看http://t.csdn.cn/ggQDK 2、把难度设置成low 一、概述 1、定义 跨站请求伪造&#xff0c;攻击者利用服务器对用户得新人&#xff0c;从而欺骗受害者去服务器上执行受害者不知晓得请求。 2、场景 攻击者会伪…

Fluid-数据编排能力原理解析

前言本文对Fluid基础功能-数据编排能力进行原理解析。其中涉及到Fluid架构和k8s csi driver相关知识。建议先了解相关概念&#xff0c;为了便于理解&#xff0c;本文使用JuiceFS作为后端runtime引擎。原理概述Fuild数据编排能力&#xff0c;主要是在云原生环境中&#xff0c;能…

FEC原理与操作及BigTao机框装机说明

一、FEC原理与操作​ 1.FEC 原理简介 ​ 前向纠错&#xff08;英语&#xff1a;forward error correction&#xff0c;缩写FEC&#xff09;或信道编码&#xff08;英语&#xff1a;channel coding&#xff09;是一种在单向通信系统中控制传输错误的技术&#xff0c;通过连同数…

2023年十款开源测试开发工具推荐!

今天为大家奉献一篇测试开发工具集锦干货。在本篇文章中&#xff0c;将给大家推荐10款日常工作中经常用到的测试开发工具神器&#xff0c;涵盖了自动化测试、性能压测、流量复制、混沌测试、造数据等。 1、AutoMeter-API 自动化测试平台 AutoMeter 是一款针对分布式服务&…

环境变量与命令行参数详解

问题引入 ​ 我们先来看一段简单的死循环代码&#xff1a; int main() {while(1){printf("i am running!\n");sleep(1);}return 0; }​ 我们将其运行编译并生成为可执行文件 myproc &#xff0c;当我们要运行它的时候&#xff0c;都得在这个可执行文件前面加一个 .…

【C++】 类和对象 (下)

文章目录&#x1f4d5;再谈构造函数1. 构造函数体赋值2. 初始化列表3. explicit 关键字&#x1f4d5;static 成员1. 概念2. static 成员变量3. static 成员函数&#x1f4d5; 友元1. 友元函数2. 友元类&#x1f4d5;内部类&#x1f4d5;编译器优化&#x1f4d5;再谈构造函数 1…

Python traceback模块:获取异常信息

除了使用 sys.exc_info() 方法获取更多的异常信息之外&#xff0c;还可以使用 traceback 模块&#xff0c;该模块可以用来查看异常的传播轨迹&#xff0c;追踪异常触发的源头。下面示例显示了如何显示异常传播轨迹&#xff1a;classSelfException(Exception): pass defmain(): …

linux 学习(持续更新)

一&#xff1a;初识linux 新装操作环境&#xff1a; mac intel电脑 CentOS系统版本&#xff1a;CentOS-8.1.1911 在这里解释一下[chenllocalhost /]$这句话的含义&#xff1a; chenl是用户名&#xff0c;也就是你自己起的名字。 是分割的符号 localhost是主机名&#xff0c;也…

轻松实现微信小程序上传多文件/图片到腾讯云对象存储COS(免费额度)

概述 对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是腾讯云提供的一种存储海量文件的分布式存储服务&#xff0c;用户可通过网络随时存储和查看数据。个人账户首次开通COS可以免费领取50GB 标准存储容量包6个月&#xff08;180天&#xff09;的额度。…

VBA提高篇_19 可选参数Optional_ IsMissing _MSgbox

文章目录1. 可选参数Optional2.IsMissing判断参数是否提供,只能判断变体类型3. 使用 : 可以按参数名传递参数 a:1,c:34.Msgbox 常用参数5.VBA颜色常量表1. 可选参数Optional Optional 代表本参数是可选项 False ; 代表参数若不指定,则默认为False Function mySumProduct(r As R…

2023年rabbitMq面试题汇总3(5道)

一、如何确保消息不丢失&#xff1f;消息持久化的前提是&#xff1a;将交换器/队列的durable属性设置为true&#xff0c;表示交换器/队列是持久交换器/队列&#xff0c;在服务器崩溃或重启之后不需要重新创建交换器/队列&#xff08;交换器/队列会⾃动创建&#xff09;。如果消…

【监控】Prometheus(普罗米修斯)监控概述

文章目录一、监控系统概论二、基础资源监控2.1、网络监控2.2、存储监控2.3、服务器监控2.4、中间件监控2.5、应用程序监控&#xff08;APM&#xff09;三、Prometheus 简介3.1、什么是 Prometheus3.2、优点3.3、组件3.4、架构3.5、适用于什么场景3.6、不适合什么场景四、数据模…