17.8 常见问题

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

一组中 MySQL 服务器的最大数量是多少?

一个组最多可以包含 9 个服务器。尝试将另一个服务器添加到具有 9 个成员的组中会导致拒绝加入请求。从测试和基准测试中可以确定此限制是安全的边界,在此范围内,组可以在稳定的局域网上可靠地运行。

组中的服务器如何连接?

组中的服务器通过打开对等 TCP 连接来连接到组中的其他服务器。这些连接仅用于组中服务器之间的内部通信和消息传递。此地址由group_replication_local_address变量配置。

group_replication_bootstrap_group 选项用于什么?

引导标志指示成员“创建”组并充当初始种子服务器。加入该组的第二个成员需要询问引导该组的成员动态更改配置,以便将其添加到该组。

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

如何设置恢复过程的凭据?

您可以使用更改为主语句预先配置组复制恢复通道凭据。

我可以使用组复制来扩展写负荷吗?

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

但是,由于其他成员不必执行与原始成员最初执行事务时相同的处理量,因此他们可以更快地应用更改。事务以仅用于行转换的格式进行复制,而不必再次重新执行事务(基于行的格式)。

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

总而言之,您可以通过在组中的不同成员之间分散无冲突的事务来扩展处理。而且,由于远程服务器仅接收必要的更改,以便对稳定存储进行读-修改-写更改,因此您可以扩展 IO 操作的一小部分。

与简单复制相比,在相同的工作负载下,组复制是否需要更多的网络带宽和 CPU?

预期会产生一些额外的负载,因为服务器为了同步目的需要不断相互交互。很难量化多少数据。它还取决于组的大小(与组中的九台服务器相比,三台服务器对带宽要求的压力较小)。

内存和 CPU 占用空间也更大,因为服务器同步部分和组消息传递要完成更复杂的工作。

我可以在广域网中部署组复制吗?

是的,但是每个成员之间的网络连接必须可靠并且具有适当的性能。低延迟,高带宽网络连接是实现最佳性能的要求。

如果仅网络带宽是一个问题,则可以使用第 17.9.7.2 节“消息压缩”来降低所需的带宽。但是,如果网络丢弃数据包,导致重新传输和更高的端到端延迟,则吞吐量和延迟都会受到负面影响。

Warning

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

如果出现临时连接问题,成员是否会自动重新加入组?

这取决于连接问题的原因。如果连接问题是暂时性的,并且重新连接的速度足够快,以至于故障检测器无法意识到,则可能无法将服务器从组中删除。如果是“长”连接问题,则故障检测器最终会怀疑是问题,然后将服务器从组中删除。

将服务器从组中删除后,您需要再次将其重新加入。换句话说,将服务器从组中显式删除后,您需要手动重新加入服务器(或让脚本自动执行该操作)。

什么时候将成员从组中排除?

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

在给定成员经过给定超时并检测到没有静默成员的新配置之后,将检测到故障。

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

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

怀疑组中存在问题时,是否有特殊成员负责触发重新配置?

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

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

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

组复制旨在提供高可用性的副本集;数据和写入在组中的每个成员上重复。为了扩展到单个系统无法提供的范围,您需要一个围绕多个组复制集构建的业务流程和分片框架,其中每个副本集维护和 Management 总数据集的给定分片或分区。这种类型的设置(通常称为“分片群集”)使您可以无限制地线性扩展读写。

如何在 SELinux 中使用组复制?

如果启用了 SELinux(可以使用 sestatus -v 进行验证),则需要启用“组复制”通信端口。参见设置用于组复制的 TCP 端口上下文

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

如果启用了 iptables ,则需要打开组复制端口以在计算机之间进行通信.要查看每台计算机上的当前规则,请发出 iptables -L 。假设配置的端口为 33061,请通过发出 iptables -A INPUT -p tcp --dport 33061 -j ACCEPT **来启用必要端口上的通信。

如何为组成员使用的复制通道恢复中继日志?

组复制使用的复制通道的行为方式与源到副本复制中使用的复制通道的行为相同,因此依赖中继日志。如果更改了relay_log变量,或者未设置选项且主机名发生更改,则可能会出现错误。有关这种情况下的恢复过程,请参见第 16.2.4.1 节“中继日志”。另外,解决组复制问题的另一种方法是发出STOP GROUP_REPLICATION语句,然后发出START GROUP_REPLICATION语句以重新启动实例。组复制插件再次创建group_replication_applier通道。

为什么组复制使用两个绑定地址?

组复制使用两个绑定地址,以便在 Client 端用于与成员进行通信的 SQL 地址与组成员在内部用于进行通信的group_replication_local_address之间分配网络流量。例如,假设服务器具有分配给网络地址203.0.113.1198.51.100.179的两个网络接口。在这种情况下,可以通过设置group_replication_local_address=203.0.113.1:33061203.0.113.1:33061用作内部组网络地址。然后,您可以将198.51.100.179用于hostname并将3306用于port。然后,Client 端 SQL 应用程序将在198.51.100.179:3306连接到该成员。这使您可以在不同的网络上配置不同的规则。同样,可以将内部组通信与用于 Client 端应用程序的网络连接分开,以提高安全性。

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

组复制使用成员之间的网络连接,因此,其功能直接受到配置主机名和端口的方式的影响。例如,组复制恢复过程基于异步复制,该异步复制使用服务器的主机名和端口。当成员加入组时,它使用performance_schema.replication_group_members列出的网络地址信息接收组成员信息。该 table 中列出的成员之一被选为从组到新成员的丢失数据的提供者。

这意味着您使用主机名配置的任何值(例如 SQL 网络地址或组种子地址)都必须是标准名称,并且组的每个成员都可以解析。您可以通过 DNS 或正确配置的/etc/hosts文件或其他本地进程来确保这一点。如果要在服务器上配置MEMBER_HOST值,请在将其加入组之前使用服务器上的--report-host选项指定它。

Important

分配的值直接使用,不受skip_name_resolve系统变量的影响。

要在服务器上配置MEMBER_PORT,请使用report_port系统变量进行指定。

为什么服务器上的自动增量设置更改了?

在服务器上启动组复制时,值auto_increment_increment更改为值group_replication_auto_increment_increment,默认值是 7,而值auto_increment_offset更改为服务器 ID。停止组复制时,将还原更改。这些设置避免为组成员上的写入选择重复的自动增量值,因为这会导致事务回滚。组复制的默认自动增量值为 7,table 示可用值数与复制组的允许最大大小(9 个成员)之间的平衡。

仅当auto_increment_incrementauto_increment_offset的默认值均为 1 时,才进行更改并还原。如果它们的值已被更改为默认值,则组复制不会更改它们。

如何找到主要的?

如果该组以单主要模式运行,则找出哪个成员是主要成员将很有用。见第 17.4.1.3 节“查找主”