MySQL 异步复制源自动故障转移

2023-11-06

1 异步复制源架构

1.1基于主从复制的异步复制源

从MySQL 8.0.22开始支持异步连接故障转移机制,我们可以在一套主从复制架构的基础上,创建一个异步复制连接的Replica副本,当主从复制Source发生意外宕机,业务提升Replica为新的Source对外进行服务,异步连接Replica可自动检测主从架构源端连接异常,并重新指向新的Source进行数据复制。

架构图与流程展示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HdW7iTl7-1646883045164)(https://secure2.wostatic.cn/static/oyvtCAUHVjyz2P1CipNdML/image.png)]

  • Source 、Replica为正常的主从复制架构,Async Replica为通过异步连接的复制副本
  • 当主从复制架构中Source意外宕机,业务提升主从架构下Replica为New Source对外提供业务服务
  • Async Replica检测连接原Source失败,将主从复制重新指向新的New Source进行数据复制

1.2 基于组复制的异步复制源

从MySQL 8.0.23开始支持对组复制的异步连接故障转移机制,异步连接副本的复制源添加组复制成员并定义为组管理后,异步连接副本可自动检测源MGR架构下的组复制角色(Prinary or Secondary),当组复制成员进行更新时,异步复制副本可自动更新复制源列表中的组成员信息。当异步连接复制节点复制源不可用时,自动切换选择组复制内可用节点进行复制。

架构图与流程展示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8h1Hu7L-1646883045165)(https://secure2.wostatic.cn/static/fgKCzbBFvS2KK9Q72F3XTF/image.png)]

  • MGR单组架构下,新建一个Async Replica从组复制中Primary节点进行数据复制
  • 当MGR架构中Primary节点宕机,MGR自身failover机制会选举某一Secondary节点为New Pirmary节点
  • 异步连接Async Replica节点连接 Down Primary失败,自动检测组复制角色以及权重,选择可用节点为新的Source节点进行数据复制

2 异步连接failover前提与基本命令

2.1 前提

  • 复制源与副本都需要开启GTID,方面搭建复制时使用auto_position模式(创建复制通道时使用 SOURCE_AUTO_POSITION | MASTER_AUTO_POSITION 参数)
  • 异步连接复制对应的复制源中,所有节点都需要保持复制用户账号密码一致,方便进行复制源切换
  • 复制用户额外授予以下权限
GRANT SELECT ON performance_schema.* TO 'repl_user';

2.2 基本命令

1、创建复制通道

mysql> CHANGE REPLICATION SOURCE TO MASTER_USER='rpl'         # 复制源用户
, MASTER_PASSWORD='123'                                       # 复制源密码
, MASTER_HOST='172.16.104.12', MASTER_PORT=3307               # 复制源IP、端口
, SOURCE_CONNECTION_AUTO_FAILOVER=1                           # 复制源自动failover
, SOURCE_AUTO_POSITION = 1                                    # 复制gtid auto_position
, SOURCE_CONNECT_RETRY = 1                                    # 重连次数
, SOURCE_RETRY_COUNT = 6                                      # 重试次数
FOR CHANNEL 'ch1';

2、添加/删除复制源为主从架构

-- (复制通道名称,复制源IP,复制源端口,复制源网络命名空间,复制源权重)
select asynchronous_connection_failover_add_source(channel, host, port, network_namespace, weight)
-- (复制通道名称,复制源IP,复制源端口,复制源网络命名空间)
select asynchronous_connection_failover_delete_source(channel, host, port, network_namespace)

3、添加/删除复制源为组复制架构

-- (复制通道名称,管理方式:GroupReplication,组复制名称,复制源IP,复制源端口,复制源网络命名空间,Primary节点权重,Secondary节点权重)
select asynchronous_connection_failover_add_managed(channel, managed_type, managed_name, host, port, network_namespace, primary_weight, secondary_weight)

-- (复制通道名称,组复制名称)
select asynchronous_connection_failover_delete_managed(channel,  managed_name)

4、异步复制监控

  • performance_schema.replication_asynchronous_connection_failover : 查看复制渠道中可切换的复制源节点信息
  • performance_schema.replication_asynchronous_connection_failover_managed : 复制源添加为组复制时可查看该视图

3 搭建测试

本次测试环境是针对MGR架构进行异步连接复制,异步链接复制源的方式选择的不是组复制管理模式。MGR集群本身有一些存量数据。

3.1 异步连接复制搭建

1、在Async Replica节点安装克隆插件,用来进行历史数据的克隆

root@mysql80 15:23:  [(none)]> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.11 sec)

root@mysql80 15:24:  [(none)]> SET GLOBAL clone_valid_donor_list = '172.16.104.12:3307';
Query OK, 0 rows affected (0.01 sec)

