常见问题
本节提供常见问题的解答。
一个组中MySQL服务器的最大数量是多少?
一个组最多可以包含9个服务器。尝试将另一个服务器添加到具有9个成员的组中会导致拒绝加入请求。从测试和基准测试中可以确定此限制是安全的边界,在此范围内,组可以在稳定的局域网上可靠地运行。
组中的服务器如何连接?
组中的服务器通过打开对等TCP连接来连接到组中的其他服务器。这些连接仅用于组中服务器之间的内部通信和消息传递。该地址由group_replication_local_address
变量配置。
group_replication_bootstrap_group选项用于什么?
引导标志指示成员创建一个组并充当初始种子服务器。加入该组的第二个成员需要询问引导该组的成员动态更改配置,以便将其添加到该组。
成员需要在两种情况下引导组。最初创建组时,或者关闭并重新启动整个组时。
如何设置分布式恢复过程的凭据?
您可以使用该CHANGE MASTER TO
语句预先配置组复制恢复通道凭据。
我可以使用组复制来扩展写负荷吗?
不是直接,而是MySQL组复制是一种无共享的完全复制解决方案,其中组中的所有服务器都复制相同数量的数据。因此,如果作为事务提交操作的结果,组中的一个成员将N个字节写入存储,则大约N个字节也将被写入其他成员的存储,因为该事务被复制到各处。
但是,由于其他成员不必执行与原始成员最初执行事务时相同的处理量,因此他们可以更快地应用更改。事务以仅用于行转换的格式进行复制,而不必再次重新执行事务(基于行的格式)。
此外,考虑到更改是以基于行的格式传播和应用的,这意味着它们以优化且紧凑的格式接收,并且与原始成员相比,可能减少了所需的IO操作数。
总而言之,您可以通过将无冲突事务分布到组中的不同成员来扩展处理。而且,由于远程服务器仅接收必要的更改,以便对稳定存储进行读-修改-写更改,因此您可以扩展IO操作的一小部分。
与简单复制相比,在相同的工作负载下,组复制是否需要更多的网络带宽和CPU?
预期会产生一些额外的负载,因为服务器需要不断地相互交互以达到同步目的。很难量化多少数据。它还取决于组的大小(与组中的九台服务器相比,三台服务器对带宽要求的压力较小)。
内存和CPU占用空间也更大,因为服务器同步部分和组消息传递要完成更复杂的工作。
是否可以在广域网中部署组复制?
是的,但是每个成员之间的网络连接必须可靠并具有适当的性能。低延迟,高带宽网络连接是实现最佳性能的要求。
如果仅网络带宽是一个问题,则可以使用“消息压缩”来降低所需的带宽。但是,如果网络丢弃数据包,导致重新传输和更高的端到端延迟,则吞吐量和延迟都会受到负面影响。
警告当任何组成员之间的网络往返时间(RTT)为5秒或更长时,您可能会遇到问题,因为内置故障检测机制可能会被错误地触发。
如果出现临时连接问题,成员是否会自动重新加入组?
这取决于连接问题的原因。如果连接问题是暂时性的,并且重新连接的速度足够快,以使故障检测器无法意识到,则可能无法将服务器从组中删除。如果是“长”连接问题,则故障检测器最终会怀疑是问题,然后将服务器从组中删除。
在MySQL 8.0中,您可以激活两个设置来增加成员保留在组中或重新加入组的机会:
group_replication_member_expel_timeout
增加了从产生怀疑(在最初的5秒检测周期之后发生)到成员被驱逐之间的时间。您最多可以设置1小时的等待时间。group_replication_autorejoin_tries
使成员在被驱逐或多数派超时后尝试重新加入该组。成员间隔五分钟进行指定次数的自动重新加入尝试。
如果服务器被从组中驱逐,并且任何自动重新加入尝试均未成功,则需要再次将其加入。换句话说,将服务器从组中显式删除后,您需要手动重新加入服务器(或让脚本自动执行该操作)。
成员何时从组中排除?
如果该成员变为静音,则其他成员将其从组配置中删除。实际上,当成员崩溃或网络断开时,可能会发生这种情况。
在给定成员经过给定超时并检测到没有静默成员的新配置之后,将检测到故障。
当一个节点明显落后时会发生什么?
没有方法来定义何时自动将成员从组中驱逐的策略。您需要找出成员落后的原因,然后进行修复或将其从组中删除。否则,如果服务器太慢以至于触发了流控制,那么整个组也会变慢。可以根据需要配置流量控制。
当怀疑该组中存在问题时,是否有一个特殊成员负责触发重新配置?
不,该组中没有负责触发重新配置的特殊成员。
任何成员都可以怀疑存在问题。所有成员都需要(自动)同意给定成员已失败。一名成员负责通过触发重新配置将其从小组中驱逐出去。您无法控制或设置哪个成员负责驱逐该成员。
我可以使用组复制进行分片吗?
组复制旨在提供高可用性的副本集;数据和写入在组中的每个成员上重复。为了扩展到单个系统无法提供的范围,您需要一个围绕多个组复制集构建的编排和分片框架,其中每个副本集维护和管理总数据集的给定分片或分区。这种类型的设置(通常称为“分片群集”)使您可以无限制地线性扩展读写。
如何在SELinux中使用组复制?
如果启用了SELinux(可以使用sestatus -v进行验证),则需要启用group_replication_local_address
对mysqld使用的由组配置的组复制通信端口,以便它可以绑定并监听它。要参见MySQL当前配置使用的端口,请发出:
shell>semanage port -l | grep mysqld
假设“组复制”通信端口为33061,则通过发出以下命令将其添加到SELinux允许的端口中:
shell>semanage port -a -t mysqld_port_t -p tcp 33061
此外,seboolean mysql_connect_any
需要设置为ON
。例如问题:
shell>setsebool -P mysql_connect_any=ON
有关更多信息,请参见SELinux文档。
如何将组复制与iptables一起使用?
如果启用了iptables,则需要打开组复制端口以在计算机之间进行通信。要参见每台计算机上的当前规则,请发出iptables -L。假设配置的端口为33061,请通过发出iptables -A INPUT -p tcp --dport 33061 -j ACCEPT来启用必要端口上的通信。
如何为组成员使用的复制通道恢复中继日志?
组复制使用的复制通道的行为与主复制到从复制中使用的复制信道相同,因此依赖中继日志。如果relay_log
变量发生更改,或者未设置选项且主机名发生更改,则可能会出现错误。有关这种情况下的恢复过程,请参见“从站中继日志”。另外,解决组复制中特定问题的另一种方法是先发出一条STOP GROUP_REPLICATION
语句,然后发出一条START GROUP_REPLICATION
语句以重新启动实例。组复制插件group_replication_applier
再次创建通道。
为什么组复制使用两个绑定地址?
组复制使用两个绑定地址,以便在客户端用于与成员通信的SQL地址与group_replication_local_address
组成员在内部用于通信的SQL地址之间分配网络流量。例如,假设服务器具有两个分配给网络地址203.0.113.1
和的网络接口198.51.100.179
。在这种情况下,可以203.0.113.1:33061
通过设置使用内部组网络地址group_replication_local_address=203.0.113.1:33061
。然后你可以使用198.51.100.179
的hostname
和3306
为port
。然后,客户端SQL应用程序将连接到的成员198.51.100.179:3306
。这使您可以在不同的网络上配置不同的规则。同样,可以将内部组通信与用于客户端应用程序的网络连接分开,以提高安全性。
组复制如何使用网络地址和主机名?
组复制使用成员之间的网络连接,因此,其功能直接受到配置主机名和端口的方式的影响。例如,组复制的分布式恢复过程使用服务器的主机名和端口创建到现有组成员的连接。当成员加入组时,它使用列出的网络地址信息接收组成员信息performance_schema.replication_group_members
。该表中列出的成员之一被选为从组到加入成员的丢失数据的提供者。
这意味着您使用主机名配置的任何值(例如SQL网络地址或组种子地址)都必须是标准名称,并且组的每个成员都可以解析。您可以例如通过DNS或正确配置的/etc/hosts
文件或其他本地进程来确保这一点。如果要MEMBER_HOST
在服务器上配置该值,请在将其--report-host
加入组之前使用服务器上的选项进行指定。
重要分配的值直接使用,不受
skip_name_resolve
系统变量的影响。
要MEMBER_PORT
在服务器上进行配置,请使用report_port
系统变量进行指定。
为什么服务器上的自动增量设置会更改?
在服务器上启动组复制时,的值auto_increment_increment
更改为的值group_replication_auto_increment_increment
,默认为7,而的值auto_increment_offset
更改为服务器ID。停止组复制时,将还原更改。这些设置避免为组成员上的写入选择重复的自动增量值,这会导致事务回滚。组复制的默认自动增量值为7,表示可用值数量与复制组的允许最大大小(9个成员)之间的平衡。
仅当auto_increment_increment
且auto_increment_offset
每个更改的默认值均为1时,才进行更改并还原。如果已将默认值修改为默认值,则组复制不会更改它们。从MySQL 8.0开始,当组复制处于只有一个服务器写入的单主模式下时,系统变量也不会被修改。
我如何找到主要的?
如果该组以单主要模式运行,则找出哪个成员是主要成员将很有用。请参见“多主模式和单主模式”