暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

社区博客 | 自动异步复制连接故障转移

点击上方蓝字关注我们





导读

MySQL 8.0.22 引入了自动异步复制连接故障转移。此功能通过自动重新建立与另一个可用源的复制连接的过程,使 MySQL 异步复制对源连接故障具有容错能力。如果多个数据中心有源服务器,用户还可以配置副本在它们之间进行故障转移,以提供整个数据中心故障的灾难恢复。可以通过在备用副本中保留数据的额外副本来维护数据库的可用性,该副本使用复制从源持续接收数据。但是,与往常一样,可能会出现与源的连接失败并且复制的数据流中断的情况。



原文作者:Hemant Dangi


关键词:MySQL、自动复制


为了解释如何使用此功能处理源故障,让我们考虑以下场景:有两个站点 – 纽约和伦敦,如下图 1 所示,通过异步复制通道 C2 连接。纽约站点中的服务器(S1、S2)也通过复制通道 C1(异步或组复制,用于自动故障转移)进行连接,这意味着 S2 在 S1 上具有数据的副本。


伦敦站点的服务器 (R1) 配置了 S1 和 S2 的源连接详细信息,因此当 S1 和 R1 之间的连接 C2 失败(图 2)时,R1 会在 S2 和 R1 之间建立新的连接 C3,如图 3 所示。




01 
用法

先决条件


在开启异步连接故障转移功能之前,所有服务器都需要使用 gtid_mode=ON,并且使用异步连接故障转移的副本必须配置 MASTER_AUTO_POSITION=1 和 CHANGE MASTER TO。

1. 创建复制通道


