本节提供常见问题的解答。
一个组最多包含9台服务器。尝试向有9个成员的组中添加另一个服务器会导致加入请求被拒绝。通过测试和基准测试,该极限被确定为安全边界,在该边界下,团队可以在稳定的局域网上可靠地执行。
组中的服务器通过打开对等TCP连接连接到组中的其他服务器。这些连接仅用于组内服务器之间的内部通信和消息传递。该地址由group_replication_local_address
变量。
引导标志指示成员创建一个组,并充当初始种子服务器。第二个加入组的成员需要要求引导组的成员动态更改配置,以便将其添加到组中。
成员需要在两种情况下引导组。当最初创建组时,或当关闭并重新启动整个组时。
控件的凭据可以永久地设置用户凭据group_replication_recovery
通道,使用将复制源更改为
语句(从MySQL 8.0.23)或改变主
语句(在MySQL 8.0.23之前)。或者,从MySQL 8.0.21中,您可以在开始GROUP_REPLICATION
语句。
使用将复制源更改为
|改变主
以纯文本的形式存储在服务器上的复制元数据存储库中,但是在开始GROUP_REPLICATION
只保存在内存中,并通过停止GROUP_REPLICATION
语句或服务器关闭。使用开始GROUP_REPLICATION
指定用户凭据,因此有助于保护组复制服务器免受未经授权的访问。方法所指定的,此方法与自动启动组复制不兼容group_replication_start_on_boot
系统变量。有关更多信息,请参见第18.6.3.1节“分布式恢复的安全用户凭证”.
不是直接的,但是MySQL组复制是一个无共享的全复制解决方案,组中的所有服务器复制相同数量的数据。因此,如果组中的一个成员作为事务提交操作的结果向存储区写入N个字节,那么大约也会向其他成员的存储区写入N个字节,因为事务在所有地方都被复制。
然而,由于其他成员不需要执行原始成员在最初执行事务时所做的相同数量的处理,因此它们应用更改的速度更快。以仅用于应用行转换的格式复制事务,而不必再次重新执行事务(基于行的格式)。
此外,由于更改是以基于行的格式传播和应用的,这意味着它们以优化和紧凑的格式接收,与原始成员相比可能减少所需的IO操作数量。
总而言之,您可以通过将无冲突事务分散到组中的不同成员中来扩展处理。而且您可能可以扩展一小部分IO操作,因为远程服务器只接收到对稳定存储的读-修改-写更改的必要更改。
预计会有一些额外的负载,因为服务器需要为了同步目的而不断地相互交互。很难量化还需要多少数据。它还取决于组的大小(3台服务器对带宽需求的压力小于组中的9台服务器)。
此外,内存和CPU占用也更大,因为服务器同步部分和组消息传递需要完成更复杂的工作。
是的,但是每个成员之间的网络连接必须可靠,性能合适。低延迟、高带宽的网络连接是优化性能的必要条件。
如果网络带宽本身就是个问题,那么第18.7.3节,“消息压缩”可以用来降低所需的带宽。然而,如果网络丢弃数据包,导致重传和更高的端到端延迟,吞吐量和延迟都将受到负面影响。
当任何组成员之间的网络往返时间(RTT)为5秒或更长时间时,您可能会遇到问题,因为内置的故障检测机制可能被错误地触发。
这取决于连接问题的原因。如果连接问题是短暂的,并且重新连接的速度足够快,以至于故障检测器没有意识到它,那么服务器可能不会从组中删除。如果是“长”连接问题,则故障检测器最终怀疑存在问题,并将服务器从组中删除。
在MySQL 8.0中,有两种设置可以增加一个成员留在或重新加入一个组的机会:
group_replication_member_expel_timeout
增加产生怀疑(在最初的5秒检测周期后发生)和成员被驱逐之间的时间。您可以设置最长1小时的等待时间。从MySQL 8.0.21开始,默认设置了5秒的等待时间。group_replication_autorejoin_tries
使成员在被驱逐或无法到达多数超时后尝试重新加入组。该成员每隔5分钟进行指定次数的自动重新加入尝试。从MySQL 8.0.21开始,这个特性在默认情况下是激活的,成员会进行三次自动重新加入尝试。
如果一个服务器从组中被驱逐,并且任何自动重新加入尝试都没有成功,您需要再次加入它。换句话说,在显式地从组中删除服务器后,您需要手动重新加入它(或让脚本自动执行此操作)。
如果该成员变为静默状态,则其他成员将其从组配置中移除。实际上,这可能发生在成员崩溃或网络断开时。
在给定成员超过给定超时后检测到失败,并创建一个不包含静默成员的新配置。
没有方法定义何时从组中自动驱逐成员的策略。您需要找出成员落后的原因,并修复或从组中删除该成员。否则,如果服务器非常慢以至于触发了流控制,那么整个组也会变慢。流量控制可根据您的需要进行配置。
不,组中没有专门的成员负责触发重构。
任何成员都可能怀疑有问题。所有成员需要(自动)同意某个成员失败了。一个成员负责通过触发重新配置将其从组中驱逐出去。哪个成员负责驱逐成员不是你可以控制或设置的。
组复制旨在提供高可用性的副本集;组中每个成员的数据和写都是重复的。为了超越单个系统所能提供的功能,您需要一个围绕许多Group Replication集构建的编排和分片框架,其中每个副本集维护和管理总数据集的给定碎片或分区。这种设置,通常被称为”分片集群”,允许您线性扩展读和写,没有限制。
如果启用了SELinux,您可以使用sestatus - v,则需要启用使用Group Replication通信端口。看到设置组复制的TCP端口上下文.
如果iptables,那么您需要打开Group Replication端口,以便在计算机之间进行通信。要查看每台机器上的当前规则,请发出iptables - l.假设配置的端口是33061,通过发出来在必要的端口上启用通信iptables -A INPUT -p tcp——dport 33061 -j ACCEPT.
组复制使用的复制通道与异步源复制复制中使用的复制通道的行为相同,因此依赖于中继日志。在发生变化的情况下relay_log
变量,或者当未设置该选项且主机名更改时,可能会出现错误。看到第17.2.4.1节“中继日志”用于此情况下的恢复过程。或者,解决这个问题的另一种方法(特别是在组复制中)是发出一个停止GROUP_REPLICATION
语句,然后是开始GROUP_REPLICATION
语句重新启动实例。组复制插件创建group_replication_applier
频道了。
组复制使用两个绑定地址,以便在客户机用于与成员通信的SQL地址和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
.然后你可以用198.51.100.179
为主机名
而且3306
为港口
.客户机SQL应用程序将连接到的成员198.51.100.179:3306
.这使您能够在不同的网络上配置不同的规则。类似地,内部组通信可以与用于客户端应用程序的网络连接分离,以提高安全性。
组复制使用成员之间的网络连接,因此它的功能直接受到主机名和端口配置方式的影响。例如,Group Replication的分布式恢复过程使用服务器的主机名和端口创建到现有组成员的连接。当一个成员加入一个组时,它使用列在的网络地址信息接收组成员信息performance_schema.replication_group_members
.选择该表中列出的成员之一作为将组中缺失的数据提供给加入成员的捐赠者。
这意味着使用主机名配置的任何值(如SQL网络地址或组种子地址)都必须是完全限定名,并且可以由组的每个成员解析。您可以通过DNS或正确配置来确保这一点设置
文件或其他本地进程。如果您想配置MEMBER_HOST
值,使用——主持人
选项,然后将其加入组。
方法直接使用指定的值,不受skip_name_resolve
系统变量。
配置MEMBER_PORT
在服务器上,使用report_port
系统变量。
当在服务器上启动组复制时,的值auto_increment_increment
的值group_replication_auto_increment_increment
,默认值为7,值为auto_increment_offset
更改为服务器ID。当停止组复制时,更改将被恢复。这些设置避免了为写组成员而选择重复的自动递增值,这会导致事务回滚。“Group Replication”的默认自动增量值为7,表示复制组的可用值与允许的最大复制组大小(9个成员)之间的平衡。
只有当auto_increment_increment
而且auto_increment_offset
它们的默认值都是1。如果已经从默认值修改了它们,则Group Replication不会更改它们。从MySQL 8.0中,当Group Replication处于单主模式(即只有一台服务器写入)时,也不会修改系统变量。
如果组在单主模式下运行,那么找出哪个成员是主成员是很有用的。看到第18.1.3.1.2节“寻找Primary”