本节解释了要用于组复制的 MySQL 服务器实例所需的配置设置。有关背景信息,请参见 第 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 9.0 中的组复制支持二进制日志中校验和的存在,并且可以使用校验和来验证某些通道上事件的完整性,因此您可以使用默认设置。有关更多详细信息,请参见 第 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 和视图更改事件写入二进制日志时使用的 GTID 的一部分。将
group_replication_start_on_boot
变量配置为off
指示插件在服务器启动时不要自动启动操作。这在设置组复制时很重要,因为它确保您可以在手动启动插件之前配置服务器。配置好成员后,可以将group_replication_start_on_boot
设置为on
,以便组复制在服务器启动时自动启动。配置
group_replication_local_address
将设置成员用于与组中其他成员进行内部通信的网络地址和端口。组复制使用此地址进行涉及组通信引擎(XCom,一种 Paxos 变体)的远程实例的内部成员到成员连接。重要组复制本地地址必须与用于 SQL 客户端连接的主机名和端口不同,这些连接由 MySQL 服务器的
hostname
和port
系统变量定义。它不能用于客户端应用程序。它只能在运行组复制时用于组成员之间的内部通信。由
group_replication_local_address
配置的网络地址必须可由所有组成员解析。例如,如果每个服务器实例都在具有固定网络地址的不同机器上,则可以使用机器的 IP 地址,例如 10.0.0.1。如果您使用主机名,则必须使用完全限定名,并确保可以通过 DNS、正确配置的/etc/hosts
文件或其他名称解析过程来解析它。IPv6 地址(或解析为 IPv6 地址的主机名)可以与 IPv4 地址一起使用;一个组可以包含使用 IPv6 的成员和使用 IPv4 的成员。有关组复制对 IPv6 网络的支持以及混合 IPv4 和 IPv6 组的更多信息,请参见 第 20.5.5 节,“对 IPv6 和混合 IPv6 和 IPv4 组的支持”。推荐用于
group_replication_local_address
的端口是 33061。Group Replication 使用此端口作为复制组内组成员的唯一标识符。只要主机名或 IP 地址都不同,就可以对复制组的所有成员使用相同的端口,如本教程中所示。或者,也可以对所有成员使用相同的主机名或 IP 地址,只要端口都不同,例如在 第 20.2.2 节“在本地部署 Group Replication” 中所示。现有成员为加入 Group Replication 分布式恢复过程的加入成员提供的连接不是
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)相同的协议与种子成员进行通信。为了对 Group Replication 进行 IP 地址权限设置,种子成员的允许列表必须包含加入成员的 IP 地址(用于种子成员提供的协议),或者包含解析为该协议地址的主机名。此地址或主机名必须设置并允许,除了加入成员的group_replication_local_address
之外(如果该地址的协议与种子成员发布的协议不匹配)。如果加入成员没有相应的协议的允许地址,则其连接尝试将被拒绝。有关更多信息,请参阅 第 20.6.4 节“Group Replication IP 地址权限”。配置
group_replication_bootstrap_group
会指示插件是否引导组。在这种情况下,即使 s1 是组的第一个成员,我们也会在选项文件中将其设置为 off。相反,我们在实例运行时配置group_replication_bootstrap_group
,以确保只有一个成员实际引导组。重要在任何时间点,
group_replication_bootstrap_group
变量只能在属于一个组的一个服务器实例上启用,通常是在您第一次引导组时(或者在整个组关闭并重新启动时)。如果您多次引导组,例如当多个服务器实例设置了此选项时,它们可能会创建人工的脑裂场景,其中存在两个具有相同名称的不同组。在第一个服务器实例上线后,始终设置group_replication_bootstrap_group=off
。
本教程中描述的系统变量是启动新成员所需的配置设置,但还有其他系统变量可用于配置组成员。这些变量在 第 20.9 节“Group Replication 变量” 中列出。
一些特定于 Group Replication,另一些不特定于 Group Replication 的系统变量是组范围的配置设置,这些设置在所有组成员上必须具有相同的值。如果组成员为这些系统变量之一设置了值,而加入成员为其设置了不同的值,则加入成员将无法加入组,并将返回错误消息。如果组成员为该系统变量设置了值,而加入成员不支持该系统变量,则它将无法加入组。所有这些系统变量都在 第 20.9 节“Group Replication 变量” 中列出。