Skip to main content

9.通过异步连接故障转移切换源和副本

在从副本到其源的现有连接失败后,可以使用异步连接故障转移机制自动建立到新源的异步(源到副本)复制连接。 异步连接故障转移机制可用于使副本与共享数据的多个 MySQL 服务器或服务器组保持同步。 潜在源服务器的列表存储在副本上,如果连接失败,则会根据设置的加权优先级从列表中选择新的源。

异步连接故障转移机制还支持组复制拓扑,自动监视组成员身份的更改并区分主服务器和辅助服务器。 当将组成员添加到源列表并将其定义为托管组的一部分时,异步连接故障转移机制会更新源列表以使其与成员资格更改保持一致,并在组成员加入或离开时自动添加和删除组成员。 只有占多数的在线群组成员才会用于连接和获取状态。 受管组的最后一个剩余成员即使离开该组也不会自动删除,因此受管组的配置将被保留。 但是,如果不再需要托管组,可以手动删除它。

如果当前接收者(组的主副本)发生故障,异步连接故障转移机制还使属于托管复制组的副本能够自动重新连接到发送者。 此功能与组复制配合使用,在单主模式下配置的组上,其中该组的主副本是具有使用该机制的复制通道的副本。 该功能旨在让一组发送者和一组接收者保持彼此同步,即使某些成员暂时不可用。 它还将一组接收方与不属于托管组的一个或多个发送方进行同步。 不属于复制组的副本无法使用此功能。

使用异步连接故障转移机制的要求如下:

  • 源和副本上必须使用 GTID (gtid_mode=ON),并且副本上必须启用 CHANGE REPLICATION SOURCE TO 语句的 SOURCE_AUTO_POSITION 选项,以便 GTID 自动定位用于与源的连接。
  • 通道源列表中的所有源服务器上必须存在相同的复制用户帐户和密码。 该帐户用于连接到每个源。 可以为不同的频道设置不同的帐户。
  • 必须向复制用户帐户授予对 Performance Schema 表的 SELECT 权限,例如,通过发出 GRANT SELECT ON Performance_schema.* TO 'repl_user';
  • 无法在用于启动复制的语句中指定复制用户帐户和密码,因为它们需要在自动重新启动时可用才能连接到备用源。 必须在副本上使用 CHANGE REPLICATION SOURCE TO 语句为通道设置它们,并将它们记录在复制元数据存储库中。
  • 如果使用异步连接故障转移机制的通道位于组复制单主模式组的主节点上,则默认情况下副本之间的异步连接故障转移也会处于活动状态。 在这种情况下,必须在复制组中的所有辅助服务器以及任何新加入的成员上设置复制通道以及该通道的复制用户帐户和密码。 如果使用 MySQL 的克隆功能配置新服务器,这一切都会自动发生。

重要:

如果不希望在这种情况下在副本之间发生异步连接故障转移,请使用 group_replication_disable_member_action 函数禁用组的成员操作 mysql_start_failover_channels_if_primary 来禁用它。 禁用该功能后,无需在辅助组成员上配置复制通道,但如果主组脱机或进入错误状态,该通道的复制将停止。

MySQL InnoDB ClusterSet 可通过将主 InnoDB Cluster 与其位于备用位置(例如不同数据中心)的一个或多个副本链接起来,为 InnoDB Cluster 部署提供容灾能力。 请考虑使用此解决方案来简化用于复制、故障转移和灾难恢复的新多组部署的设置。 可以采用现有的组复制部署作为 InnoDB 集群。

InnoDB ClusterSet 和 InnoDB Cluster 旨在抽象和简化设置、管理、监控、恢复和修复复制组的过程。 InnoDB ClusterSet 使用专用 ClusterSet 复制通道自动管理从主集群到副本集群的复制。 如果主集群无法正常运行,可以使用管理员命令触发组之间的受控切换或紧急故障转移。 当需求发生变化时,在初始设置后,可以轻松地将服务器和组添加到 InnoDB ClusterSet 部署中或从 InnoDB ClusterSet 部署中删除。

源的异步连接故障转移

要激活复制通道的异步连接故障转移,请在该通道的 CHANGE REPLICATION SOURCE TO 语句中设置 SOURCE_CONNECTION_AUTO_FAILOVER=1。 通道必须使用 GTID 自动定位 (SOURCE_AUTO_POSITION = 1)。

重要:

当与源的现有连接失败时,副本首先重试同一连接,次数由 CHANGE REPLICATION SOURCE TO 的 SOURCE_RETRY_COUNT 选项指定。 尝试之间的间隔由 SOURCE_CONNECT_RETRY 选项设置。 当这些尝试都用尽时,异步连接故障转移机制将接管。 请注意,这些选项的默认值是为连接到单个源而设计的,使副本在 60 天内重试相同的连接。 为了确保异步连接故障转移机制能够及时激活,请将 SOURCE_RETRY_COUNT 和 SOURCE_CONNECT_RETRY 设置为仅允许对同一源进行几次重试的最小数字,以防连接失败是由暂时的网络中断引起的。 合适的值是 SOURCE_RETRY_COUNT=3 和 SOURCE_CONNECT_RETRY=10,这使得副本重试连接 3 次,每次间隔 10 秒。

还需要设置复制通道的源列表,以指定可用于故障转移的源。 可以使用 asynchronous_connection_failover_add_source 和 asynchronous_connection_failover_delete_source 函数设置和管理源列表,以添加和删除单个复制源服务器。 要添加和删除托管服务器组,请改用 asynchronous_connection_failover_add_driven 和 asynchronous_connection_failover_delete_driven 函数。

