本节介绍要用于组复制的 MySQL Server 实例所需的配置设置。有关背景信息,请参见 第 20.3 节,“要求和限制”。
对于组复制,数据必须存储在 InnoDB 事务存储引擎中(有关原因的详细信息,请参见 第 20.3.1 节,“组复制要求”)。使用其他存储引擎,包括临时 MEMORY
存储引擎,可能会导致组复制中的错误。设置以下 disabled_storage_engines
系统变量以防止使用它们
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
以下设置根据 MySQL 组复制要求配置复制。
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
这些设置将服务器配置为使用唯一标识符编号 1,以启用 第 19.1.3 节,“使用全局事务标识符复制”,并且只允许执行可以使用 GTID 安全记录的语句。
此设置禁用写入二进制日志的校验和,这些校验和默认情况下是启用的。MySQL 8.4 中的组复制支持二进制日志中校验和的存在,并且可以在某些通道上使用它们来验证事件的完整性,因此您可以使用默认设置。有关更多详细信息,请参见 第 20.3.2 节,“组复制限制”。
另请参见 第 20.3.1 节,“组复制要求”。
此时,选项文件确保服务器已配置,并指示其在给定配置下实例化复制基础结构。以下部分配置服务器的组复制设置。
plugin_load_add='group_replication.so'
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
将组复制插件添加到服务器在启动时加载的插件列表中。在生产部署中,这优于手动安装插件。配置
group_replication_group_name
会告诉插件它要加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”。group_replication_group_name
的值必须是有效的 UUID。您可以使用SELECT UUID()
生成一个。此 UUID 构成了从客户端接收到的事务以及组成员内部生成的视图更改事件写入二进制日志时使用的 GTID 的一部分。将
group_replication_start_on_boot
变量配置为off
会指示插件在服务器启动时不要自动启动操作。在设置组复制时这很重要,因为它确保您可以在手动启动插件之前配置服务器。配置好成员后,您可以将group_replication_start_on_boot
设置为on
,以便组复制在服务器启动后自动启动。配置
group_replication_local_address
会设置成员用于与组中其他成员进行内部通信的网络地址和端口。组复制使用此地址进行涉及组通信引擎(XCom,一种 Paxos 变体)的远程实例的内部成员到成员连接。重要组复制本地地址必须不同于用于 SQL 客户端连接的主机名和端口,这些连接由 MySQL Server 的
hostname
和port
系统变量定义。它不能用于客户端应用程序。它只能在运行组复制时用于组成员之间的内部通信。由
group_replication_local_address
配置的网络地址必须可由所有组成员解析。例如,如果每个服务器实例都在具有固定网络地址的不同机器上,则可以使用机器的 IP 地址,例如 10.0.0.1。如果您使用主机名,则必须使用完全限定名,并确保它可以通过 DNS、正确配置的/etc/hosts
文件或其他名称解析过程进行解析。IPv6 地址(或解析为它们的主机名)以及 IPv4 地址都可以使用;组可以包含使用 IPv6 的成员和使用 IPv4 的成员。有关组复制对 IPv6 网络的支持以及混合 IPv4 和 IPv6 组的更多信息,请参见 第 20.5.5 节,“对 IPv6 和混合 IPv6 和 IPv4 组的支持”。建议为
group_replication_local_address
使用的端口为 33061。它被组复制用作复制组内组成员的唯一标识符。只要主机名或 IP 地址不同,您就可以在复制组的所有成员中使用相同的端口,本教程中对此进行了演示。或者,您可以对所有成员使用相同的主机名或 IP 地址,只要端口不同即可,例如,在第 20.2.2 节,“在本地部署组复制” 中所示。现有成员为组复制的分布式恢复过程提供的连接,不是由
group_replication_local_address
配置的网络地址。组成员为加入的成员提供其标准 SQL 客户端连接以进行分布式恢复,如 MySQL Server 的hostname
和port
所指定;它们可能(也)会将替代的分布式恢复端点列表作为专用客户端连接公布给加入的成员。有关更多详细信息,请参阅第 20.5.4.1 节,“分布式恢复的连接”。重要如果加入的成员无法使用 MySQL Server 的
hostname
系统变量中定义的主机名正确识别其他成员,则分布式恢复可能会失败。建议运行 MySQL 的操作系统具有正确配置的唯一主机名,无论是使用 DNS 还是本地设置。可以在 Performance Schema 表replication_group_members
的Member_host
列中验证服务器正在用于 SQL 客户端连接的主机名。如果多个组成员外部化操作系统设置的默认主机名,则加入的成员可能无法将其解析为正确的成员地址,也无法连接以进行分布式恢复。在这种情况下,您可以使用 MySQL Server 的report_host
系统变量来配置每个服务器要外部化的唯一主机名。配置
group_replication_group_seeds
会设置组成员的主机名和端口,新成员使用它们建立与组的连接。这些成员被称为种子成员。一旦建立连接,组成员信息就会列在 Performance Schema 表replication_group_members
中。通常group_replication_group_seeds
列表包含每个组成员的group_replication_local_address
的hostname:port
,但这并非强制要求,可以选取组成员的子集作为种子。重要在
group_replication_group_seeds
中列出的hostname:port
是种子成员的内部网络地址,由group_replication_local_address
配置,而不是用于 SQL 客户端连接的hostname:port
,例如,在 Performance Schema 表replication_group_members
中显示。启动组的服务器不使用此选项,因为它是最早的服务器,因此负责引导组。换句话说,启动组的服务器上存在的任何现有数据都用作下一个加入成员的数据。加入的第二个服务器会要求组中唯一的一个成员加入,第二个服务器上缺少的任何数据都会从引导成员上的捐赠者数据进行复制,然后组就会扩展。加入的第三个服务器可以要求这两个服务器中的任何一个加入,数据会同步到新成员,然后组就会再次扩展。后续服务器在加入时会重复此过程。
警告同时加入多个服务器时,请确保它们指向已在组中的种子成员。不要使用也正在加入组的成员作为种子,因为它们在被联系时可能尚未加入组。
最好先启动引导成员,让它创建组。然后将其设为加入其他成员的种子成员。这样可以确保在加入其他成员时已经形成了组。
不支持同时创建组和加入多个成员。它可能会起作用,但很可能操作会发生竞态条件,然后加入组的操作最终会导致错误或超时。
加入的成员必须使用种子成员在
group_replication_group_seeds
选项中公布的相同协议(IPv4 或 IPv6)与种子成员进行通信。为了对组复制进行 IP 地址权限,种子成员上的允许列表必须包含加入成员的 IP 地址(用于种子成员提供的协议),或者包含解析为该协议地址的主机名。除了加入成员的group_replication_local_address
之外,还必须设置和允许此地址或主机名,如果该地址的协议与种子成员公布的协议不匹配。如果加入的成员没有适当协议的允许地址,则会拒绝其连接尝试。有关更多信息,请参阅第 20.6.4 节,“组复制 IP 地址权限”。配置
group_replication_bootstrap_group
会指示插件是否要引导组。在本例中,即使 s1 是组的第一个成员,我们也会在选项文件中将此变量设置为 off。而是会在实例运行时配置group_replication_bootstrap_group
,以确保只有一个成员实际上引导组。重要group_replication_bootstrap_group
变量只能在任何时间属于组的单个服务器实例上启用,通常是在您第一次引导组时(或者在整个组被关闭并再次启动时)。如果多次引导组,例如,当多个服务器实例设置了此选项时,它们可能会创建人工脑裂场景,其中存在两个名称相同但不同的组。在第一个服务器实例上线后,始终将group_replication_bootstrap_group=off
设置为 off。
本教程中描述的系统变量是启动新成员所需的配置设置,但还有其他系统变量可用于配置组成员。这些变量列在第 20.9 节,“组复制变量” 中。
一些特定于组复制,而另一些则不特定的系统变量是组范围内的配置设置,它们在所有组成员上必须具有相同的值。如果组成员为其中一个系统变量设置了值,而加入的成员为其设置了不同的值,则加入的成员将无法加入组,并且会返回错误消息。如果组成员为此系统变量设置了值,而加入的成员不支持此系统变量,则它将无法加入组。这些系统变量都已在第 20.9 节,“组复制变量” 中标识。