## 18.10 常见问题

[](<>)

本节提供常见问题的解答。

### 一个组中 MySQL 服务器的最大数量是多少？

一个组最多可以包含 9 个服务器。尝试将另一台服务器添加到有 9 个成员的组会导致加入请求被拒绝。此限制已从测试和基准测试中确定为安全边界，其中该组在稳定的局域网上可靠地执行。

### 组中的服务器如何连接？

组中的服务器通过打开对等 TCP 连接来连接到组中的其他服务器。这些连接仅用于组中服务器之间的内部通信和消息传递。该地址由[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)多变的。

### 什么是群\_复制\_引导程序\_组选项用于？

引导标志指示成员*创建*一个组并充当初始种子服务器。加入组的第二个成员需要要求引导组的成员动态更改配置，以便将其添加到组中。

成员需要在两种情况下引导组。最初创建组时，或关闭并重新启动整个组时。

### 如何为分布式恢复过程设置凭据？

您可以将用户凭据永久设置为`group_replication_recovery`通道，使用[`将复制源更改为`](change-replication-source-to.html)语句（来自 MySQL 8.0.23）或[`将主更改为`](change-master-to.html)语句（在 MySQL 8.0.23 之前）。或者，从 MySQL 8.0.21 开始，您可以在[`开始 GROUP_REPLICATION`](start-group-replication.html)每次启动组复制时声明。