这些函数命名相关的复制通道,并指定要添加到通道源列表或从通道源列表中删除的 MySQL 实例的主机名、端口号、网络命名空间和加权优先级(1-100,其中 100 是最高优先级)。 对于托管组,还可以指定托管服务的类型(当前仅组复制可用)以及托管组的标识符(对于组复制,这是 group_replication_group_name 系统变量的值)。 添加托管组时,只需添加一名组成员,副本会自动添加当前组成员身份中的其余成员。 删除托管组时,会同时删除整个组。

如果源列表上的另一个可用服务器具有更高的优先级(权重)设置,异步连接故障转移机制也会对连接进行故障转移。 此功能可确保副本始终保持与最合适的源服务器的连接,并且适用于托管组和单个(非托管)服务器。 对于托管组,根据源是主服务器还是辅助服务器来分配源权重。 因此,假设将托管组设置为为主节点提供较高的权重,为辅助节点提供较低的权重,则当主节点发生更改时,更高的权重将分配给新的主节点,因此副本会更改与其的连接。 如果当前连接的受管源服务器离开受管组,或者不再是受管组中的多数,则异步连接故障转移机制还会更改连接。

当对连接进行故障转移时,将在该通道的源列表中列出的备用源中选择具有最高优先级(权重)设置的源进行第一次连接尝试。 副本首先检查它是否可以连接到源服务器,或者在托管组的情况下,检查源服务器在组中的状态是否为“联机”(不是“正在恢复”或“不可用”)。 如果权重最高的源不可用,副本将尝试按权重降序排列所有列出的源,然后从权重最高的源重新开始。 如果多个源具有相同的权重,则副本会随机对它们进行排序。 如果副本需要再次开始处理列表,它会包含并重试发生原始连接失败的源。

源列表存储在 mysql.replication_asynchronous_connection_failover 和 mysql.replication_asynchronous_connection_failover_management 表中,并且可以在性能模式replication_asynchronous_connection_failover 和replication_asynchronous_connection_failover_management 表中查看。 副本使用监视器线程来跟踪托管组的成员身份并更新源列表 (thread/sql/replica_monitor)。 CHANGE REPLICATION SOURCE TO 语句的 SOURCE_CONNECTION_AUTO_FAILOVER 选项的设置和源列表将在远程克隆操作期间传输到副本的克隆。

副本的异步连接故障转移

当在通道的 CHANGE REPLICATION SOURCE TO 语句中设置 SOURCE_CONNECTION_AUTO_FAILOVER=1 时,会自动为组复制主数据库上的复制通道激活副本的异步连接故障转移。 该功能旨在让一组发送者和一组接收者保持彼此同步,即使某些成员暂时不可用。 当该功能处于活动状态并正确配置时,如果正在复制的主节点脱机或进入错误状态,则新的主节点在当选时会在同一通道上开始复制。 新的主节点使用通道的源列表来选择具有最高优先级(权重)设置的源,该源可能与原始源不同。

要配置此功能,必须在复制组中的所有成员服务器以及任何新加入的成员上设置复制通道以及该通道的复制用户帐户和密码。 确保 SOURCE_RETRY_COUNT 和 SOURCE_CONNECT_RETRY 设置为仅允许几次重试的最小数字,例如 3 和 10。可以使用 CHANGE REPLICATION SOURCE TO 设置复制通道,或者如果使用 MySQL 的克隆功能配置新服务器,则这 一切都会自动发生。 通道的 SOURCE_CONNECTION_AUTO_FAILOVER 设置会在组成员加入时从主通道广播到组成员。 如果稍后在主服务器上禁用通道的 SOURCE_CONNECTION_AUTO_FAILOVER,这也会广播到辅助服务器,并且它们会更改通道的状态以进行匹配。

注意:

以单主模式参与组的服务器必须使用 --skip-replica-start=ON 启动。 否则,服务器无法作为辅助服务器加入组。

使用组复制成员操作 mysql_start_failover_channels_if_primary 激活和停用副本的异步连接故障转移,该操作默认启用。 可以通过使用 group_replication_disable_member_action 函数在主数据库上禁用该成员操作来禁用整个组,如下例所示:

mysql> SELECT group_replication_disable_member_action("mysql_start_failover_channels_if_primary", "AFTER_PRIMARY_ELECTION");

该功能只能在主节点上更改,并且必须为整个组启用或禁用,因此不能让某些成员提供故障转移而另一些成员则不提供。 当禁用 mysql_start_failover_channels_if_primary 成员操作时,不需要在辅助成员上配置通道,但如果主服务器脱机或进入错误状态,通道的复制就会停止。 请注意,如果有多个通道具有 SOURCE_CONNECTION_AUTO_FAILOVER=1 ,则成员操作将覆盖所有通道,因此无法通过该方法单独启用和禁用它们。 在主服务器上设置 SOURCE_CONNECTION_AUTO_FAILOVER=0 以禁用单个通道。

SOURCE_CONNECTION_AUTO_FAILOVER=1 的频道的源列表会在所有组成员加入时以及更改时广播给所有组成员。 无论源是自动更新成员资格的托管组,还是使用 asynchronous_connection_failover_add_source()、asynchronous_connection_failover_delete_source()、asynchronous_connection_failover_add_management() 或 asynchronous_connection_failover_delete_management() 手动添加或更改源,都会出现这种情况。 所有组成员都会收到 mysql.replication_asynchronous_connection_failover 和 mysql.replication_asynchronous_connection_failover_management 表中记录的当前源列表。 由于源不必位于托管组中,因此可以设置该功能以将一组接收器与一个或多个备用独立发送器甚至单个发送器同步。 不属于复制组的独立副本无法使用此功能。