专栏首页「3306 Pai」社区好文推荐|MySQL 8.0 常见问题——群组复制篇

好文推荐|MySQL 8.0 常见问题——群组复制篇

作者:徐轶韬 转自:MySQL解决方案工程师(mysqlse)

1,群组复制和 InnoDB Cluster 有什么区别?

群组复制(MySQL Group Replication)是 InnoDB Cluster 的一部分。

InnoDB Cluster是MySQL推出的整体解决方案,用于实现MySQL的高可用性和可扩展性,由MySQL Group Replication、MySQL Router 和 MySQL Shell三部分组成。MySQL Router是一个轻量级的中间件,MySQL Shell是一个集开发、管理于一体的客户端软件。

2,群组复制可以跨广域网部署吗?

可以,但是每个成员之间的网络连接必须可靠并可以保持高性能的网络通信。注意:当群组成员之间的网络往返时间(RTT)超过5秒时,可能会触发内置的故障检测机制。

3,群组中的服务器是如何连接的?

群组中的服务器通过点对点的TCP连接进行组内通信。这些连接仅用于组内服务器之间的内部通信和消息传递。地址通过group_replication_local_address变量进行配置

4,group_replication_bootstrap_group选项是做什么的?

指示成员创建一个群组并充当初始种子服务器。加入群组的第二个成员需要请求种子成员动态更改配置,以便将其添加到群组中。 在最初创建群组时,或在关闭和重新启动整个群组时,需要一个种子成员引导群组。

5,可以使用群组复制扩展数据写入负载吗?

无法直接实现。群组复制是一个非共享的完整复制解决方案,每个成员上面的数据完全一致。但是,相对于数据写入的原始服务器,其他服务器上数据的应用是基于数据行格式(row-based format)来实现的,因此,其他的服务器无需像原始服务器一样完整的执行事务,并且由于采用row-based 进行传播和应用,意味着接收的是经过优化和紧凑的格式,可能会减少IO操作。因此,用户可以通过将无冲突事务分散到群组中的不同成员来扩展处理。还可以扩展一小部分IO操作。

6,群组复制可以用于数据分片吗?

群组复制的目的在于提供高可用的复制集。在群组中的每个成员上复制数据和写入操作。要扩展到单个系统所能提供的范围之外,用户需要一个围绕多个群组复制集进行编排和构建分片框架,其中每个复制集维护和管理给定分片或分区。这种类型的设置通常称为“分片集群”,允许用户线性地伸缩读写,而且没有限制。

7,什么情况下,成员被移出群组?

如果成员变为静默,则其他成员将其从群组配置中删除。当成员崩溃或网络断开连接时,可能会发生这种情况。当检测到故障后,会为群组创建一个没有静默成员的新配置。

8,群组复制多主模式下,如何确保数据不会产生冲突?

多主模式下,在不同成员上并行执行更新处理,事务提交时,使用主键进行冲突检测。并行更新不同数据行的事务,不会发生冲突。更新相同数据行时,只有一个事务可以提交,其他的必须回滚。此外,需要注意,对于同一个对象执行DDL和DML应在同一个成员上进行,否则会产生错误。

9,群组复制如何处理脑裂(网络分区)?

当群组成员检测到丢失大多数成员时,在该成员上无法执行更新处理,更新处理被拦住等待,Select语句可以正常运行。也就是说,当发生网络分区时,占群组少数部分的成员无法继续进行更新处理。当网络恢复时,群组成员之间数据进行同步处理。

10,群组复制如何确保数据的强一致性?

可以通过对变量group_replication_consistency的设置影响(保证)数据的一致性。

EVENTUAL(默认值)事务在执行之前不等待先前的事务应用,也不等待其他成员应用其更改。

BEFORE 事务将在开始执行之前等待所有先前的事务完成。这可确保此事务将在最新的数据快照上执行,而不用管是哪个成员。

AFTER 事务将等待其更改已应用于其他成员。这可确保一旦此事务完成,所有后续事务都会读取包含其更改的数据库状态,而不管它们在哪个成员上执行。

BEFORE_AND_AFTER 事务将等到:1)所有先前的事务在开始执行之前完成;2)其变更已适用于其他成员。这可确保:1)此事务将在最新的数据快照上执行;2)一旦此事务完成,所有后续事务都会读取包含其更改的数据库状态,而不管它们在哪个成员上执行。

11,出现网络问题后,离开群组的成员能否重新加入群组?

首先,成员是否被移出群组取决于发生网络问题的时长,如果时长很短,故障探测器没有发现,则该成员不会被移出群组,反之则会被移出群组。MySQL8.0可以通过两个变量对该行为进行设置:

group_replication_member_expel_timeout 设置从创建怀疑(在最初的5秒检测周期之后发生)到驱逐成员之间的时间。可以设置最多1小时的等待时间。

group_replication_autorejoin_tries 使成员在被移出或无法到达的超时之后尝试重新加入群组。该成员每隔5分钟进行指定数量的自动重新联接尝试。

如果服务器被移出群组,并且自动重新加入尝试没有成功,则需要重新加入。(手动地重新加入或者使用脚本自动地重新加入)。

12,当一个成员的更新明显落后时,会发生什么情况?

如果成员明显落后,触发了流量控制,整个群组也会变慢。用户需要找出成员落后的原因,并解决这个问题,或者将该成员从群组中删除。

13,当怀疑群组出现问题时,是否有特殊的成员负责触发重新配置?

没有。任何成员都可以怀疑群组存在问题。当全部成员都(自动)认为某个指定的成员失败时,群组中的一个成员通过触发重新配置,负责将其从群组中驱逐出去。用户无法控制或设置哪个成员负责驱逐该成员。

