作者: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。
1.创建一个复制通道
在副本服务器上,使用源服务器的复制凭据创建一个复制通道“ ch1”。
'rpl_user', MASTER_PASSWORD='password', MASTER_HOST='node1', MASTER_PORT=3306, MASTER_RETRY_COUNT=2 FOR CHANNEL 'ch1'; CHANGE MASTER TO MASTER_USER=
注意: 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:当有多个备用源服务器时,故障转移操作将尝试连接到权重最大的源服务器。如果未指定权重,默认为50。
在副本上,配置两个源服务器:
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),然后停止源服务器。
systemctl stop mysqld.service
6.验证复制通道是否已自动故障转移,即已连接到source2
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,直到连接失败或用户停止它为止。
7.删除源配置
如果需要删除一个或多个备用源,请在副本上使用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。并且,此功能具有以下
限制:
它不会自动获知新成员或已删除的成员
它不遵循主要角色,而是与其连接的任何主机保持连接
它不遵循多数网络分区
只要它可以连接主机,它不在乎主机是否不再属于该组
因此,请注意,在必须遵守此类要求的用例场景中,此功能不会替代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解决方案工程师”!
本文分享自微信公众号 - MySQL解决方案工程师(mysqlse)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4591256/blog/4813037