17.7.1 组复制要求

您要用于组复制的服务器实例必须满足以下要求。

Infrastructure

  • InnoDB 存储引擎. 数据必须存储在InnoDB事务存储引擎中。乐观地执行事务,然后在提交时检查冲突。如果存在冲突,为了保持整个组的一致性,将回滚某些事务。这意味着需要事务存储引擎。此外,InnoDB提供了一些附加功能,可以在与组复制一起操作时更好地 Management 和处理冲突。使用其他存储引擎(包括临时MEMORY存储引擎)可能会导致组复制中的错误。您可以通过在组成员上设置disabled_storage_engines系统变量来阻止使用其他存储引擎,例如:
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
  • 主键. 组要复制的每个 table 都必须具有定义的主键,或等效的主键,其中等效项是非 null 的唯一键。此类键是作为 table 中每一行的唯一标识符所必需的,从而使系统能够通过准确识别每个事务已修改的行来确定哪些事务发生冲突。

  • IPv4 网络. MySQL 组复制使用的组通信引擎仅支持 IPv4.因此,组复制需要 IPv4 网络基础结构。

  • 网络性能. MySQL 组复制旨在部署在服务器实例彼此非常靠近的群集环境中。一组的性能和稳定性可能会受到网络延迟和网络带宽的影响。所有组成员之间必须始终保持双向通信。如果针对服务器实例阻止了入站或出站通信(例如,通过防火墙或由于连接问题),则该成员无法在该组中运行,并且该组成员(包括有问题的成员)可能无法报告受影响的服务器实例的正确成员状态。

服务器实例配置

必须在属于组成员的服务器实例上配置以下选项。

  • 二进制日志处于活动状态. 设置--log-bin[=log_file_name]。 MySQL Group Replication 复制二进制日志内容,因此二进制日志需要打开才能运行。默认情况下启用此选项。参见第 5.4.4 节“二进制日志”

  • 已记录副本更新. 设置--log-slave-updates。服务器需要记录通过复制应用程序应用的二进制日志。组中的服务器需要记录从组接收并应用的所有事务。这是必需的,因为恢复是依靠组中参与者的二进制日志来进行的。因此,即使不是在服务器本身上启动的那些事务,每个事务的副本也必须存在于每台服务器上。

  • 二进制日志行格式. 设置--binlog-format=row。组复制依靠基于行的复制格式在组中的服务器之间一致地传播更改。它依靠基于行的基础结构来提取必要的信息,以检测在组中不同服务器中同时执行的事务之间的冲突。参见第 16.2.1 节“复制格式”

  • 关闭二进制日志校验和. 设置--binlog-checksum=NONE。由于复制事件校验和的设计限制,组复制无法使用它们,因此必须将其禁用。

  • 启用全局事务标识符. 设置gtid_mode=ON。组复制使用全局事务标识符来准确跟踪已在每个服务器实例上提交了哪些事务,从而能够推断出哪些服务器执行了可能与其他位置已提交的事务发生冲突的事务。换句话说,显式事务标识符是框架的基本部分,能够确定哪些事务可能发生冲突。参见第 16.1.3 节“使用全局事务标识符进行复制”

  • 复制信息存储库. 设置master_info_repository=TABLErelay_log_info_repository=TABLE。复制应用程序需要将源和副本元数据写入mysql.slave_master_infomysql.slave_relay_log_info系统 table。这样可以确保组复制插件对复制元数据具有一致的可恢复性和事务 Management。参见第 16.2.4.2 节“复制应用程序元数据存储库”

  • 事务写集提取. 设置--transaction-write-set-extraction=XXHASH64,以便在收集行以将它们记录到二进制日志时,服务器也收集写集。写集基于每行的主键,并且是标签的简化且紧凑的视图,该标签唯一地标识已更改的行。然后,该标签用于检测冲突。

  • 小写 table 格名称. 在所有组成员上将--lower-case-table-names设置为相同的值。设置 1 对于使用InnoDB存储引擎是正确的,这对于组复制是必需的。请注意,该设置并非在所有平台上都是默认设置。

  • 多线程应用程序. 组复制成员可以配置为多线程应用程序,从而使事务可以并行应用。设置slave_parallel_workers=N(其中* N *是并行应用线程的数量),slave_preserve_commit_order=1slave_parallel_type=LOGICAL_CLOCK。设置slave_parallel_workers=N将启用成员上的多线程应用程序。组复制依赖于围绕所有参与成员以相同 Sequences 接收和应用已提交事务的保证而构建的一致性机制,因此,您还必须设置slave_preserve_commit_order=1以确保并行事务的最终提交与原始事务的 Sequences 相同。最后,为了确定哪些事务可以并行执行,中继日志必须包含使用slave_parallel_type=LOGICAL_CLOCK生成的事务父信息。尝试添加slave_parallel_workers设置为大于 0 的成员而不同时设置其他两个选项的情况下,会产生错误,并阻止实例加入。