本文提供常被问到问题的答案。

1.复制组中最多能有多少个mysql服务器?

复制组最多包含9个mysql服务器。尝试向已有9个服务器的组添加另外的服务器将被拒绝。

2.组内服务器间如何连接?

组内服务器间通过打开端到端TCP连接进行。这些连接仅用于内部通信和组内服务器间的信息传递。该地址通过group_replication_local_address变量进行配置。

3.group_replication_bootstrap_group选项的作用?

Bootstrap标识指示成员创建一个组并作为最初的种子服务器。加入该组的第二个成员需要询问最初启动该组的成员动态改变配置以便将其加入该组。一个成员在两种场景启动复制组。那就是,组最初创建时,或关闭并重启整个组时。

4.如何设置恢复过程的凭证?

通过change master to语句,您能预配置组复制恢复通道凭证。

5.如何通过组复制水平扩展写负载?

不是直接地,但mysql组复制是shared nothing的全复制解决方案,其中,组内所有服务器复制同等数量的数据。因此,如果组内一个成员作为一个事务提交结果向存储写入N个字节,那么,也向其他成员的存储写入大约N个字节,因为该事务被复制到所有地点。

但是,其他成员不必做原始成员最初执行事务时必须做的同等数量的处理,它们会更快的应用这些变更。事务按照仅用于应用行转变的格式复制,而不是必须再重新执行事务(基于行的格式)。

但是,变更被传播并按照基于行的格式应用,这意味着其以优化和压缩格式接收,且与其原始成员比较,可能减少了IO操作的数量。

总之,通过将不会发生冲突的事务分散到组内的不同服务器上,您能水平扩展处理。由于远程服务器仅接收稳定存储的读-改-写变更的必要变更,您可能水平扩展一小部分IO操作。

6.与相同负载下的简单复制相比,组复制需要更多的网络带宽和CPU吗?
因为为了同步目的,服务器间需要连续的交互,所以,也许会发生某些另外的负载。但难以量化具体多出多少数据。具体也看组的规模大小(组内3个服务器比9个服务器要求更少的带宽需求)。

内存和CPU占用也会大很多,因为服务器同步和组信息也会做更复杂的工作。

7.是否能在广域网上部署组复制?

可以,但成员间的网络连接必须可靠且有合适的性能。低延迟、高带网络连接是最优性能的前提。

如果网络带宽是个单独问题,那么,“信息压缩”可以用来降低带宽需求。但是,如果网络丢包,导致重传和较高端到端延迟,吞吐和延迟都会遭受负面影响。

--注:

1)当任何组成员间的网络往返时间(RTT)为2秒或更多时,您可能会遭遇内建失败探测机制不能正确触发的问题。

8.成员发生临时连接问题时是否会自动重新加入复制组?

这要看连接问题的原因。如果连接问题是暂时的且重连足够快以至于失败探测器没意识到,那么,服务器也许不会从该组移除。如果发生了“长久”的连接问题,那么,失败探测器最终会怀疑该问题,且服务器会从该组中移除。

一旦服务器从组内移除,您需要再将其重新加入复制组。换句话说,服务器显式从复制组移除后,您需要先后共将其重新加入复制组(或通过脚本自动完成)。

9.什么时候会将一个成员从复制组排除?

如果该成员边的没反应,其他成员将从组配置中将其移除。实践中,成员崩溃或网络断开时会发生这种场景。

指定成员超过指定时间后会探测到失败,且将会创建一个不包含没反应成员的新配置。

10.一个节点发生严重延迟时会发生什么?

没办法定义什么时候从复制组自动驱逐成员的策略。您需要找出成员延迟的原因并对其进行修复,或将该成员从内移除。

但是,如果服务器因为太慢而触发了流控,那么,整个复制组都会慢下来。可以根据需要对流控进行配置。

11.针对组内存疑问题,有一个特定成员负责触发重新配置吗?

没有,组内没有特定成员负责触发重新配置。

任何成员都能怀疑发生过了问题。所有成员需要(自动地)就指定成员失败达成一致。通过触发重新配置,某个成员负责将其驱逐出复制组。

您不能控制或设置哪个成员负责驱逐成员。

12.我可以用组复制进行分片(sharding)吗?

组复制设计用来支持高可用副本集;数据和写复制到组内的每个成员。扩展超出了单个系统的支撑范围,您需要围绕多个组复制集构建一个分片框架,其中,每个副本集维护和管理总数据集的指定分片或分区。这种设置,通常称为一个“分片集群(sharded cluster)”,其允许您线性的扩展读写且没有限制。

13.如何与SELinux使用组复制?

如果开启了SELinux,您可以通过setstatus –v对其进行验证,那么,您需要为mysql开启组复制通信端口,通过group_replication_local_address对其进行配置,以便其能绑定和在那里监听。为了查看mysql目前允许使用那些端口,可以发布semanage port –l |grep mysqld。假设配置的端口为6606,通过semanage –a –t mysqld_port_t –p tcp 6606来向SELinux添加必要允许的端口。

14.如何与iptables使用组复制?

如果iptables开启,那么,您需要在机器间打开组复制端口。为了查看每台机器的现有规则,发布iptables –L。假设配置端口为6606,发布iptables –A INPUT –p tcp –dport 6606 –j ACCEPT来开启必要端口间的通信。

15.如何恢复组成员使用的复制通道的中继日志(relay log)?

组复制使用的复制通道与主备复制使用的复制通道行为方式一样,像都基于中继日志(relay log)。改变relay_log变量时,或不设置该选项且改变主机名时,可能会发生错误。另外,修复复制组中该特定问题的一个方法是发布STOP GROUP_REPLICATION语句并接着发布START GROUP_REPLICATION语句以重启实例。组复制插件再次创建group_replication_applier通道。

16.复制组为什么使用绑定地址?

复制组使用两个地址,以便将客户端与组成员通信用的SQL地址和组成员内部通信用的group_replication_local_address间的网络交通分开。例如:假设一个服务器有两个网卡,分别分配地址为203.0.113.1和198.51.100.179。这种情况下,您能通过设置group_replication_local_address=203.0.113.1:33061将203.0.113.1:33061作为组内部网络地址。那么,您能用198.51.100.179作为主机地址和3306作为端口。客户端SQL应用接着将连到位于198.51.100.179:3306的成员。这使得您能在不同网络配置不同规则。类似地,组内部通信能与客户端连接使用的网络连接分开,从而增加安全性。

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

组复制使用成员间的网络连接,所以,如何配置主机名和端口会直接影响其功能。例如:组复制恢复过程基于使用服务器主机名和端口的异步复制。当一个成员加入组时,其使用列在performance_schema.replication_group_members中的网络地址信息接收组成员信息。列在该表中的一个成员选择作为组合新成员间丢失数据的捐赠者。

这意味着您使用像SQL网络地址或组种子地址的主机名配置的任何值,必须是一个完全限定名字,且可以被每个组成员解析。您可以通过像DNS,或正确配置的/etc/hosts文件,或其他本地进程来确保这点。

如果您想在服务器上配置MEMBER_HOST值,服务器加入组前用—report-host选项对其进行指定。

--注:

1)分配值直接使用而不受—skip-nameresolve选项的影响。

为了配置服务器的MEMBER_PORT,用—report-port选项指定。

18.如何发现主库?

如果组在单主模式操作,发现那个成员是主库是有用的。下列命令用于发现复制组的主库:

mysql> SHOW STATUS LIKE 'group_replication_primary_member'