使用设置的用户凭据[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)以纯文本形式存储在服务器上的复制元数据存储库中，但在[`开始 GROUP_REPLICATION`](start-group-replication.html)仅保存在内存中，并由[`停止 GROUP_REPLICATION`](stop-group-replication.html)声明或服务器关闭。使用[`开始 GROUP_REPLICATION`](start-group-replication.html)因此，指定用户凭据有助于保护组复制服务器免受未经授权的访问。但是，此方法与自动启动 Group Replication 不兼容，如[`group_replication_start_on_boot`](group-replication-options.html#sysvar_group_replication_start_on_boot)系统变量。有关详细信息，请参阅[第 18.6.3.1 节，“用于分布式恢复的安全用户凭证”](group-replication-secure-user.html).

### 我可以使用组复制扩展我的写入负载吗？

不是直接的，但是 MySQL 组复制是一个无共享的完全复制解决方案，其中组中的所有服务器复制相同数量的数据。因此，如果组中的一个成员作为事务提交操作的结果将 N 个字节写入存储，那么大约 N 个字节也会写入其他成员的存储，因为该事务被复制到任何地方。

但是，鉴于其他成员不必执行原始成员在最初执行事务时必须执行的相同数量的处理，因此他们可以更快地应用更改。事务以仅用于应用行转换的格式复制，而不必再次重新执行事务（基于行的格式）。

此外，鉴于更改以基于行的格式传播和应用，这意味着它们以优化和紧凑的格式接收，并且与原始成员相比可能会减少所需的 IO 操作数量。

总而言之，您可以通过将无冲突事务分散到组中的不同成员来扩展处理。而且您可能会横向扩展一小部分 IO 操作，因为远程服务器仅接收对稳定存储进行读取-修改-写入更改的必要更改。

### Group Replication 是否需要更多的网络带宽和 CPU，当

与简单的复制相比，在相同的工作量下？

一些额外的负载是预期的，因为服务器需要不断地相互交互以实现同步。很难量化还有多少数据。它还取决于组的大小（与组中的九台服务器相比，三台服务器对带宽要求的压力较小）。

此外，内存和 CPU 占用空间更大，因为服务器同步部分和群组消息传递的工作更复杂。

### 我可以跨广域网部署组复制吗？

是的，但是每个成员之间的网络连接*必须*可靠并具有适当的性能。低延迟、高带宽的网络连接是获得最佳性能的必要条件。

如果仅网络带宽是一个问题，那么[第 18.7.4 节，“消息压缩”](group-replication-message-compression.html)可用于降低所需的带宽。但是，如果网络丢包，导致重新传输和更高的端到端延迟，吞吐量和延迟都会受到负面影响。

警告

当任何组成员之间的网络往返时间 (RTT) 为 5 秒或更长时，您可能会遇到问题，因为可能会错误地触发内置故障检测机制。

### 成员是否会在临时的情况下自动重新加入群组

连接问题？

这取决于连接问题的原因。如果连接问题是暂时的并且重新连接足够快以至于故障检测器没有意识到它，那么服务器可能不会从组中删除。如果是“长”连接问题，则故障检测器最终会怀疑存在问题，并将服务器从组中删除。

从 MySQL 8.0 开始，有两种设置可用于增加成员留在或重新加入组的机会：

-   [`group_replication_member_expel_timeout`](group-replication-options.html#sysvar_group_replication_member_expel_timeout)增加产生怀疑（在最初的 5 秒检测期之后发生）和开除成员之间的时间。您可以设置最长为 1 小时的等待时间。从 MySQL 8.0.21 开始，默认设置为 5 秒的等待时间。

-   [`group_replication_autorejoin_tries`](group-replication-options.html#sysvar_group_replication_autorejoin_tries)使成员在驱逐或无法达到多数超时后尝试重新加入组。成员每隔五分钟进行指定次数的自动重新加入尝试。从 MySQL 8.0.21 开始，默认情况下会激活此功能，并且成员会尝试 3 次自动重新加入。

    如果服务器被从组中驱逐并且任何自动重新加入尝试都没有成功，您需要重新加入它。换句话说，从组中显式删除服务器后，您需要手动重新加入（或让脚本自动执行）。

### 成员何时从组中排除？

如果该成员变为静默，其他成员会将其从组配置中删除。实际上，当成员崩溃或网络断开时，可能会发生这种情况。

在给定成员的给定超时过去后检测到故障，并创建一个没有静默成员的新配置。

### 当一个节点明显落后时会发生什么？

没有方法可以定义何时自动将成员逐出组的策略。您需要找出成员落后的原因并解决该问题或从组中删除该成员。否则，如果服务器太慢以至于触发了流控制，那么整个组也会变慢。可以根据您的需要配置流量控制。

### 怀疑群里有问题，有没有特别成员

负责触发重新配置？

不，组中没有负责触发重新配置的特殊成员。

任何成员都可以怀疑存在问题。所有成员都需要（自动）同意给定成员失败。一名成员负责通过触发重新配置将其从组中驱逐出去。哪个成员负责驱逐该成员不是您可以控制或设置的。

### 我可以使用组复制进行分片吗？

Group Replication 旨在提供高可用的副本集；数据和写入在组中的每个成员上重复。为了超出单个系统所能提供的扩展，您需要一个围绕多个组复制集构建的编排和分片框架，其中每个副本集维护和管理整个数据集的给定分片或分区。这种类型的设置，通常称为“分片集群”，允许您以线性方式无限制地扩展读写。

### 如何在 SELinux 中使用组复制？

如果 SELinux 已启用，您可以使用它进行验证**状态-v**，那么您需要启用 Group Replication 通信端口的使用。看[为组复制设置 TCP 端口上下文](selinux-context-mysql-feature-ports.html#selinux-context-group-replication-port).

### 如何将组复制与 iptables 一起使用？

如果**iptables**启用后，您需要打开 Group Replication 端口以进行机器之间的通信。要查看每台机器上的当前规则，请发出**iptables -L**.假设配置的端口是 33061，通过发出命令启用必要端口上的通信**iptables -A INPUT -p tcp --dport 33061 -j ACCEPT**.

### 如何恢复组使用的复制通道的中继日志

成员？

Group Replication 使用的复制通道的行为方式与异步源中用于复制复制的复制通道相同，因此依赖于中继日志。如果发生变更[`中继日志`](replication-options-replica.html#sysvar_relay_log)变量，或者当未设置选项并且主机名更改时，可能会出错。看[第 17.2.4.1 节，“中继日志”](replica-logs-relaylog.html)在这种情况下的恢复过程。或者，在组复制中专门解决问题的另一种方法是发出[`停止 GROUP_REPLICATION`](stop-group-replication.html)声明，然后是[`开始 GROUP_REPLICATION`](start-group-replication.html)声明以重新启动实例。组复制插件创建`group_replication_applier`再次频道。

### 为什么 Group Replication 使用两个绑定地址？

组复制使用两个绑定地址，以便在客户端用于与成员通信的 SQL 地址和[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)，由组成员内部用于通信。例如，假设一个服务器有两个分配给网络地址的网络接口`203.0.113.1`和`198.51.100.179`.在这种情况下，您可以使用`203.0.113.1:33061`通过设置为内部组网络地址[`group_replication_local_address=203.0.113.1:33061`](group-replication-options.html#sysvar_group_replication_local_address).然后你可以使用`198.51.100.179`为了[`主机名`](server-system-variables.html#sysvar_hostname)和`3306`为了[`港口`](server-system-variables.html#sysvar_port).然后，客户端 SQL 应用程序将连接到成员`198.51.100.179:3306`.这使您可以在不同的网络上配置不同的规则。类似地，内部组通信可以与用于客户端应用程序的网络连接分开，以提高安全性。

### 组复制如何使用网络地址和主机名？

组复制使用成员之间的网络连接，因此其功能直接受您如何配置主机名和端口的影响。例如，组复制的分布式恢复过程使用服务器的主机名和端口创建与现有组成员的连接。当一个成员加入一个组时，它会收到组成员信息，使用列出的网络地址信息[`performance_schema.replication_group_members`](performance-schema-replication-group-members-table.html).该表中列出的成员之一被选为从组中向加入成员提供缺失数据的捐赠者。

这意味着您使用主机名配置的任何值（例如 SQL 网络地址或组种子地址）都必须是完全限定名称，并且可由组的每个成员解析。您可以确保这一点，例如通过 DNS，或正确配置`/etc/hosts`文件或其他本地进程。如果你想配置`会员主机`服务器上的值，使用[`--报告主持人`](replication-options-replica.html#sysvar_report_host)在加入组之前，请在服务器上选择。

重要的

指定的值直接使用，不受[`跳过\u名称\u解析`](server-system-variables.html#sysvar_skip_name_resolve)系统变量。

配置`成员港`在服务器上，使用[`报告港口`](replication-options-replica.html#sysvar_report_port)系统变量。

### 为什么服务器上的自动增量设置发生了变化？

在服务器上启动组复制时[`自动增量`](replication-options-source.html#sysvar_auto_increment_increment)已更改为的值[`组复制自动增量增量`](group-replication-options.html#sysvar_group_replication_auto_increment_increment)，默认为7，值为[`自动增量偏移`](replication-options-source.html#sysvar_auto_increment_offset)更改为服务器ID。当组复制停止时，这些更改将恢复。这些设置避免了为组成员上的写入选择重复的自动增量值，这会导致事务回滚。组复制的默认自动增量值7表示可用值的数量与复制组（9个成员）允许的最大大小之间的平衡。

只有在以下情况下才能进行更改并恢复[`自动增量`](replication-options-source.html#sysvar_auto_increment_increment)和[`自动增量偏移`](replication-options-source.html#sysvar_auto_increment_offset)每个都有默认值1。如果它们的值已从默认值修改，则组复制不会更改它们。在MySQL 8.0中，当组复制处于单主模式时，系统变量也不会被修改，其中只有一台服务器写入。

### 我怎么找到小学？

如果该组在单一主模式下运行，找出哪个成员是主模式可能会很有用。看见[第18.1.3.1.2节，“寻找主要目标”](group-replication-single-primary-mode.html#group-replication-find-primary)
