作者:Hemant Dangi 译:徐轶韬
MySQL 8.0.22引入了异步复制连接自动故障转移。这个功能能够自动重建一个复制连接到另一个可用的源服务器,使得MySQL异步复制对源服务器连接失败具有容错性。如果多个数据中心中都有源服务器,用户还可以为它们之间的副本配置故障转移,在整个数据中心遇到故障时进行灾难恢复。数据库的可用性是利用在备用服务器中保留的数据来实现,服务器使用复制功能从源服务器连续接收数据。但在某些情况下,源服务器的连接会失败,复制的数据流会中断。
为了解释如何使用这个功能处理源服务器故障,让我们考虑以下情形:通过异步复制通道C2连接两个站点–纽约和伦敦,如下图1所示。纽约站点中的服务器(S1,S2)通过复制通道C1(用于自动故障转移的异步或组复制)连接,这意味着S2具有S1的数据副本。
伦敦站点中的服务器(R1)配置有S1和S2的源连接详细信息,因此当S1和R1之间的连接C2失败(图2)时,R1在S2和R1之间建立新的连接C3,如图3所示。
在下一节中,我们将引导您完成该功能的配置和使用。
在启用异步连接故障转移功能之前,所有服务器都需要使用gtid_mode = ON,并且使用异步连接故障转移的副本服务器必须已将CHANGE MASTER TO配置为MASTER_AUTO_POSITION = 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设置为最小数量,仅允许使用相同的源服务器进行几次重试,以便在发生短暂网络中断时,允许连接源服务器。
该功能由副本服务器控制。UDF asynchronous_connection_failover_add_source() 可用于添加备用源服务器的连接配置。
SELECT asynchronous_connection_failover_add_source(channel, host, port, network_namespace, weight);
UDF的参数具有以下含义:
在副本上,配置两个源服务器:
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)
使用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)
在复制服务器上启动复制通道“ 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)
要查看异步连接失败机制的工作原理,请登录到source1的主机(在本示例中为node1),然后停止源服务器。
node1$ systemctl stop mysqld.service
replica> select CHANNEL_NAME, SOURCE_UUID, SERVICE_STATE from performance_schema.replication_connection_status\G
*************************** 1. row ***************************
CHANNEL_NAME: ch1
SOURCE_UUID: 6c39cb5b-2000-11eb-9783-0010e0734796
SERVICE_STATE: ON
1 row in set (0.00 sec)
在故障转移到下一个已配置的备用源服务器之前,副本服务器上的接收线程将尝试连接到当前源服务器的MASTER_RETRY_COUNT次(在这种情况下为2次),如第一步中的CHANGE MASTER TO命令所配置。请参阅下面的错误日志。
2020-11-06T08:57:47.078756Z 37 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'root@node1:3306' - retry-time: 1 retries: 1 message: Can't connect to MySQL server on 'node1' (111), Error_code: MY-002003
2020-11-06T08:57:48.079089Z 37 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'root@node1:3306' - retry-time: 1 retries: 2 message: Can't connect to MySQL server on 'node1' (111), Error_code: MY-002003
2020-11-06T08:57:48.079145Z 37 [Note] [MY-010563] [Repl] Slave I/O thread for channel '' killed while connecting to master
2020-11-06T08:57:49.081452Z 37 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2020-11-06T08:57:49.083093Z 37 [System] [MY-010562] [Repl] Slave I/O thread for channel '': connected to master 'root@node1:3306',replication started in log 'FIRST' at position 642
2020-11-06T08:57:49.086941Z 37 [Warning] [MY-010549] [Repl] The master's UUID has changed, although this should not happen unless you have changed it manually. The old UUID was 14d730cf-200e-11eb-9d08-0010e0734796.
注意:仅当复制连接失败时,才会启动异步连接故障转移。因此,即使权重较高的旧源重新联机,复制连接也不会重新连接到旧源。类似地,在我们的示例中,即使一段时间后source1重新联机(mysqld已启动),异步复制连接也将保持连接到source2,直到连接失败或用户停止它为止。
如果需要删除一个或多个备用源,请在副本上使用asynchronous_connection_failover_delete_source()UDF。
SELECT asynchronous_connection_failover_delete_source(channel, host, port, network_namespace);
例:
mysql> SELECT asynchronous_connection_failover_delete_source('ch1', 'node1', 3306, '');
+---------------------------------------------------------------------------------------------------+
| asynchronous_connection_failover_delete_source('ch1', 'node1', 3306, '') |
+---------------------------------------------------------------------------------------------------+
| Source configuration details successfully deleted. |
+---------------------------------------------------------------------------------------------------+
1 row in set (0,01 sec)
请注意,此功能不能完全替代MySQL Router。并且,此功能具有以下 限制:
因此,请注意,在必须遵守此类要求的用例场景中,此功能不会替代MySQL Router。
我们展示了如何配置副本服务器在多个源服务器之间启用异步连接故障转移。当源服务器或与其连接失败时,此功能允许副本服务器(即使在其他数据中心)可以自动无缝地连接到新的源服务器。希望您会喜欢此功能,并希望它为跨数据中心复制通道提供更高的容错能力。
请参阅文档https://dev.mysql.com/doc/refman/8.0/en/replication-asynchronous-connection-failover.html以获取有关如何配置和使用功能的更多详细信息,并参阅工作日志https://dev.mysql.com/worklog/task/?id=12649以获取技术规格。
本文分享自 MySQL解决方案工程师 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!