在副本服务器上,使用源服务器的复制凭证创建复制通道 'ch1'。
    replica> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password', MASTER_HOST='node1', MASTER_PORT=3306, MASTER_RETRY_COUNT=2 FOR CHANNEL 'ch1';

    注意:默认值 MASTER_RETRY_COUNT(86400 次)和 MASTER_CONNECT_RETRY(60 秒)是为连接到单个源而设计的,将使副本在 60 天内重试相同的连接。当这些尝试用尽时,异步连接故障转移机制将接管。因此,为了确保异步连接故障转移机制可以立即激活,请将 MASTER_RETRY_COUNT 设置为一个最小数字,该数字只允许使用同一源进行几次重试尝试,以防连接故障是由暂时性网络中断引起的。

    2. 添加异步复制通道的备用源配置详细信息


    该功能在副本上进行控制。UDF asynchronous_connection_failover_add_source() 可用于为备用源添加连接配置。
      SELECT asynchronous_connection_failover_add_source(channel, host, port, network_namespace, weight);

      此 UDF 的参数具有以下含义:
      • channel/host/port/network_namespace:复制通道连接属性,指定如何连接到此备用源。
      • weight:当指定了多个备用源时,故障转移操作将尝试连接到具有最高权重的源。如果未指定 weight,则默认为 50。

      在 replica 上,配置两个源:
        replica> SELECT asynchronous_connection_failover_add_source('ch1', 'node1', 3306, '', 80);
        +-----------------------------------------------------------------------------------------------------+
        | asynchronous_connection_failover_add_source('ch1', 'node1', 3306, '', 80) |
        +-----------------------------------------------------------------------------------------------------+
        | Source configuration details successfully inserted. |
        +-----------------------------------------------------------------------------------------------------+
        1 row in set (0,01 sec)


        replica> SELECT asynchronous_connection_failover_add_source('ch1', 'node2', 3306, '', 70);
        +-----------------------------------------------------------------------------------------------------+
        | asynchronous_connection_failover_add_source('ch1', 'node2', 3306, '', 70) |
        +-----------------------------------------------------------------------------------------------------+
        | Source configuration details successfully inserted. |
        +-----------------------------------------------------------------------------------------------------+
        1 row in set (0,01 sec)

        插入的值可以在 performance_schema 数据库的 replication_asynchronous_connection_failover 表中进行验证。
          replica> SELECT * FROM performance_schema.replication_asynchronous_connection_failover;
          +--------------+-----------+------+-------------------+--------+
          | CHANNEL_NAME | HOST | PORT | NETWORK_NAMESPACE | WEIGHT |
          +--------------+-----------+------+-------------------+--------+
          | ch1 | node1 | 3306 | | 80 |
          | ch1 | node2 | 3306 | | 70 |
          +--------------+-----------+------+-------------------+--------+
          2 rows in set (0.00 sec)

          3. 启用该功能


          使用 CHANGE MASTER TO SOURCE_CONNECTION_AUTO_FAILOVER=1 为复制通道 'ch1' 启用该功能。当复制线程正在运行时,可以使用此语句。
            replica> CHANGE MASTER TO SOURCE_CONNECTION_AUTO_FAILOVER=1 FOR CHANNEL 'ch1';
            Query OK, 0 rows affected (0.12 sec)


            replica> SELECT CHANNEL_NAME, SOURCE_CONNECTION_AUTO_FAILOVER FROM performance_schema.replication_connection_configuration WHERE CHANNEL_NAME = 'ch1';
            +--------------------------+----------------------------------+
            | CHANNEL_NAME | SOURCE_CONNECTION_AUTO_FAILOVER |
            +--------------------------+----------------------------------+
            | ch1 | 1 |
            +--------------------------+----------------------------------+
            1 row in set (0.04 sec)

            4. 启动副本通道


            在副本服务器上启动复制通道 'ch1' ,并检查其 I/O 线程状态:
              replica> START REPLICA FOR CHANNEL 'ch1';
              Query OK, 0 rows affected, 1 warning (0.03 sec)


              replica> select CHANNEL_NAME, SOURCE_UUID, SERVICE_STATE from performance_schema.replication_connection_status\G
              *************************** 1. row ***************************
              CHANNEL_NAME: ch1
              SOURCE_UUID: 14d730cf-200e-11eb-9d08-0010e0734796
              SERVICE_STATE: ON
              1 row in set (0.00 sec)



              5. 在 source1 服务器上停止 mysqld


              要查看异步连接失败机制的工作原理,请登录到 source1 的主机(本例中为 node1),然后停止源服务器。
                node1$ systemctl stop mysqld.service


                6. 验证复制通道是否已自动故障转移,即连接到 source2

                  replica> START REPLICA FOR CHANNEL 'ch1';
                  Query OK, 0 rows affected, 1 warning (0.03 sec)


                  replica> select CHANNEL_NAME, SOURCE_UUID, SERVICE_STATE from performance_schema.replication_connection_status\G
                  *************************** 1. row ***************************
                  CHANNEL_NAME: ch1
                  SOURCE_UUID: 14d730cf-200e-11eb-9d08-0010e0734796
                  SERVICE_STATE: ON
                  1 row in set (0.00 sec)



                  在故障转移到下一个配置的备用源之前,副本上的接收器线程将尝试连接到当前源 MASTER_RETRY_COUNT 次(在本例中为 2 次),如第一步中的 CHANGE MASTER TO 命令所配置。请参阅下面的错误日志。
                    replica> START REPLICA FOR CHANNEL 'ch1';
                    Query OK, 0 rows affected, 1 warning (0.03 sec)


                    replica> select CHANNEL_NAME, SOURCE_UUID, SERVICE_STATE from performance_schema.replication_connection_status\G
                    *************************** 1. row ***************************
                    CHANNEL_NAME: ch1
                    SOURCE_UUID: 14d730cf-200e-11eb-9d08-0010e0734796
                    SERVICE_STATE: ON
                    1 row in set (0.00 sec)



                    注: 仅当复制连接失败时,才会启动异步连接故障转移。因此,即使具有较高权重的旧源重新联机,复制连接也不会重新连接到旧源。同样,在我们的示例中,即使 source1 在一段时间后重新上线(mysqld 已启动),异步复制连接也将保持与 source2 的连接,直到连接失败或用户停止连接。


                    7. 删除源配置


                    如果以后需要删除一个或多个备用源,请在副本上使用 asynchronous_connection_failover_delete_source() UDF。
                      SELECT asynchronous_connection_failover_delete_source(channel, host, port, network_namespace);

                      例:
                        replica> START REPLICA FOR CHANNEL 'ch1';
                        Query OK, 0 rows affected, 1 warning (0.03 sec)


                        replica> select CHANNEL_NAME, SOURCE_UUID, SERVICE_STATE from performance_schema.replication_connection_status\G
                        *************************** 1. row ***************************
                        CHANNEL_NAME: ch1
                        SOURCE_UUID: 14d730cf-200e-11eb-9d08-0010e0734796
                        SERVICE_STATE: ON
                        1 row in set (0.00 sec)




                        02 
                        MySQL路由器

                        请注意,当 MySQL 路由器充当 MySQL InnoDB 集群前面的复制源终端节点时,此功能并不能完全取代 MySQL 路由器最值得注意的是,此功能具有以下限制:

                        • 它不会自动了解新成员或已删除的成员;

                        • 它不遵循 Primary 角色,它与它所连接的任何主机都可以保持连接;

                        • 它不遵循多数网络分区;

                        • 它不在乎主机是否不再属于该组,只要它可以连接。


                        因此,请注意,在必须遵守此类要求的用例场景中,此功能不会取代路由器。



                        03 
                        结论


                        本文展示了如何配置副本以在多个源服务器之间启用异步连接故障转移。当源或与源的连接失败时,此功能允许副本(即使在不同的数据中心)自动无缝连接到新源。


                        原文作者:Hemant Dangi
                        原文翻译:Microsoft Translator翻译
                        原文链接:
                        https://dev.mysql.com/blog-archive/automatic-asynchronous-replication-connection-failover/


                        END

                        为促进团队内外的沟通联系,我们Klustron团队的bbs论坛开始上线,欢迎各位同学使用!链接:https://forum.klustron.com/,或者点击文末“阅读原文”,即可跳转

                        论坛目前是测试版,可能还存在不稳定的现象,欢迎各位老师、朋友共享信息,如果遇到问题还请谅解。

                        欢迎大家下载和安装Klustron数据库集群,并免费使用(无需注册码)

                        Klustron 完整软件包下载:
                        http://downloads.klustron.com/

                        如需购买请邮箱联系sales_vip@klustron.com,有相关问题欢迎添加下方小助手微信联系🌹

                        产品文档

                        Klustron 快速入门:
                        https://doc.klustron.com/zh/Klustron_Instruction_Manual.html

                        Klustron 快速体验指南:
                        https://doc.klustron.com/zh/Klustron_Quickly_Guide.html

                        Klustron 功能体验范例:
                        https://doc.klustron.com/zh/Klustron-function-experience-example.html

                        Klustron 产品使用和测评指南:
                        https://doc.klustron.com/zh/product-usage-and-evaluation-guidelines.html


                         点击👆上方,关注获取源代码及技术信息~












                        文章转载自KunlunBase 昆仑数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论