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 异步复制源自动故障转移 的相关文章

  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • Mysql 时间匹配连接

    我有两个表cpuinfo和jobinfo 我想使用这两种数据创建报告 tabes CREATE TABLE cpuinfo id int 11 NOT NULL AUTO INCREMENT usagetime datetime DEFAU
  • MySQL:计算日期/时间之间的差异 - 仅在周一至周五“工作周”期间

    我需要计算开始日期 时间和结束日期 时间之间的差异 但是 我只想在 5 天的工作周内执行此操作 不包括周六 周日 做这个的最好方式是什么 我的想法是 从日期开始 我必须获取星期几 如果是工作日 那么我将添加到累加器中 如果不是 那么我不会添
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • MySql - 复制监控工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个主 从 MySql 复制 我正在寻找一个允许我监视复制的工具 查看它没有错误 检查滞后等 我更喜
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • covertJSONtoSQL 在 NiFi 中返回空值

    我正在设计一项工作 使用以下命令将数据从 MySQL 中的数据库转移到另一个数据库 MySQL 执行SQL处理器随后将Avro转换为Json then 将Json转换为SQL then PutSQL如下流程图所示 将JSON转换为SQL返回
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • PHP 和 MySQL - 高效处理多个一对多关系

    我正在寻求一些有关使用 MySQL 和 PHP 检索和显示数据的最佳方法的建议 我有 3 个表 所有一对多关系如下 Each SCHEDULE有很多覆盖每个覆盖都有很多地点 我想检索这些数据 以便它可以全部显示在单个 PHP 页面上 例如列
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • mysql排序和排名语句

    我需要一些 mysql 语句的帮助 我的表 1 有 7 列 表 2 有 8 列 额外的列名为排名 我的语句应该是这样的 从表 1 中选择全部 然后按 用户数 排序 将其插入表 2 中并排名开始 1 2 3 等 table 1 usernam
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐

  • 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