root@mysql80 15:24:  [(none)]> CLONE INSTANCE FROM 'rpl'@'172.16.104.12':3307 IDENTIFIED BY '123';
Query OK, 0 rows affected (5.30 sec)

root@mysql80 15:25:  [(none)]> show databRestarting mysqld...
2022-03-03T07:25:23.145060Z mysqld_safe Number of processes running now: 0

2、为Async Replica节点的复制源channel添加节点信息,将MGR组复制三个节点进行添加

root@mysql80 15:26:  [(none)]> SELECT asynchronous_connection_failover_add_source('ch1', '172.16.104.12', 3307, '', 80);
root@mysql80 15:28:  [(none)]> SELECT asynchronous_connection_failover_add_source('ch1', '172.16.104.11', 3307, '', 90);
root@mysql80 15:28:  [(none)]> SELECT asynchronous_connection_failover_add_source('ch1', '172.16.104.13', 3307, '', 100);


root@mysql80 15:28:  [(none)]> SELECT * FROM performance_schema.replication_asynchronous_connection_failover;
+--------------+---------------+------+-------------------+--------+--------------+
| CHANNEL_NAME | HOST          | PORT | NETWORK_NAMESPACE | WEIGHT | MANAGED_NAME |
+--------------+---------------+------+-------------------+--------+--------------+
| ch1          | 172.16.104.11 | 3307 |                   |     90 |              |
| ch1          | 172.16.104.12 | 3307 |                   |     80 |              |
| ch1          | 172.16.104.13 | 3307 |                   |    100 |              |
+--------------+---------------+------+-------------------+--------+--------------+
3 rows in set (0.00 sec)

3、指定复制源创建复制通道

root@mysql80 15:33:  [(none)]> CHANGE REPLICATION SOURCE TO MASTER_USER='rpl', MASTER_PASSWORD='123', MASTER_HOST='172.16.104.12', MASTER_PORT=3307, SOURCE_CONNECTION_AUTO_FAILOVER=1, 
    ->   SOURCE_AUTO_POSITION = 1,
    ->   SOURCE_CONNECT_RETRY = 1,
    ->   SOURCE_RETRY_COUNT = 6 FOR CHANNEL 'ch1';

root@mysql80 15:33:  [(none)]> start slave;


