本节列出特定于 MGR 插件的系统变量。每个系统变量的前缀都是“group_replication”字符串。
组复制的大多数系统变量都是动态的,它们的值可以在MySQL Server运行时更改。但是,在大多数情况下,需要使用STOP GROUP_REPLICATION语句和START GROUP_REPLICATION语句重启组复制之后才会生效。而一小部分系统变量,修改它们的值会立即生效,不需要重启组复制,这些系统变量与流量控制相关,如下:
- group_replication_flow_control_applier_threshold
- group_replication_flow_control_certifier_threshold
- group_replication_flow_control_mode
组复制的大多数系统变量在不同的组成员中可以设置不同的值,但对于以下系统变量,建议对组中的所有成员设置相同的值,以避免导致不必要的事务回滚、消息传递失败或消息恢复失败:
- group_replication_auto_increment_increment
- group_replication_communication_max_message_size
- group_replication_compression_threshold
- group_replication_message_cache_size
- group_replication_transaction_size_limit
组复制的少数系统变量和一些普通系统变量的设置会影响到整个组,因此这些系统变量在整个组的所有成员中必须设置为相同的值,且,组在运行时不能更改,需要先停止组复制,然后进行修改,修改了这些系统变量的值之后,还必须将整个组重新引导才会生效,而不仅仅只是重启某个成员上的组复制(这里不是指的重新启动整个组的数据库Server进程,而是整个组重新引导启动,即,使用系统变量group_replication_bootstrap_group= on重新引导组)。这些系统变量如下:
- group_replication_single_primary_mode
- group_replication_enforce_update_everywhere_checks
- group_replication_gtid_assignment_block_size
- default_table_encryption
- lower_case_table_names
- transaction_write_set_extraction
从MySQL 8.0.16,可以使用group_replication_switch_to_single_primary_mode()和group_replication_switch_to_multi_primary_mode () UDF来动态修改系统变量group_replication_single_primary_mode和group_replication_enforce_update_everywhere_checks的值(注意,修改这两个系统变量的值由函数自动完成,非手工修改)。有关更多信息,请参见"4.1.2. 修改组的运行模式"。
注意:
- 组复制的许多系统变量,如果在MySQL Server启动时以命令行的方式传递给Server,则在Server启动期间不会完全验证其值的有效性。这些系统变量包括group_replication_group_name、group_replication_single_primary_mode、group_replication_force_members、SSL相关的系统变量和流量控制相关的系统变量,这些系统变量的值只有在Server启动之后才能完全验证它们。
- 在执行START GROUP_REPLICATION语句之前,不会对组复制的系统变量指定的IP地址、主机名等进行验证。因为在未启动组复制之前,组复制的组通信系统(GCS)不可用。
- 组复制的状态变量在MySQL 5.7版本中只有3个,在MySQL 8.0版本中只有4个,其中状态变量group_replication_primary_member在8.0版本中已经弃用,在将来的版本中将会删除(该状态变量在组处于单主模式时,表示主要节点的UUID,组处于多主模式时,该状态变量值是一个空字符串) * Mysqlx_notified_by_group_replication:MySQL 8.0中新增的全局状态变量,表示发送到组的通知(报告)数量 * Com_group_replication_start:全局,会话状态变量,表示执行start group_replication语句的次数 * Com_group_replication_stop:全局,会话状态变量,表示执行stop group_replication语句的次数
接下来,将逐一对MGR插件特有的系统变量进行详细介绍
8.1. group_replication_allow_local_disjoint_gtids_join
即使该组中缺失一些事务(joiner节点比组中的事务还要多),也允许joiner节点加入该组。
警告:慎用该参数,不正确的使用可能会导致复制组中的数据出现不一致。
全局变量,动态变量,布尔型,默认值为OFF,MySQL 5.7.17版本引入,5.7.21版本弃用,8.0.4版本中删除。
8.2. group_replication_allow_local_lower_version_join
设置当joiner节点使用的MySQL Server版本低于复制组中其他成员的MySQL Server版本时,是否允许其加入该复制组。设置为OFF时,如果joiner节点的Server版本低于组中最低MySQL Server版本,则不允许加入组。这样做是为了使得组中所有成员都能够正常地进行消息交换和应用事务。
该系统变量仅在如下情况设置为ON。
- 在只有旧版本可用的紧急情况下必须将旧版本的Server加入到组中,以提高组的容错能力。
- 需要回退组中的一个或多个组成员的升级操作,但不需要关闭整个组重新进行引导。
注意:
- MySQL 8.0.17及其之后的版本在比对版本号时,会考虑次要版本号(例如:MySQL 8.0.17,会将次要版本号17一起进行比较),在MySQL 8.0.16及其之前的版本在比对版本号时,只考虑主要版本号(例如:MySQL 5.7.22,只比对主要版本号5.7)。
- 将该系统变量设置为ON并不会使低版本的Server与组兼容,但能允许低版本Server加入组,不过没有任何措施来防止低版本Server与组中现有成员的不兼容行为,因此,为了确保低版本Server的正确操作,必须人为确保如下两项措施,如果不能确保这两项措施,则运行低版本的Server可能会碰到错误而导致加入组失败。 * 运行较低版本的Server加入组之前,必须先停止该Server上的任何写操作 * 从运行较低版本的Server加入组的位置开始,停止对组中所有成员的任何写操作
全局变量,动态变量,布尔型,默认为OFF,MySQL 5.7.17版本引入。
8.3. group_replication_auto_increment_increment
自动设置复制组中的每个成员的自增列的步长值,以确保在多主模式的组中,每个组成员的自增列值有序且不重叠。
该系统变量的值在所有组成员上必须相同,一旦在某个Server中启动组复制,则该Server的普通系统变量auto_increment_inncrement将会被设置为组系统变量group_replication_auto_increment_increment的值,将普通系统变量auto_increment_offset设置为Server id值。通过这些设置调整可以避免在多节点写的情况下不同组成员使用相同的自增值导致事务发生冲突回滚。
注意:
- 当成员停止组复制时,普通系统变量auto_increment_inncrement和auto_increment_offset的值将会恢复原状(启动组复制之前的值)
- 只有当系统变量auto_increment_increment和auto_increment_offset保持默认值时,组复制启动时才会自动做与组复制的适配调整和恢复,如果这两个系统变量的值被设置了非默认值,则组复制不会做自动调整(从MySQL 8.0开始,当组处于单主模式下时,这两个系统变量也不会做自动调整)。所以,对于这两个系统变量的值,要么在组复制下不对其进行手工指定(让其使用默认值),要么就一定要设置正确,否则,在多主模式的主中,很容易造成主键冲突。
- 系统变量group_replication_auto_increment_increment在组复制运行时无法修改,需要先停止组复制,修改该系统变量的值,然后再启动组复制
全局变量,动态变量,整型类型,默认值为7(如果你的组中有更多或更少的组成员,则,可以在组复制启动之前调整好该系统变量的值,以对应你的组中的成员数量),取值范围:1~65535。MySQL 5.7.17版本引入。
8.4. group_replication_autorejoin_tries
如果成员被剔除出组、或者在超过系统变量group_replication_unreachable_majority_timeout设置的时间内无法与组中大多数成员取得联系时,该系统变量设置成员自动执行重新加入组的尝试次数。默认设置为0,表示不尝试自动重新加入组,而是继续往后执行系统变量group_replication_exit_state_action指定的退出的操作。
如果为该系统变量设置一个非0值,则当成员被驱逐出组、超过系统变量group_replication_unreachable_majority_timeout设置的时间内无法与组中大多数成员取得联系时,该成员将按照系统变量group_replication_autorejoin_tries设置的次数尝试自动重新加入组,直到达到系统变量group_replication_autorejoin_tries定义的最大尝试次数为止。在尝试自动重新加入组的过程中,每一次尝试之后,会等待5分钟之后再做下一次尝试。在整个自动重试的过程中,该组成员始终保持超级只读模式,并在其组视图上显示为ERROR状态。对于该成员,可以随时使用STOP GROUP_REPLICATION语句停止组辅助,或者关闭Server进程。当该成员达到系统变量group_replication_autorejoin_tries定义的最大重试次数之后,仍然没有成功加入组时,就会继续执行系统变量group_replication_exit_state_action指定的退出操作。
全局变量,动态变量,整型类型,默认值为0,取值范围为:0~2016,MySQL 8.0.16版本引入。
PS:关于该系统变量的更多详细信息,可参考"6.6.3. 自动重新加入组"。
8.5. group_replication_bootstrap_group
指定使用哪个Server来引导组(这里指的是将此系统变量设置为ON的Server)。该系统变量只能在一个Server上设置,并且只能在首次引导组或重新引导整个组时在其中一个Server上设置。当复制组引导成功之后需要及时将该系统变量为OFF来动态关闭(在组所有可能涉及的Server的配置文件中建议统一将此系统变量设置为OFF)。如果在某Server上使用该变量引导复制组之后再在另外一个Server中使用该变量引导复制组,则如果两个Server使用了相同的组名称时,可能会产生人为的脑裂。
全局变量,动态变量,布尔型,默认为OFF,MySQL 5.7 17版本引入。
8.6. group_replication_clone_threshold
该系统变量指定的数值,表示一个事务间隙(事务数量),在分布式恢复过程中,复制组(这里指的donor节点)和申请加入组的Server(这里指的joiner节点)之间的事务差数量超过了该系统变量指定的阈值时,则组复制将通过远程克隆操作进行分布式恢复,即,joiner节点使用远程克隆操作进行状态传输。如果事务数量差异低于该系统变量指定的阈值、或者如果远程克隆操作在技术上不可行,则组复制将直接使用donor节点的二进制日志进行状态传输。
- 注意:在一个活跃的组中(不断有事务写入),系统变量group_replication_clone_threshold不要设置过低的值。如果在进行远程克隆操作期间,组中新写入了大量的事务(事务数量超过了该系统变量设置的阈值),则joiner节点在重新启动后可能再次触发远程克隆操作,极端情况下可能导致无限循环远程克隆操作。要避免这种情况,请确保在执行远程克隆操作期间,组内新写入的事务数量不会超过该系统变量的阈值(需要根据以往的事务量统计数据估算在执行远程克隆操作期间执行的事务总数,然后,将该系统变量的值设置为远大于该估算值即可)。
必须事先对donor节点和joiner的节点进行设置以支持远程克隆操作。有关更多说明,请参阅"4.3.1. 克隆用于分布式恢复"。当远程克隆操作执行完成之后,组复制将会自动管理新加入组的成员,例如:重启joiner节点的Server进程,并将设置系统变量group_replication_start_on_boot=ON,不需要人工干预。但如果不使用远程克隆操作,则必须手动重启joiner节点的Server进程。另外,由于远程克隆操作将会替换joiner节点上现有的数据字典,所以组复制会检查joiner节点中是否存在组中没有的事务,如果存在,则分布式恢复操作将无法继续(报错终止),因为这些额外的事务将会被远程克隆操作删除(存在丢失数据的风险,因此需要先自行处理这些额外的事务)。
默认设置为 9223372036854775807,这是GTID中允许的事务最大序列号(该数值也是计算机中最大的64位有符号的整型值,即,2^63 - 1),这意味着从donor节点到joiner节点之间的分布式恢复总是会优先尝试使用基于二进制日志的状态传输,而不是基于克隆操作的状态传输。但是,要注意,如果无法使用donor节点的二进制日志进行状态传输,则无论阈值如何设置,组复制总是会尝试执行基于远程克隆操作的状态传输。例如,因为joiner节点所需的事务在组中任何现有成员的二进制日志中都不可用(无法找到)。如果您不想在组复制中使用克隆功能,则请不要在任何Server上安装克隆插件。
全局变量,动态变量,整型类型,默认值为9223372036854775807,取值范围为:1~9223372036854775807,MySQL 8.0.17版本引入。
8.7. group_replication_communication_debug_options
为组复制不同的组件设置不同的调试消息级别。例如,针对组通信系统(GCS)和组通信引擎(XCom, Paxos变体),需要使用该系统变量设置对应MGR组件的值,以启用不同MGR组件的调试信息。调试信息存储在数据目录中(datadir指定的路径)的GCS_DEBUG_TRACE文件中。
该系统变量的有效字符串值如下:
- GCS_DEBUG_NONE:禁用GCS和XCOM的所有调试级别信息。
- GCS_DEBUG_BASIC:启用GCS中的基本调试信息。
- GCS_DEBUG_TRACE:启用GCS中的跟踪信息。
- XCOM_DEBUG_BASIC:启用XCOM中的基本调试信息。
- XCOM_DEBUG_TRACE:启用XCOM中跟踪信息。
- GCS_DEBUG_ALL:启用GCS和XCOM中所有的调试级别信息。
对于系统变量group_replication_communication_debug_options的设置,可以同时设置多个调试级别值,多个值之间使用逗号分隔。当设置调试级别GCS_DEBUG_NONE时,只有不带其他调试级别选项值时GCS_DEBUG_NONE才会生效,如果有其他更高级别的值,则,其他调试级别的设置值生效(可以多个调试级别同时生效)。但是,如果将调试级别设置为GCS_DEBUG_ALL,则该设置值将覆盖所有其他值(只剩下这一个值)。
全局变量,动态变量,字符串类型,默认值为GCS_DEBUG_NONE,有效值如上所述,MySQL 8.0.3版本引入。
8.8. group_replication_communication_max_message_size
为组复制的组通信设置最大消息大小。大于这个大小的消息会被自动分割成片段并分别进行发送,由接收者将这些消息分段进行重新组装。有关更多信息,请参见"6.4 消息分段”。
该系统变量的默认设置为10485760字节(10 MiB),在MySQL 8.0.16版本中默认启用了消息分段。其最大允许值与系统变量slave_max_allowed_packet的最大值相同,后者是1073741824字节(1 GB)。系统变量group_replication_communication_max_message_size的设置必须小于系统变量slave_max_allowed_packet的设置,因为从库的应用线程(单线程复制为SQL线程,多线程复制为worker线程)不能处理大于系统变量slave_max_allowed_packet设定大小的消息片段。将系统变量group_replication_communication_max_message_size设置为0值表示关闭消息分段功能。
- 注意:系统变量group_replication_communication_max_message_size的值需要在组中所有组成员中设置为相同的值。
要在组复制中使用消息分段,组的通信协议版本必须是MySQL 8.0.16或以上。在组中任意成员中使用group_replication_get_communication_protocol() UDF可以查看到组的通信协议版本。低于8.0.16版本的组通讯协议不支持消息分段。可以使用group_replication_set_communication_protocol() UDF将组的通信协议设置为更高的版本(需要确保组中所有的成员的MySQL Server版本都使用8.0.16或以上版本)。有关更多信息,请参见"4.1.4 设置组的通信协议版本”。
全局变量,动态变量,整型类型,默认值为10485760,取值范围为:0~1073741824,MySQL 8.0.16版本引入。
8.9. group_replication_components_stop_timeout
组复制在关闭时等待每个组件的超时时间(以秒为单位)。
全局变量,动态变量,整型值,默认值为3153600,取值范围为:2~3153600,MySQL 5.7.17版本引入。
8.10. group_replication_compression_threshold
当该系统变量设置为非0值时,传输的数据包超过该值就会使用LZ4对传输的数据包进行压缩,当设置为0值时,压缩功能关闭。该系统变量需要在组的所有的组成员中设置为相同的值。
全局变量,动态变量,整型值,默认值为1000000,取值范围为0~4294967295,MySQL 5.7.17版本引入。
8.11. group_replication_consistency
该系统变量用于控制组如何提供事务的一致性保证。可以使用该系统变量在全局级别或在会话级别为每个事务设置不同的一致性要求。对于只读(RO)和读写(RW)事务,都必须考虑该变量的影响。下面列出了该变量的有效值及其对应的含义:
- EVENTUAL:RO和RW事务在执行之前都不会等待前面的事务应用完成(即,事务直接执行,不等待积压事务应用完成)。这是系统变量group_replication_consistency的默认值(也是引入该系统变量之前组复制的默认行为)。RW事务不等待其他成员应用事务。意味着设置该值的成员中的事务可以先于其他成员外部化。还意味着,在主要节点发生故障转移时,新的主要节点不需要等待积压的事务(来自旧的主要节点的事务),允许立即接受新的RO和RW事务,这可能造成新的RO事务读取到陈旧的数据(因为之前旧主要节点中的数据还未完全同步到新的主要节点)、新的RW事务可能由于冲突导致回滚(冲突认证检测会发现新的RW事务可能与来自旧主要节点的积压RW事务发生冲突)。
- BEFORE_ON_PRIMARY_FAILOVER:新的RO或RW事务在新的主要节点应用完成来自旧的主要节点的积压事务之前,会被保持(不应用,类似于处在等待状态,积压事务被应用完成之后,才会处理新的RO和RW事务)。这能够确保当主要节点故障转移发生时,客户端总是能查询到发生故障的主要节点上的最新值,从而保证了一致性。但这意味着客户端需要自行处理新的主要节点在应用积压事务过程中的延迟(这里指的是客户端访问新主要节点的响应延迟)。通常这种延迟很小,但是实际延迟时间的长短取决于积压事务的大小。
- BEFORE:RW事务在应用(applied)之前会等待所有前面的事务(积压事务)完成。RO事务在执行(executed)之前会等待所有前面的事务(积压事务)完成。这样使得事务仅通过牺牲响应延迟就可以确保读取到最新的值。实际上,只是确保了RO事务上的同步,对于RW事务来说,只是等待了它之前积压的事务完成,并不会等待它自身发起的RW事务在所有的其他组成员上完成应用(不过,由于RO事务要求同步,RO事务能够将一部分甚至大部分数据进行同步,所以能够一定程度上减少RW事务上的同步开销,也就是说,该一致性级别适合于写多读少的场景)。对于BEFORE这个一致性级别,它涵盖了BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
- AFTER:RW事务会等待它的更改应用到组中所有其他成员。此一致性级别对RO事务没有影响(因为RO事务不会产生数据变更)。它只确保在本地成员上提交RW事务时,该RW事务的数据变更会在组中其他所有成员中应用,以便所有后续的事务在任何成员上都能够获取到最新的数据(通过确保只在RW事务上使用同步,RW事务会将所有写入的新数据都实时同步到组中其他的所有节点中,这就减少了RO事务上的同步开销。也就是说,该一致性级别比较适合读多写少的场景)。对于AFTER这个一致性级别,它涵盖了BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。
- BEFORE_AND_AFTER:一致性级别要求最高,RW和RO事务执行时都要求数据同步,RW事务在执行时需要等待之前的积压事务应用完成,且需要等待自己的数据变更在其他所有组成员上都应用。RO事务在执行时需要等待之前的积压事务应用完成。该一致性级别适合对数据的读写一致性都要求高的场景。
更改此系统变量的全局设置值需要用户具有 GROUP_REPLICATION_ADMIN 权限。有关更多信息,请参见"4.2 事务一致性保证”。
全局变量,动态变量,枚举类型,默认值为EVENTUAL,有效值及其含义如上所述。MySQL 8.0.14版本引入。
8.12. group_replication_enforce_update_everywhere_checks
在多主模式的组复制中,该变量为所有组成员启用或禁用严格一致性检查,在单主模式下,必须在所有组成员上关闭该系统变量(设置为OFF),当该系统变量被启用时(设置为ON),组复制将按照如下方式对语句执行检查,以确保它们与多主模式兼容。
- 如果一个事务在SERIALIZABLE隔离级别下执行,那么事务在组中执行同步时将提交失败。
- 如果事务执行时碰到具有级联约束的外键表,则事务在组中执行同步时将提交失败。
此系统变量是组范围的,因此,要修改其值需要在组的所有成员中同时修改。另外,在组复制运行时不能更改,需要先停止组复制,并且要使得修改生效,需要将组重新进行引导(使用系统变量group_replication_bootstrap_group= on重新引导组)。从MySQL 8.0.16开始,如果要修改组的运行模式,可以使用group_replication_switch_to_single_primary_mode()和group_replication_switch_to_multi_primary_mode() udf在组中动态修改,当组修改为多主模式时,该UDF能够自动修改这个系统变量的值,有关更多信息,请参见"4.1.2. 修改组的运行模式”。
全局变量,动态变量,布尔型,默认为OFF,MySQL 5.7.17版本引入。
8.13. group_replication_exit_state_action
配置Server意外脱离组时的组复制行为。例如,遇到应用线程(单线程复制指SQL线程,多线程复制指worker线程)应用错误而导致数据同步终止、或者与组中的多数成员失联、或者组中的其他成员由于怀疑某个成员出现故障时而将其驱逐出组。
- 在某个成员与组中多数成员失联时,该成员脱离组的超时时间由系统变量group_replication_unreachable_majority_timeout进行设置。
- 某个成员被怀疑出现故障的怀疑超时时间由系统变量group_replication_member_expel_timeout进行设置。注意,被驱逐出组的成员要在重新连接到组时才知道自己被驱逐了,因此,只有在该成员设法重新连接到组或该成员自己对自己产生怀疑时才会真正承认自己被驱逐了,接下来才会执行系统变量group_replication_exit_state_action指定的退出操作。
当成员被怀疑超时或与组中多数成员失联时,如果其系统变量group_replication_autorejoin_tries设置为非0值(指定了一个自动尝试重新加入组的次数),则,该成员会在超级只读模式下按照指定的次数尝试重新加入组,当耗尽尝试次数之后仍然未成功加入组时,就会执行系统变量group_replication_exit_state_action所指定的退出操作。但是,如果是应用线程发生应用错误,则不会进行自动重新加入组的尝试,因为这些错误是不可自动恢复的。
- 当系统变量group_replication_exit_state_action设置为READ_ONLY时,如果成员意外脱离组或耗尽了它的自动尝试重新加入组的次数,则该成员会切换为超级只读模式(通过将系统变量super_read_only设置为ON)。READ_ONLY退出操作是该系统变量引入之前MySQL 8.0版本的默认行为,当引入该系统变量之后,8.0.15及其之前的版本默认值为ABORT_SERVER,但从MySQL 8.0.16开始,READ_ONLY再次成为默认值。
- 当系统变量group_replication_exit_state_action设置为OFFLINE_MODE时,如果成员意外脱离组或耗尽了自动重新加入组的尝试次数,则该成员会切换到离线模式(通过将系统变量OFFLINE_MODE设置为ON)。在此模式下,已连接的客户端用户在执行下一个请求时会断开连接,不再接受新的连接,但具有CONNECTION_ADMIN或super权限的客户端用户除外。此外,组复制还会将系统变量super_read_only设置为ON,因此,客户端在该状态下不能执行任何更新操作,即使具有super权限的用户也不能执行更新操作。注意:OFFLINE_MODE退出操作在MySQL 8.0.18中可用。
- 当系统变量group_replication_exit_state_action被设置为ABORT_SERVER时,如果成员意外脱离组或耗尽了自动重新加入组的尝试次数,则该成员会关闭MySQL Server进程。在MySQL 8.0.12版本中引入该系统变量时,ABORT_SERVER是默认值,但在MySQL 8.0.16版本时将默认值修改为了READ_ONLY。
- 注意:如果成员在成功加入组之前发生失败,则不会执行该系统变量指定的退出操作(可能无法执行)。例如,在执行本地配置检查期间出现失败,或者joiner节点的配置与组的配置不匹配,那么,系统变量super_read_only将会保留原始值且继续对外接受请求,MySQL Server进程也不会被关闭。为了确保在组复制未启动时Server不接受更新请求,建议在启动Server之前在配置文件中设置系统变量super_read_only=ON,在Server启动成功后,再将主要节点中的系统变量super_read_only和read_only设置为OFF(关闭只读)。尤其是在Server启动时就已经配置了系统变量group_replication_start_on_boot= on时,该保护措施尤其重要,当然,手工使用START GROUP_REPLICATION语句启动组复制时,此保护措施也非常有用。
有关使用此系统变量的更多信息,以及执行退出操作的完整情况列表,请参见"6.6.4 退出操作”。
全局变量,动态变量,枚举类型,8.0.16版本之后的默认值为 READ_ONLY(MySQL 5.7版本默认值相同),>= 8.0.12,<=8.0.15的默认值为ABORT_SERVER。8.0.18版本之后有效值为READ_ONLY、OFFLINE_MODE、ABORT_SERVER,>=8.0.12,<=8.0.17有效值为READ_ONLY、ABORT_SERVER(MySQL 5.7版本有效值相同)。MySQL 8.0.12及其之后的版本、MySQL 5.7.24及其之后的版本中引入。
8.14. group_replication_flow_control_applier_threshold
指定应用队列中触发流量控制的等待事务数量。当触发流量控制时,组复制会根据配额设置来限制进入组中的事务数量(新写入的事务)。修改此系统变量无需重启组复制即可生效。
全局变量,动态变量,整型类型,默认值为25000,取值范围为:0~2147483647,MySQL 5.7.17版本引入。
8.15. group_replication_flow_control_certifier_threshold
指定认证队列中触发流量控制的等待事务数量。当触发流量控制时,组复制会根据配额设置来限制进入组中的事务数量(新写入的事务)。修改此系统变量无需重启组复制即可生效。
全局变量,动态变量,整型类型,默认值为25000,取值范围为:0~2147483647,MySQL 5.7.17版本引入。
8.16. group_replication_flow_control_hold_percent
定义不使用的组配额百分比(不用于对外提供服务,而专用于组成员追赶积压事务的组配额),以便处于流量控制下的组成员能够赶上积压的事务。如果值为0,则表示不为组成员预留用于追赶积压事务的配额。
PS:如果正常运行的组中,有组成员发生crash并重新加入组,或者有新的Server加入组,则其成功加入组之后跟组中的现有成员之间可能存在较大的数据延迟,此时,如果组中的负载比较高,就可能导致新加入的组Server无法追赶上组中的最新数据。所以,实际情况下,默认为组成员预留了10%的组配额(即,成员对外提供服务的能力保留了10%),用于组成员存在数据延迟时追赶组中的最新数据。
全局变量,动态变量,整型类型,默认值为10,取值范围为:0~100。MySQL 8.0.2版本引入。
8.17. group_replication_flow_control_max_quota
定义组的最大流量控制配额,或当启用流量控制期间任意时间段内的最大可用配额。0表示没有最大配额限制。该最大配额设置值不能小于系统变量group_replication_flow_control_min_quota和group_replication_flow_control_min_recovery_quota设置的值。
PS:当该系统变量设置为非0值时。如果设置的非0值小于流量控制机制计算所得的总配额,则该系统变量生效(该系统变量设置的值作为总配额,此时总配额不受系统变量group_replication_flow_control_hold_percent约束),否则,该系统变量设置的值失效。也就是说,以较小的值为准。
全局变量,动态变量,整型类型,默认值为0,取值范围为:0~2147483647。MySQL 8.0.2版本引入。
8.18. group_replication_flow_control_member_quota_percent
为成员计算配额时,该系统变量指定一个假定自己可用的配额百分比。如果值为0,则表示总配额应该按照上一个流量控制检查周期中存在写入操作的组成员之间平均分配(即,未参与写入操作的组成员不参与总配额的分配);如果值大于0,则每个组成员就会按照该系统变量设置的百分比进行计算配额值。所以,该系统变量更适合在多主模式下进行设置(注意:一旦决定要设置该值为非0值,则建议在所有组成员中都分配一个非0值,且所有成员的总百分比加起来不超过100%;另外,代码层面并没有限制所有成员的百分比加起来不能超过100%,而是由用户在该系统变量的有效值范围内自己控制),在单主模式建议保持默认值,否则可能会有性能损失(在单主模式下设置该值为非0值也无效)。
全局变量,动态变量,整型类型,默认为0,取值范围为:0~100。MySQL 8.0.2版本引入。
8.18. group_replication_flow_control_min_quota
控制可分配给组成员的最低流量控制配额(任何情况下对应组成员的最小流量控制配额),它与上一个流量控制检查周期中所计算出的最小配额无关。值为0表示没有最小配额限制。该系统变量设置的值不能大于系统变量group_replication_flow_control_max_quota设置的值。
全局变量,动态变量,整型类型,默认值为0,取值范围为:0~2147483647。MySQL 8.0.2版本引入。
8.19. group_replication_flow_control_min_recovery_quota
当组中有成员正在恢复状态中时,该系统变量用于指定在流量控制中可以分配给一个成员的最低配额(当组中有成员处于故障恢复中时,通过该系统变量为成员指定一个最小配额,可以避免组中的正常成员出现性能大幅抖动),它与上一个流量控制检查周期中所计算出的最小配额无关。值为0表示没有最小配额限制。该系统变量的设置值不能大于系统变量group_replication_flow_control_max_quota设置的值。
PS:当系统变量group_replication_flow_control_min_quota设置为非0值时,系统变量group_replication_flow_control_min_recovery_quota设置的值无效。
全局变量,动态变量,整型类型,默认值为0,取值范围为:0~2147483647。MySQL 8.0.2版本引入。
8.20. group_replication_flow_control_mode
指定流量控制模式,修改此系统变量无需重启或重置 组复制即可生效。
- PS:配额就是当流量控制被触发时,组中的所有可读写成员允许并行写入的最大事务数量。配额应该使用组中最低服务能力的组成员所能承载的最大并行写事务能力为基准进行设置,该配额也是整个组中的总配额,单主模式时,该配额会全部作用于单个主要节点,多主模式时,该配额会在组中上一次流量控制检查周期中检测到的存在写操作的所有主要节点之间平均分配(即,多主模式下,上一次流量检查周期内不存在写操作的主要节点,不会参与分配配额)。配额会通过组成员之间每秒传递的组通讯消息中携带的各成员状态信息进行计算(通过前后2个次状态信息的差值可以计算出每个成员的事务处理能力),计算完成之后,组成员就会按照计算好的每个成员自己的配额来对自己进行流量控制。另外,由于组复制是以plugin的方式动态加载到MySQL Server上的,所以,流量控制起作用的地方不可能在MySQL Server,只可能在plugin内部,但应该尽可能靠近MySQL Server。所以,组复制在一个事务进入plugin但还未进行全局原子广播时就会判断是否需要对该事务采取进行流量控制。
全局变量,动态变量,枚举类型,默认值为QUOTA,有效值为:QUOTA(配额,即,默认情况下按照系统变量group_replication_flow_control_certifier_threshold和group_replication_flow_control_applier_threshold指定的阈值进行流控,在8.0中新增了一些能够精细控制配额的参数,对流量控制可调性更好,也能够适应更多的应用场景)、DISABLED(关闭流控),MySQL 5.7.17版本引入。
8.21. group_replication_flow_control_period
定义在流量控制的每个检查周期之间等待的秒数,即,流量控制统计的时间间隔,通过发送流控制消息来实现并进行流量控制管理任务(每个组成员将按照该系统变量设置的间隔时间定期发送自己的状态信息给其他组成员,然后,每个组成员会收集所有组成员发送的流量控制信息,进行统计与计算下一个流量控制周期中每个组成员的配额)。
PS:
- 流量控制周期越短,控制的精度就越高,性能也更加平滑。但是,如果你的应用场景中有大事务,则应该将流量控制周期调整为与大事务提交的速度相匹配(提交耗时),否则流量控制可能就无法正常发挥应有的作用。
- 当流量控制被触发时,每个组成员会根据每个流量控制检查周期中计算出的自己的配额值执行写入负载控制,但只对自身的写入负载进行控制(不会影响组中其他成员的负载),这与Galera的流控机制有所不同。
全局变量,动态变量,整型类型,默认值为1,取值范围为:1~60。MySQL 8.0.2版本引入。
8.22. group_replication_flow_control_release_percent
定义当组不再需要进行流量控制时,如何释放组的配额,当流量控制退出时,也会计算每一个流量控制周期的配额,默认的策略是每个周期增加50%的配额,直到配额增加到与外部应用的实际最大负载相同(这个时候就相当于解除了流量控制了),或者增加到外部应用负载触发了新一轮的流控阈值为止。如果值为0,则意味着流量控制退出时,组复制允许外部的全部实际应用负载全部进入组中(设置为1000时,表示允许以10倍于当前配额的速度释放),但这极有可能导致迅速触发新一轮的流量控制进而导致组的性能急剧下降。
全局变量,动态变量,整型类型,默认值为50,取值范围为:0~1000。MySQL 8.0.2版本引入。
8.23. group_replication_force_members
以逗号分割的地址列表,例如"host1:port1,host2:port2"。此系统变量用于强制创建新的组成员资格,其中被排除的成员(未写进该系统变量中的成员)在该变量设置成功之后就不会收到新视图消息且会被阻塞(阻塞写入操作)。然后你需要手动移除/关闭被排除在该系统变量的参数列表之外的成员。另外。如果列表中的存在任何无效主机名,则可能导致后续执行START GROUP_REPLICATION语句失败,因为这些无法通讯的Server无法响应组成员间的通讯请求。
在系统变量group_replication_force_members指定的每个Server上需要使用系统变量group_replication_local_address设置一个有效的IP地址(或主机名)与端口,如果是IPV6地址,则需要在方括号中指定,例如:"198.51.100.44:33061,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:33061,example.org:33061"。
组复制的组通信引擎(XCom)将检查所提供的IP地址是否为有效格式,并检查是否包含了当前无法访问的Server。如果存在这两种情况,则所设置的新配置将无法验证通过,这个时候,组可能会发生阻塞,因此,必须小心地设置该系统变量的值为组中当前可用的(在线的)Server地址和端口信息。
在强制执行新的成员资格配置之前,必须确保要被排除在外的组成员的Server已经关闭,这一点很重要。如果没有关闭,请在设置该系统变量之前将其关闭。因为,如果被排除的组成员仍然在线,那么,当使用该系统变量强制设置新的组成员资格时,被排除的组成员可能会自动形成新的组成员资格,即,该强制成员资格的配置操作导致组发生了人为的脑裂。
当使用系统变量group_replication_force_members成功强制创建新的组成员资格并解除了组的阻塞状态之后,需要先将系统变量group_replication_force_members的值清空之后,才能够使用START GROUP_REPLICATION语句启动组复制。要详细了解相关的步骤,请参见"4.4 网络划分”。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.24. group_replication_group_name
UUID格式的有效组名称,在二进制日志中用于为组复制事件设置GTID时在内部使用此UUID,注意,需要保证在同一个复制组中全局统一(相较于其他组的组名称,要保证唯一)。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.25. group_replication_group_seeds
以逗号分隔的地址列表,例如"host1:port1,host2:port2"。其给定的地址列表中,至少需要有一个Server的地址和端口是有效的(即,至少需要有一个组成员是活跃的,且可以提供给其他新加入组的Server进行状态传输并与组保持同步),否则使用语句START GROUP_REPLICATION启动组复制时将会失败。
该系统变量指定地址的Server被称为种子成员。通常,该系统变量可以包含组中所有的成员地址(即,可包含活跃和非活跃的组成员地址;但,也可以只指定组中的一个有效的子集来作为种子成员)注意:
- 该系统变量与系统变量group_replication_local_address中配置地址和端口信息类似,它不是用于成员SQL访问的地址和端口,而是用于组成员之间的组通讯的地址和端口。如果要为其指定一个IPV6地址,则IPV6地址需要使用方括号,如:group_replication_group_seeds= "198.51.100.44:33061,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:33061, example.org:33061"。
- 该系统变量指定的地址有效性,只有在执行START GROUP_REPLICATION语句启动组复制时,才会对其进行验证,因为只有当组复制启动时组通信系统(GCS)才可用。
当有Server申请加入组时,它会尝试连接到系统变量group_replication_group_seeds列出的种子成员,从第一个地址开始依次尝试连接,如果第一个地址失败(或被拒绝连接),则尝试连接第二个,直到按照顺序尝试连接了该系统变量指定的所有种子成员都失败时,该成员就报错终止加入组,如果期间有任意一个种子成员有效且能够正常提供状态传输,则该Server就能够成功加入组(注意:种子成员的白名单系统变量group_replication_ip_whitelist需要允许joiner节点所在的网段访问,否则无法正常加入组)。
joiner节点必须使用种子成员在其系统变量group_replication_group_seeds中声明的相同协议地址与种子成员通信(IPv4或者IPv6),如果joiner节点的系统变量group_replication_local_address设置的协议地址与种子成员公告的协议地址不匹配,则必须将此地址或主机名添加到种子成员与joiner节点的白名单中,否则将拒绝其连接尝试。有关更多信息,请参见"5.1. 组复制的IP地址白名单”。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.26. group_replication_gtid_assignment_block_size
为每个成员保留的连续GTID数。每个成员从中进行消耗,并在其需要的时候获取更多的GTID数(类似于分布式事务中的全局序列,该系统变量设置的值表示每个成员每一次从全局序列中获取多大范围的连续数字范围来作为自身写事务的GTID号)。
该系统变量是组范围的配置设置,它必须在所有组成员上设置相同的值,在组复制运行时不允许修改,要使得修改值生效,需要完全重新引导组(使用系统变量group_replication_bootstrap_group= on来重新引导组)。
全局变量,动态变量,整型类型,默认值为1000000,取值范围:32位平台为1~4294967295,64位平台为1~9223372036854775807,MySQL 5.7.17版本引入。
8.27. group_replication_ip_whitelist
指定允许哪些主机(IP地址或主机名)连接到组(被允许访问的地址称为白名单地址)。默认值为AUTOMATIC,当设置为默认值时,每个组成员使用组通信引擎(XCom)各自扫描所在主机上活跃网卡接口,这些活动网络接口上的本地私有子网将被添加到该白名单列表中(支持IPV4和IPV6两种协议地址,有关IP地址白名单的详细信息,可参考"5.1. 组复制的IP地址白名单"),但仅有私有子网地址的白名单并不能允许来自私有子网地址之外的Server连接组,所以,如果你的组是跨网段的,那么,你需要手动配置该白名单参数(将你需要运行访问的IP地址或网段显式指定为白名单)。需要注意的是,一旦手工指定白名单,则不会自动添加私有子网地址或本地主机地址在白名单中,因此,你需要手工明确指定允许访问的地址,没有明确指定的地址将被拒绝访问。
在组中所有成员的系统变量group_replication_local_address中指定的地址必须包含在组中所有成员的白名单地址中,否则将可能导致组成员之间的组通讯出现故障。注意:只有在对成员执行了START GROUP_REPLICATION语句且组通信系统(GCS)可用时,才会验证为该变量指定的值的有效性。
关于系统变量group_replication_ip_whitelist的值,可以指定如下有效地址的任意组合:
- IPv4地址(例如:198.51.100.44)
- 带有CIDR符号的IPv4地址(例如:192.0.2.21/24)
- 从MySQL 8.0.14开始支持IPv6地址(例如:2001:db8:85a3:8d3:1319:8a2e:370:7348)
- 从MySQL 8.0.14开始,支持带有CIDR符号的IPv6地址(例如:2001:db8:85a3:8d3::/64)
- 主机名(例如:example.org)
- 带有CIDR符号的主机名(例如:www.example.com/24)
在MySQL 8.0.14版本之前,主机名只能解析为IPv4地址。从MySQL 8.0.14版本开始,主机名可以解析为IPv4地址、或IPv6地址、或同时解析为两种地址。如果主机名同时解析为IPv4和IPv6地址,则IPv4地址总是优先用于组成员之间的通讯连接。您可以将CIDR表示法结合主机名或IP地址一起使用,以将带有特定网络前缀的IP地址段列入白名单中(例如:192.0.2.21/24、www.example.com/24),但是要确保指定子网中的所有IP地址都是允许访问的(即,指定的网段中不包含一些不允许访问的IP地址)。
白名单中的每个条目之间必须用逗号隔开。例如:“192.0.2.21/24,198.51.100.44,203.0.113.0/24,2001:db8:85a3:8d3:1319:8a2e: 370:7348 example.org,www.example.com/24”
如果任何种子成员在其系统变量group_replication_group_seeds中列出了IPV6地址,当一个joiner节点在其系统变量group_replication_local_address中使用了IPV4地址时(或相反。种子成员使用IPV4地址,joiner节点使用IPV6地址),则必须在种子成员的白名单地址中添加joiner节点所使用的协议地址(为减少维护成为,这种情况建议在所有成员的白名单地址中都设置一样的协议地址),否则,joiner节点将会被拒绝连接。更多详细信息,可参考"5.1. 组复制的IP地址白名单"。
对于主机名来设置地址信息的,仅当另一个Server发出连接请求时才会进行名称解析。无法解析的主机名不会被用于白名单验证,并会在错误日志中写入警告消息。对正向解析成功的主机名会进行反向DNS (FCrDNS)验证。
- 注意:在白名单地址中,使用主机名不如使用IP地址安全,对于使用主机名作为白名单时,FCrDNS验证提供了良好的保护级别(你还可以使用本地hosts解析文件来避免使用外部DNS解析组件,以进一步增加安全性),但仍然可能受到某些类型的攻击。因此,除非必须,否则不建议在白名单中使用主机名地址。
全局变量,动态变量,默认值为AUTOMATIC,字符串类型,MySQL 5.7.17版本引入。
8.28. group_replication_local_address
组复制 成员用于提供给组中的其他成员连接访问的网络地址,格式为host:port字符串。组复制 中的所有成员都要求可访问该地址,因为该地址在复制组中(XCom, Paxos变体)被组通讯引擎用于远程XCom实例之间进行TCP通信。但与本地实例的通信是通过使用共享内存的输入通道进行的。
- 注意:该地址和端口提供的访问协议不是MySQL Server的SQL协议,客户端程序不要使用该地址直接访问组成员。
组复制 将在系统变量group_replication_local_address中指定的地址或主机名用作组中成员的惟一标识符。因此,只要主机名或IP地址与端口的的拼接字符串唯一即可(即,可以对组的所有成员使用相同的端口,只要主机名或IP地址都不同即可;也可以对所有成员使用相同的主机名或IP地址,只要端口不同即可)。系统变量group_replication_local_address中设置的端口号推荐是33061。注意,只有在执行了START GROUP_REPLICATION语句且组通信系统(GCS)可用时,才会为该系统变量设置的值进行验证。
由系统变量group_replication_local_address配置的网络地址必须能够被所有组成员解析。例如,如果每个Server实例位于具有固定网络地址的不同机器上,则可以使用该机器的IP地址来设置该系统变量(例 10.0.0.1);如果使用主机名,则必须使用完全限定的名称,并确保可以通过DNS解析、或需要确保正确配置了/etc/hosts文件、或其他能够进行名称解析的方法。从MySQL 8.0.14版本开始,该系统变量可以使用IPv6地址(或能够解析为IPv6地址的主机名)和IPv4地址。IPv6地址必须在方括号中指定,以便能够区分出端口号,例如:group_replication_local_address= "[2001:db8:85a3:8d3:1319:8a2e:370:7348]:33061"。
如果使用该系统变量为Server实例指定的主机名同时解析为IPv4和IPv6地址,则IPv4地址始终优先用于组复制连接。有关对IPv6网络的组复制支持以及对混合使用IPv4和IPv6地址的复制组的更多信息,请参见"4.5. 配置支持IPv6和混合IPv6与IPv4地址的组”。
为实现组复制的IP地址白名单,每个组成员使用系统变量group_replication_local_address提供给其他成员用于组通讯的地址,需要在其他组成员的系统变量group_replication_ip_whitelist指定的白名单地址中允许其连接,否则双方就无法正常通讯。如果任何种子成员在其系统变量group_replication_group_seeds中指定了一个IPV6地址,但是joiner节点在其系统变量group_replication_local_address中指定了一个IPV4地址(或相反。种子成员使用IPV4地址,joiner节点使用IPV6地址),则必须在种子成员的白名单地址中添加joiner节点所使用的协议地址(为减少维护成本,这种情况建议在所有成员的白名单地址中都设置一样的协议地址),否则,新的Server将会被拒绝连接。更多详细信息,可参考"5.1. 组复制的IP地址白名单"。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.29. group_replication_member_weight
为组成员指定一个百分比权重,该权重值用于在故障转移时影响如何选举新的主要节点(仅对处于单主模式的组有意义),当处于单主模式的组中,主要节点脱离组时,权重值越高的成员,越优先被选中为主要节点,这在执行计划维护或者在故障转移时期望指定某个组成员成为主要节点时尤其有用(将期望成为主要节点的组成员权重值设置为最高即可)。
- 例如:假设有4个组成员,其权重值和对应的实例UUID分别如下 * 成员-1: group_replication_member_weight=30, server_uuid=aaaa * 成员-2: group_replication_member_weight=40, server_uuid=bbbb * 成员-3: group_replication_member_weight=40, server_uuid=cccc * 成员-4: group_replication_member_weight=40, server_uuid=dddd
在新主的选举期间,上面的4个组成员将按照"成员-2、成员-3、成员-4和成员-1"进行排序。当发生故障转移时,成员-2 将被选为新的主要节点。有关更多信息,请参见"1.3.1. 单主模式"。
全局变量,动态变量,整型类型,默认值为50,取值范围为:0~100。MySQL 8.0.2、MySQL 5.7.20版本引入。
8.30. group_replication_member_expel_timeout
表示当组复制成员被怀疑失败之后,被驱逐出组之前的等待时间(以秒为单位)。在怀疑产生之前的最初5秒的检测周期不会计入此时间内。更改某个组成员上的系统变量group_replication_member_expel_timeout的值将立即生效。组复制并不强制要求组中的所有成员将此系统变量设置为相同值,但建议设置为相同值,以避免发生意外的驱逐事件。
默认情况下,系统变量group_replication_member_expel_timeout设置值为0,这意味着没有等待期,在5秒的检测期结束后,可疑成员可能被立即驱逐出组。为了避免在较慢的网络上、或在可预期的瞬时网络故障、或在可预期的Server性能变差的情况下发生不必要的驱逐事件,可以为该系统变量指定一个大于0的值(以便在有成员被怀疑失败时,有一个缓冲等待期)。如果可疑成员在怀疑超时之前再次变为活跃状态(恢复组通讯),则它将重新加入组,并应用组中其他成员缓冲的所有消息(追赶组中最新的数据),然后进入ONLINE状态对外提供服务。
如果超过了怀疑时间仍未成功加入组,则被怀疑成员将被立即驱逐出组。如果该成员后续能够恢复组通讯,它将会接收到一个被驱逐出组的视图。此时,如果该成员的系统变量group_replication_autorejoin_tries设置了一个非0值,则该成员在超级只读模式下,将按照该数值执行自动重新加入组的尝试;如果该成员没有指定自动重新连接尝试次数(设置0值),或者当它耗尽了指定的尝试次数时,则它将按照系统变量group_replication_exit_state_action指定的值执行退出操作。
有关使用此系统变量的更多信息,请参见"6.6.1. 超时驱逐"。有关在该系统变量不可用时如何避免发生不必要的驱逐事件,请参阅"9.2 组复制限制”。
全局变量,动态变量,整型类型,默认值为0,<=8.0.13版本的取值范围为:0~31536000,>=8.0.14版本的取值范围为:0~3600。MySQL 8.0.13版本引入。
8.31. group_replication_message_cache_size
组复制(XCom)的组通信引擎中可用于消息缓存的最大内存大小,该内存缓存了组成员之间交换的消息(及其元数据)作为协商一致协议的一部分。另外,消息缓存可用于恢复那些在一段时间内无法与其他组成员通信的成员,以便其能够顺利重新加入(返回)组。系统变量group_replication_member_expel_timeout设置的值表示允许组成员多长时间(最多一个小时)与组中其他成员失联之后还能重新加入(返回)组,而不是在于其他组成员失联之后直接被驱逐出组。消息缓存的大小应该根据这段时间内预期的消息量来设置(例如:设置为3600秒,则,你需要根据你的实际业务场景中,这一个小时内的业务量来评估),以便该缓存能够包含任意成员在失联之后还能够成功返回(重新加入)组所需的丢失消息(需要能够缓存系统变量group_replication_member_expel_timeout设置的时间之内组中产生的所有消息量)。
系统变量group_replication_message_cache_size的默认值和最小值相同(1073741824字节,即,1GB),组中的所有成员需要设置相同的值,因为当有成员与组失联之后,重新与组建立连接时会随机选择组中的任何其他成员来恢复丢失的消息。
缓存大小限制允许动态调整,但是,如果是降低缓存大小限制,则XCom将删除已经确定并交付的最老的条目,直到当前的缓存大小低于所设置的限制值为止。当从消息缓存中删除了当前组无法访问的成员(失联的成员)恢复时可能需要用到的消息时,组通信系统(GCS)会发出一条警告消息。如果是增大缓存大小限制,请根据MySQL Server中其他一些缓存和缓冲池的系统变量设置,并结合你的系统上实际的物理内存大小进行设置。有关优化消息缓存大小的更多信息,请参见"6.5 XCom缓存管理"。
全局变量,动态变量,整型类型,默认值为1073741824 (1 GB),32位平台的取值范围为:1073741824 (1 GB)~315360004294967295 (4 GB),64位平台的取值范围为:1073741824 (1 GB)~18446744073709551615 (16 EiB)。MySQL 8.0.16版本引入。
8.32. group_replication_poll_spin_loops
该系统变量设置组复制通信线程在等待传入更多的网络消息之前,需要等待通信引擎互斥锁(mutex)被释放的次数。
全局变量,动态变量,整型类型,默认值为0,取值范围:32位平台为0~4294967295,64位平台为0~18446744073709551615。MySQL 5.7.17版本引入。
8.33. group_replication_recovery_complete_at
设置在分布式恢复过程中,完成状态传输之后应用缓存事务的策略。有效值如下:
- TRANSACTIONS_CERTIFIED:表示joiner节点在完成状态传输之后,不需要应用完成其在状态传输期间所缓存的事务即可标记为ONLINE状态(即,只要求这些被缓存的事务通过冲突认证检测即可)。
- TRANSACTIONS_APPLIED:表示joiner节点在完成状态传输之后,需要应用完成其在状态传输期间所缓存的事务之后,才能够被标记为ONLINE状态(即,要求这些被缓存的事务被应用完成)。
全局变量,动态变量,枚举类型,默认值为TRANSACTIONS_APPLIED,有效值为:TRANSACTIONS_APPLIED、TRANSACTIONS_CERTIFIED,MySQL 5.7.17版本引入。
8.34. group_replication_recovery_compression_algorithm
该系统变量设置组复制中基于二进制日志的状态传输时,是否允许其分布式恢复连接使用压缩算法,其有效算法与系统变量protocol_compression_algorithms的有效算法相同(但他们的默认值不相同,系统变量protocol_compression_algorithms的默认值为"zlib,zstd,uncompressed")。
- zlib:表示允许连接使用zlib压缩算法。
- zstd:表示允许连接使用zstd压缩算法(zstd 1.3)。
- uncompressed:表示不使用压缩算法。
如果Server已配置为支持克隆插件(详情请参阅"4.3.1. 克隆用于分布式恢复"),并且在分布式恢复期间使用远程克隆操作(使用基于远程克隆的状态传输),则此系统变量不适用这种状态传输方法,如果需要对该状态传输方法启用压缩,则需要使用克隆插件的系统变量clone_enable_compression进行设置。
全局变量,动态变量,集合类型,默认值为uncompressed,有效值为:zlib、zstd、uncompressed。MySQL 8.0.18版本引入。
8.35. group_replication_recovery_get_public_key
配置是否从主要节点请求基于RSA密钥对的密码交换所需的公钥,如果系统变量group_replication_recovery_public_key_path设置的公钥文件有效,则它将优先于系统变量group_replication_recovery_get_public_key生效(即,这种情况下系统变量group_replication_recovery_get_public_key设置的值不生效)。如果在分布式恢复中没有为组复制恢复通道group_replication_recovery启用SSL,但使用了caching_sha2_password插件来验证组复制的复制账号(这也是MySQL 8.0中的默认设置)。那么,这种情况下,系统变量group_replication_recovery_get_public_key设置的值将生效。有关更多信息,请参见"5.2. 组复制安全套接字层(SSL)支持"。
全局变量,动态变量,布尔类型,默认值为OFF。MySQL 8.0.4版本引入。
8.36. group_replication_recovery_public_key_path
指定秘钥文件的路径和文件名称,该文件中包含了主要节点用于基于RSA秘钥对的密码交换所需的从属端副本(辅助节点所需的副本)。文件必须是PEM格式。如果该系统变量所设置的公钥文件有效,则它将优先于系统变量group_replication_recovery_get_public_key生效(即,当系统变量group_replication_recovery_public_key_path有效时,系统变量group_replication_recovery_get_public_key不生效)。
- 注意:对于组复制用户使用sha256_password插件进行身份认证时,要使得系统变量group_replication_recovery_public_key_path生效,MySQL需要基于OpenSSL构建,有关更多详细信息,请参见"2.1.3. 用户凭证"。
全局变量,动态变量,其值类型为文件名路径,默认值为空串。MySQL 8.0.4版本引入。
8.37. group_replication_recovery_reconnect_interval
当一个新的Server尝试加入到组,如果没有发现可用donor节点来进行分布式恢复时,会尝试重新连接(寻找)可用的donor节点,此系统变量设置重连间隔时间(单位为秒)。
全局变量,动态变量,整型类型,默认值为60,取值范围为:0~31536000,MySQL 5.7.17版本引入。
8.38. group_replication_recovery_retry_count
当一个新的Server尝试加入到组,由于某些原因导致无法找到可用的donor节点用于分布式恢复时,该变量设置重新尝试寻找可用donor节点的次数。
全局变量,动态变量,整型值,默认值为10,取值范围为:0~31536000,MySQL 5.7.17版本引入。
8.39. group_replication_recovery_ssl_ca
指定一个文件的路径,该文件需要包含用于分布式恢复连接的受信任SSL证书颁发机构列表,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
如果Server被设置为支持克隆插件(详情请参阅"4.3.1. 克隆用于分布式恢复"),且系统变量group_replication_recovery_use_ssl设置为ON,则组复制会自动将克隆插件的系统变量clone_ssl_ca的值设置为匹配系统变量group_replication_recovery_ssl_ca的值。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.40. group_replication_recovery_ssl_capath
指定一个目录的路径,该目录下需要包含用于分布式恢复连接的受信任的SSL证书颁发机构颁发的证书,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
全局变量,变量,字符串类型,MySQL 5.7.17版本引入。
8.41. group_replication_recovery_ssl_cert
指定用于建立分布式恢复所需的安全连接的SSL证书文件的名称,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
如果Server被设置为支持克隆插件(详情请参阅"4.3.1. 克隆用于分布式恢复"),且系统变量group_replication_recovery_use_ssl设置为ON,则组复制会自动将克隆插件的系统变量clone_ssl_cert的值设置为匹配系统变量group_replication_recovery_ssl_cert的值。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.42. group_replication_recovery_ssl_cipher
允许用于SSL加密的加密算法列表,可用的加密算法需要看编译MySQL Server时使用的ssl lib库版本,不同的ssl lib库支持的加密算法有所不同,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.43. group_replication_recovery_ssl_crl
指定包含证书吊销列表文件的目录路径(文件),有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.44. group_replication_recovery_ssl_crlpath
指定包含证书吊销列表文件的目录路径(目录),有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.45. group_replication_recovery_ssl_key
指定用于建立安全连接的SSL密钥文件的名称,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
如果Server被设置为支持克隆插件(详情请参阅"4.3.1. 克隆用于分布式恢复"),且系统变量group_replication_recovery_use_ssl设置为ON,则组复制会自动将克隆插件的系统变量clone_ssl_key的值设置为匹配系统变量group_replication_recovery_ssl_key的值。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.46. group_replication_recovery_ssl_verify_server_cert
在分布式恢复过程中用于检查donor节点的证书中Server的Common Name(共同名称)值,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
全局变量,动态变量,字符串类型,MySQL 5.7.17版本引入。
8.47. group_replication_recovery_use_ssl
配置复制组中的成员执行分布式恢复时,用于分布式恢复的连接通道是否需要使用SSL,有关为分布式恢复配置支持SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”。
如果Server被设置为支持克隆插件(详情请参阅"4.3.1. 克隆用于分布式恢复"),其将此系统变量设置为ON,则组复制将在基于远程克隆操作的状态传输以及基于二进制日志的状态传输中使用SSL;如果将此系统变量设置为OFF,则组复制不会在基于远程克隆操作的状态传输中使用SSL。
全局变量,动态变量,布尔型,默认为OFF,MySQL 5.7.17版本引入。
8.48. group_replication_recovery_zstd_compression_level
指定组复制在分布式恢复连接中使用zstd压缩算法时的压缩级别。允许的级别从1到22,值越大表示压缩级别越高。默认的zstd压缩级别为3。对于不使用zstd压缩的分布式恢复连接,此变量不生效。
全局变量,动态变量,整型类型,默认值为3,取值范围为:1~22。MySQL 8.0.18版本引入。
8.49. group_replication_single_primary_mode
用于指定复制组是以单主模式运行工作负载还是多主模式运行工作负载,单主模式时(设置为ON),可读写的primary节点(主要节点)只有一个,其他组成员都为secondaries节点(辅助节点),是只读的。设置为OFF表示关闭单主模式。即,启用多主模式,多主模式时,通常情况下所有的组成员都是可读写的primary节点。
此系统变量是组范围的配置设置,必须保证组中所有的成员具有相同的值,在组复制运行过程中不能修改(需要先执行STOP GROUP_REPLICATION 语句先停止组复制),要使得修改的值生效,需要完全重新引导组(使用系统变量group_replication_bootstrap_group= on重新引导组)。从MySQL 8.0.16开始,可以使用group_replication_switch_to_single_primary_mode()和group_replication_switch_to_multi_primary_mode() udf 在组运行时动态更改这个系统变量的值(同时修改组的运行模式)。有关更多信息,请参见"4.1.2. 修改组的运行模式"。
全局变量,动态变量,布尔型,默认值为ON,MySQL 5.7.17版本引入。
8.50. group_replication_ssl_mode
配置组复制成员之间的SSL连接的安全状态(有关为组通讯配置SSL的详细信息,请参阅"5.2. 组复制安全套接字层(SSL)支持”),有效值如下:
- DISABLED:建立一个未加密的连接(默认值),即,不启用SSL。
- REQUIRED:如果组成员之间支持安全连接,则建立安全连接。
- VERIFY_CA:类似于REQUIRED,但是要根据配置的证书颁发机构(CA)证书来验证服务器TLS证书。
- VERIFY_IDENTITY:与VERIFY_CA类似,但是还要验证服务器证书是否与尝试连接的主机(组成员)匹配。
全局变量,动态变量,枚举类型,默认值为DISABLED。MySQL 5.7.17版本引入。
8.51. group_replication_start_on_boot
配置是否在Server启动时一并启动MGR插件及其组复制。
全局变量,动态变量,布尔型,默认值为ON,MySQL 5.7.17版本引入。
8.52. group_replication_transaction_size_limit
设置复制组中的最大事务大小限制(以字节为单位)。当一个事务的数据量大于该系统变量设置的值时,事务会被回滚,可使用该系统变量来避免复制组中的大事务,大事务可能导致复制组出现内存、网络、性能方面的问题,还可能因为成员忙于处理大事务而无法响应成员间的健康检测包(被怀疑失败),从而导致不必要的驱逐事件,甚至发生故障转移。
当该系统变量设置为0时,复制组内接受的事务大小没有限制,有一定风险,请根据自己环境的工作负载情况来设定该系统变量的值。从MySQL 8.0版本开始,该系统变量的默认值变更为150000000字节(大约143 MB)。该系统变量是组范围内的配置设置,组中所有成员需要具有相同的值。有关大事务的缓解策略,请参见"9.2 组复制限制"。
全局变量,动态变量,整型类型,<=8.0.1版本默认值为0,>=8.0.2版本默认值为150000000,取值范围为:0~2147483647,MySQL 5.7.19版本引入。
8.53. group_replication_unreachable_majority_timeout
配置当遭遇网络分区而与组中大多数成员失联时,其脱离组之前的等待时间。
假设在一复制组中有5个组成员(S1、S2、S3、S4、S5),如果(S1、S2)和(S3、S4、S5)之间断开连接,则就表示存在了网络分区。第一个部分(S1,S2)是少数(因为成员数少于组中的半数)。第二个部分(S3、S4、S5)是多数,因此,第二部分可以正常执行仲裁,形成新的组成员资格并正常对外提供服务,而少数部分将等待系统变量group_replication_unreachable_majority_timeout指定的时间进行网络重新连接。有关此场景的详细描述,请参见"4.4. 网络分区"。
默认情况下,系统变量group_replication_unreachable_majority_timeout设置为0,这意味着由于网络分区而处于少数状态的成员将永远等待脱离该组(会一直等待,不会因为网络分区而导致成员脱离组)。如果设置为非0值,则当指定的时间过期时,少数状态的成员处理的所有阻塞事务将被回滚,且处于少数状态的成员将转变为ERROR状态。但如果将系统变量group_replication_autorejoin_tries设置为非0值,则此时成员会在超级只读模式下按照指定的次数尝试自动重新加入组。如果系统变量group_replication_autorejoin_tries为0值、或耗尽了指定的尝试次数之后,则将按照系统变量group_replication_exit_state_action指定的值执行退出操作。
- 注意:如果你有一个对称组,例如只有两个成员(S0,S2),如果发生网络分区,则两个部分都被判定我少数节点部分,整个组都无法对外提供服务,这个时候,如果系统变量group_replication_unreachable_majority_timeout设置为非0值,那么所有成员在等待超时时间之后都会转变为ERROR状态。
关于使用该系统变量的更多详细信息,请参见"6.6.2. 与多数成员失联超时"。
全局变量,动态变量,整型类型,默认值为0,取值范围为:0~31536000,MySQL 5.7.19、MySQL 8.0.2版本引入。
| 作者简介
罗小波·数据库技术专家
《千金良方——MySQL性能优化金字塔法则》作者之一。熟悉MySQL体系结构,擅长数据库的整体调优,喜好专研开源技术,并热衷于开源技术的推广,在线上线下做过多次公开的数据库专题分享,发表过近100篇数据库相关的研究文章。