14,相对于主从复制,在相同的工作负载情况下,群组复制是否需要更多的带宽和CPU资源?

是的,需要消耗更多的CPU和网络带宽资源。并且群组内成员的数量会对其产生影响,3个成员的消耗要明显小于9个成员的消耗。

15,使用SELinux时如何使用组复制?

如果启用了SELinux,需要为mysqld启用群组复制通信端口(由group_replication_local_address配置),以便可以对其绑定并监听。

要查看MySQL当前允许使用哪些端口,可以执行semanage port -l | grep mysqld。假设配置的端口是33061,执行semanage port -a -t mysqld_port_t -p tcp 33061,将必要的端口添加到SELinux允许的端口。

16,使用iptable时如何使用群组复制?

如果启用了iptable,则需要打开群组复制端口,以便服务器之间进行通信。查看每台机器上的当前规则,执行iptables -L。假设所配置的端口是33061,通过执行 iptables -A INPUT -p tcp -dport 33061 -j ACCEPT 来启用必要端口上的通信。

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

群组复制使用的复制通道的行为与主从复制中相同,依赖于中继日志。如果relay_log变量发生了变化,或者没有设置该选项,并且主机名发生了更改,那么就有可能出现错误。解决此问题的一种方法是停止从服务器,将旧中继日志索引文件的内容预先添加到新索引文件中,然后重新启动从服务器。。另外一种解决群组复制中特定问题的方法是执行STOP GROUP_REPLICATION语句,然后执行START GROUP_REPLICATION语句来重新启动实例。

18,为何群组复制使用2个绑定地址?

使用2个绑定地址目的在于分离网络流量。指定 group_replication_local_address 用于内部成员通信。

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

当成员加入群组时,将通过performance_schema.replication_group_members获取网络地址信息,从而获得成员信息。这意味着使用主机名配置的任何值,都必须是完全限定的名称,并且可以由群组中的每个成员解析。例如,可以通过DNS、正确配置的/etc/hosts文件或其他本地进程来确保这一点。如果要在服务器上配置MEMBER_HOST值,请在将其加入到群组之前使用服务器上的--report-host选项指定。

20,为何服务器上的自增值发生了变化?

当启动群组复制时,服务器上auto_increment_increment 的值会变为 group_replication_auto_increment_increment的值(默认为7),auto_increment_offset 的值会变为server ID。当群组复制停止时,会恢复过来。这些设置避免了群组成员写入自动递增值时发生重复。

只有当auto_increment_increment和auto_increment_offset的默认值都为1时,才会执行和恢复更改。如果它们的值已经从默认值修改过,则群组复制不会更改它们。从MySQL 8.0开始,当群组复制处于单主模式(只有一台服务器写操作)时,系统变量也不会被修改。

21,单主模式下,如何查找主服务器?

通过执行 mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;

即可确认成员的角色。或者执行 mysql> SHOW STATUS LIKE 'group_replication_primary_member'

22,群组最多支持多少个成员?

每个群组最多包含9个成员,推荐使用不超过7个群组成员。

群组复制的容错度 N=2F+1

故障(F)所需服务器数量(N),仅当大多数成员在线时,群组可用。

本文分享自微信公众号 - 3306pai(pai3306)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么要关注索引统计误差

    事情的起因是,我的朋友小明同学有一天突然发现有个SQL的执行计划出问题了。经过一番排查,居然发现是该表的辅助索引统计信息存在严重偏差。

    [3306 Pai ] 社区
  • 重磅:MySQL 8将在RHEL 8中王者归来

    早在10月30号fedora 29 版本中 fedora 就宣布官方yum repos 采用MySQL Server(8.0.13 和5.7.24)

    [3306 Pai ] 社区
  • 天啊撸,mysql_upgrade要消失了!

    MySQL 8.0.16 开始,MySQL 不推荐使用mysql_upgrade。取而代之的是"server upgrade"的升级方式。

    [3306 Pai ] 社区
  • 常用Linux发行版镜像源配置

    最近研究Linux,试了一些Linux发行版,但是大多数发行版的软件源速度都不是很理想。所以我这里干脆做了一个收集,把我用过的一些常用发行版的软件源设置方法做个...

    乐百川
  • 【特斯拉事故反思】自动驾驶是智能汽车的终极目标吗?

    【新智元导读】今天“特斯拉事故”的新闻刷爆了屏,舆论再次聚焦自动驾驶。一方面,宝马、英特尔和Mobileye等行业巨头不愿错过智能驾驶的市场先机,即将合作推出新...

    新智元
  • websocket(三) 进阶!netty框架实现websocket达到高并发

    引言: 在前面两篇文章中,我们对原生websocket进行了了解,且用demo来简单的讲解了其用法。但是在实际项目中,那样的用法是不可取的,理由是tomcat对...

    生活创客
  • Netty的部分案例实现

    用户5927264
  • appium+python自动化44-appium命令行模式

    appium desktop有个客户端版本,每次运行脚本的时候都要去双击启动才能运行,很显然不太方便,影响效率。那么有没什么办法不启动桌面程序就能运行呢,比如c...

    上海-悠悠
  • 从SAP最佳业务实践看企业管理(151)-生产物流-生产线配送物流的作业

    生产线配送物流的作业 一. 关注点及分析工具 所谓高效的供应链管理,以个人的理解---就是对顾客与供方商业流程的三大要素:物流、资金流、信息流的集成管理。供应链...

    SAP最佳业务实践
  • npm 与 package.json 快速入门教程

    npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧!

    张拭心 shixinzhang

扫码关注云+社区

领取腾讯云代金券