17.2.1.2 为组复制配置实例

本节说明了要用于组复制的 MySQL Server 实例所需的配置设置。有关背景信息,请参见第 17.7 节“要求和限制”

Storage Engines

对于组复制,数据必须存储在 InnoDB 事务存储引擎中(有关原因的详细信息,请参见第 17.7.1 节“组复制要求”)。使用其他存储引擎(包括临时MEMORY存储引擎)可能会导致组复制中的错误。如下设置disabled_storage_engines系统变量,以防止其使用:

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

请注意,在禁用MyISAM存储引擎的情况下,将 MySQL 实例升级到仍使用mysql_upgrade的发行版(在 MySQL 8.0.16 之前)时,mysql_upgrade可能会因错误而失败。要解决此问题,您可以在运行mysql_upgrade时重新启用该存储引擎,然后在重新启动服务器时再次将其禁用。有关更多信息,请参见第 4.4.7 节“ mysql_upgrade-检查和升级 MySQLtable”

Replication Framework

以下设置根据 MySQL 组复制要求配置复制。

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

这些设置将服务器配置为使用唯一标识符 1,以启用全局事务标识符并将复制元数据存储在系统 table 中而不是文件中。此外,它指示服务器打开二进制日志记录,使用基于行的格式并禁用二进制日志事件校验和。有关更多详细信息,请参见第 17.7.1 节“组复制要求”

组复制设置

此时,选项文件可确保已配置服务器,并指示该服务器在给定配置下实例化复制基础结构。以下部分为服务器配置“组复制”设置。

plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s1:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group=off
  • plugin-load-add将“组复制”插件添加到服务器在启动时加载的插件列 table 中。在生产部署中,这比手动安装插件更好。

  • 配置group_replication_group_name会告诉插件它正在加入或创建的组名为“ aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaaaa”。

group_replication_group_name的值必须是有效的 UUID。在二进制日志中为组复制事件设置 GTID 时在内部使用此 UUID。您可以使用SELECT UUID()生成 UUID。

  • group_replication_start_on_boot变量配置为off会指示插件在服务器启动时不自动启动操作。这在设置组复制时非常重要,因为它可以确保您可以在手动启动插件之前配置服务器。配置成员后,您可以将group_replication_start_on_boot设置为on,以便在服务器启动时自动启动组复制。

  • 配置group_replication_local_address设置成员用于与组中其他成员进行内部通信的网络地址和端口。组复制将此地址用于涉及组通信引擎的远程实例(XCom,Paxos 的变体)的内部成员间连接。

Important

该地址必须与用于 SQL 的hostnameport不同,并且不得用于 Client 端应用程序。运行组复制时,只能将其用于组成员之间的内部通信。

所有组成员都必须能够解析由group_replication_local_address配置的网络地址。例如,如果每个服务器实例位于具有固定网络地址的不同计算机上,则可以使用计算机的 IP 地址,例如 10.0.0.1. 如果使用主机名,则必须使用标准名称,并确保可以通过 DNS,正确配置的/etc/hosts文件或其他名称解析过程来解析它。从 MySQL 8.0.14 起,可以使用 IPv6 地址(或解析为它们的主机名)以及 IPv4 地址。组可以包含使用 IPv6 的成员和使用 IPv4 的成员的混合。有关 IPv6 网络的组复制支持以及 IPv4 和 IPv6 混合组的更多信息,请参见支持 IPv6 以及混合的 IPv6 和 IPv4 组

group_replication_local_address的推荐端口为 33061.组复制将group_replication_local_address用作复制组中组成员的唯一标识符。只要主机名或 IP 地址都不同,就可以对复制组的所有成员使用相同的端口,如本教程所示。或者,您可以对所有成员使用相同的主机名或 IP 地址,只要端口都不同(例如第 17.2.2 节“在本地部署组复制”中所示)即可。

Important

group_replication_group_seeds中列出的hostname:port是种子成员的内部网络地址,由group_replication_local_address配置,而不是用于 Client 端连接的 SQL hostname:port,例如在performance_schema.replication_group_memberstable 中显示。

启动组的服务器不使用此选项,因为它是初始服务器,因此它负责引导组。换句话说,引导该组的服务器上的任何现有数据都将用作下一个加入成员的数据。第二个服务器联接要求组中的一个成员唯一加入,第二个服务器上的所有丢失数据都将从引导成员上的施主数据中复制,然后组扩展。第三个服务器加入可以要求这两个中的任何一个加入,数据同步到新成员,然后该组再次扩展。后续服务器在加入时重复此过程。

Warning

同时加入多台服务器时,请确保它们指向组中已经存在的种子成员。不要将也加入该组的成员用作种子,因为联系后它们可能尚未加入该组。

优良作法是先启动引导程序成员,然后让其创建组。然后,使其成为要加入的其余成员的种子成员。这样可以确保在加入其余成员时形成一个组。

不支持同时创建组和加入多个成员。可能有效,但是操作很可能会竞争,然后加入该组的操作最终会出错或超时。

Important

group_replication_bootstrap_group变量只能在任何时候(通常是在第一次引导该组时)(或者在整个组关闭后又重新备份的情况下)在任何时候都在一个服务器实例上启用。如果您多次引导该组,例如,当多个服务器实例设置了此选项时,它们可能会创建一个人为分裂的场景,其中存在两个具有相同名称的不同组。在第一个服务器实例联机后,请始终设置group_replication_bootstrap_group=off

该组中所有服务器的配置都非常相似。您需要更改每个服务器的详细信息(例如server_iddatadirgroup_replication_local_address)。本教程稍后将对此进行说明。