root@mysql80 15:33:  [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.16.104.12
                  Master_User: rpl
                  Master_Port: 3307
                Connect_Retry: 1
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 1728
               Relay_Log_File: relaylog-ch1.000002
                Relay_Log_Pos: 418
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

3.2 failover测试

1、将MGR集群Primary节点进行关闭,模拟节点宕机

root@mysql80 15:35:  [(none)]> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 3185a750-63d2-11ec-8209-fa8f73556a00 | 172-16-104-12 |        3307 | ONLINE       | PRIMARY     | 8.0.27         | XCom                       |
| group_replication_applier | 47e76c4e-63d2-11ec-be7a-fa175fe3f900 | 172-16-104-13 |        3307 | ONLINE       | SECONDARY   | 8.0.27         | XCom                       |
| group_replication_applier | f28eb9ac-9abd-11ec-8291-fa5f62467200 | 172-16-104-11 |        3307 | ONLINE       | SECONDARY   | 8.0.27         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

[root@172-16-104-12 local]# /usr/local/mysql80/bin/mysqladmin -p123 shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
2022-03-03T07:36:00.084244Z mysqld_safe mysqld from pid file /data2/mysql80/run/mysql80.pid ended
  [1]+  完成                  /usr/local/mysql80/bin/mysqld_safe --defaults-file=/etc/my.cnf
  
root@mysql80 15:35:  [(none)]> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 47e76c4e-63d2-11ec-be7a-fa175fe3f900 | 172-16-104-13 |        3307 | ONLINE       | PRIMARY     | 8.0.27         | XCom                       |
| group_replication_applier | f28eb9ac-9abd-11ec-8291-fa5f62467200 | 172-16-104-11 |        3307 | ONLINE       | SECONDARY   | 8.0.27         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
2 rows in set (0.00 sec)

2、观察Async Replica节点复制源

root@mysql80 15:36:  [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.16.104.11
                  Master_User: rpl
                  Master_Port: 3307
                Connect_Retry: 1
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 2868
               Relay_Log_File: relaylog-ch1.000003
                Relay_Log_Pos: 1586
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

root@mysql80 15:36:  [(none)]> select CHANNEL_NAME, SOURCE_UUID, SERVICE_STATE from performance_schema.replication_connection_status;
+----------------------------+--------------------------------------+---------------+
| CHANNEL_NAME               | SOURCE_UUID                          | SERVICE_STATE |
+----------------------------+--------------------------------------+---------------+
| group_replication_applier  |                                      | OFF           |
| group_replication_recovery |                                      | OFF           |
| ch1                        | f28eb9ac-9abd-11ec-8291-fa5f62467200 | ON            |
+----------------------------+--------------------------------------+---------------+
3 rows in set (0.00 sec)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 异步复制源自动故障转移 的相关文章

  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • 语言翻译语法

    我正在尝试为我的项目添加另一种语言 我们知道语言可以表现出主语和谓语的差异 例如 英语 Mustafa和他的朋友去看电影ahmet today 土耳其 Mustafa布昆 阿卡达西ahmetile birlikte sinemaya git
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • ER_ACCESS_DENIED_ERROR:用户 ''@'localhost' 的访问被拒绝(使用密码:NO)

    我有这个问题 我已经研究过但无法解决它 我想它与数据库权限有关 但我无法修复它 if error throw error Error ER ACCESS DENIED ERROR Access denied for user localho
  • 如何在 Laravel 中编写联合查询?

    我正在使用 laravel 5 0 并且我有 mysql 查询 SELECT surat masuk id surat surat masuk nomor surat FROM surat masuk WHERE EXISTS SELECT
  • 使用 mysql2 gem 获取最后插入的 id

    我有这样的代码 require mysql2 db query insert into clients Name values client 我可以通过 1 个查询返回最后插入的 ID 吗 您可以使用last id客户端实例的方法 clie
  • MySQL 5左连接未知列

    我有以下查询在 mysql 4 1 中工作 但在 5 0 中不起作用 SELECT FROM email e event email ee LEFT JOIN member m on m email e email WHERE ee ema
  • PDO fetch() 失败时会抛出异常吗?

    有没有方法PDO语句 fetch http php net manual en pdostatement fetch php如果 PDO 错误报告系统设置为抛出异常 则在失败时抛出异常 例如 如果我设置 PDO ATTR ERRMODE g
  • 在mysql中搜索“SanF”时获取旧金山的记录

    当我搜索 SanF 时获得 San Francisco 记录 SELECT FROM table WHERE col LIKE san Works SELECT FROM table WHERE col LIKE san F Works S
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • 更改Docker容器中的mysql密码

    我如何更改 docker 容器中的 root 密码 因为一旦我停止 mysql 服务 容器就会自动停止 我应该停止 mysql 容器并部署一个新容器吗 您可以使用正在运行的容器更改它docker exec session https doc
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • 在 MySQL 中将行转置为列

    如何在 MySQL 查询中将行转换为列 您可以将行变成a列与GROUP CONCAT 但您无法以任何自动方式转置整个结果集 您可以编写手动生成每一列的查询 也可以在应用程序中执行此操作 以下是有关编写复杂查询来模拟转置的教程 http ww
  • 如何将 php Web 应用程序转换为桌面应用程序并保留数据库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个用 PHP 开发的 Web 应用程序 但大多数客户并没有一直连接到互联网 那么 有没有办法将应用程序转换为桌面应用程序 以便
  • PHP/MySQL:如何在网站中创建评论部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不会问 如何使用 PHP MySQ
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • 如何解决 MySQL innodb 在 TRUNCATE TABLE 上“等待表元数据锁”?

    在 GitLab CI 服务器中运行包含数百个应用程序单元测试的测试套件 运行 10 次测试后 不知怎的 它总是卡在等待 TRUNCATE TABLE 上的表元数据锁上 这是一个拆卸步骤 我知道SHOW ENGINE INNODB STAT
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B

随机推荐

  • Java基础3--Java流程控制语句

    Java基础3 Java流程控制语句 文章目录 Java基础3 Java流程控制语句 Java循环语句 while循环 do while循环 for循环 增强for循环 Java条件语句 if语句 if else语句 if多分支语句 Jav
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • Error Microsoft Visual C++ 14.0 is required 最佳解决方法,亲测有效

    这种pip安装不上的包 1 找whl包下载安装 去Python安装包大全中 https www lfd uci edu gohlke pythonlibs 去下载 对应后缀为 whl 的安装包进行安装 后缀为 whl 的安装包进行安装的方法
  • java永久区_Java方法区和永久代

    目前有三大Java虚拟机 HotSpot oracle JRockit IBM J9 JRockit是oracle发明的 用于其WebLogic服务器 IBM JVM是IBM发明的用于其Websphere服务器 因此在某行开发的时候 他们用
  • linux日志打到垃圾箱,shell输出的那个垃圾桶——/dev/null

    昨晚花费一整晚在知乎回答了一个关于shell里面的重定向输出到 dev null的问题 果断今晚也同步发在这里 反正也没人看 以下来自一个重度linux使用患者不请自来的回答 先用简单的语言回答题主的问题 shell程序中 2 gt dev
  • USB学习之一:USB协议基础

    USB开发者论坛http www usb org USB专区 http group ednchina com 93 1 1USB的特点 在USB1 0和USB1 1版本中 只支持1 5Mb s的低速 low speeed 模式 和12Mb
  • 探索健康养老的“最后一公里” 附下载地址

    目前中国机构养老市场参与者主要包括 房地产开发商 保险公司以及一些专业的养老服务企业 其中房地产开发商和保险公司凭借丰富的开发经验和充足的 资金流在市场上处于领先地位 目前市 场主流的机构养老项目的营利模式主要 分三类 即 非销售类 销售类
  • 《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

    环境 操作系统 Windows11 显卡 RTX2060 6GB 显存 安装Python 下载 Python3 10 6 https www python org ftp python 3 10 6 python 3 10 6 amd64
  • 马来西亚旅游不可不去的世外桃源

    全马最漂亮的8大冷门 世外桃源 美到您都不相信这些地方竟然在马来西亚 1 Pulau Besar 柔佛州 情侣来这旅游或蜜月 真的最适合不过了 想要找一个宁静 舒服 温暖的海边度假吗 那么PulauBesar 或许适合你 这里没有其他海边来
  • numpy.arrange函数知识大全

    numpy arrange函数知识大全 numpy arrange函数作用 numpy arrange函数作用 numpy arrange函数的作用是生成带起点和终点的特定步长的排列 根据函数的参数的个数分为以下几种情况 1 只有一个参数
  • 使用Android studio 查看其它app的布局的结构

    日常开发过程中 难免会遇到一些比较好看的布局 这时候我们就想学习一下别人的布局结构 以便参考 如果是前端开发的话 直接用Chrome可以查看别人布局的结构 如果是android的就比较麻烦一些 不过也是可以的 只需要简单的两步 下面来演示一
  • 逻辑判断

    一 论证推理 1 1 基本原理 论证的基本原理 话题一致 例如 甲论证 中国足球不行 这个论点时 乙说 你行你上 这就是典型的话题不一致 因为 我足球行不行 和 国足行不行 是没有关系的 1 2 解题步骤 所有的论据都是为论点服务的 1 明
  • vs+qt添加qtOpengl时,要小写

    奇怪了 一开始添加模块时 写成了Opengl 是qmake错误 改成opengl就可以了
  • 一个简单的测试案例

    题目 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计 其规格说明如下 若投入5角钱或1元钱的硬币 押下 橙汁 或 啤酒 的按钮 则相应的饮料就送出来 若售货机没有零钱找 则一个显示 零钱找完 的红灯亮 这时在投入1元硬币并押下按
  • Python · 无限画板(零)· 简介

    项目 GitHub 地址 免费线上示例产品 该示例产品的源代码 封面图对应的项目的源代码 需求 方案 在上一篇文章 用 Python 打造 AIGC 的 操作系统 里 我提到过这个 Python 无限画板的项目 carefree drawb
  • Pytorch CAM特征可视化

    背景 类别激活映射 Class Activation Mapping CAM 用于对深度学习特征可视化 通过特征响应定位图像的关键部位 为深度学习可解释性提供了一种方法 ACM以热力图的方式展示了图像局部响应的强弱信息 对应于更强的位置具有
  • 无线打印机服务器安全吗,注意安全 彻底拒绝打印机被非法共享

    为了提高打印机的利用率 不少单位往往会通过局域网对打印机进行共享使用 不过这样一来 局域网内的非法用户也有可能趁机使用共享打印机 从而造成打印成本的 节节攀升 为了阻止非法用户对打印机随意进行共享 本文特意总结了以下几则 拒绝 妙招 相信这
  • 2021 Android面经及求职总结

    投递情况 主要投递了国内和国外的互联网公司 同时也投递了一些币圈企业 最终斩获battmd offer和一币圈的百万年薪offer 关于如何准备面试 可以关注我的面试准备系列文章如何准备一场技术面试 offer斩获情况 大大小小共12家公司
  • K8S学习之Statefulset

    Statefulset概念 应用场景包括 1 稳定的持久化存储 即Pod重新调度后还是能访问到相同的持久化数据 基于PVC来实现 2 稳定的网络标志 即Pod重新调度后其PodName和HostName不变 基于Headless Servi
  • MySQL 异步复制源自动故障转移

    1 异步复制源架构 1 1基于主从复制的异步复制源 从MySQL 8 0 22开始支持异步连接故障转移机制 我们可以在一套主从复制架构的基础上 创建一个异步复制连接的Replica副本 当主从复制Source发生意外宕机 业务提升Repli