本节列出和解释了组复制相关的要求和限制。

1.组复制的要求

要使用组复制,每个MySQL节点必须满足以下条件:

1.1 基本要求

  1. InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中。事务以乐观形式执行,然后在提交前会检测冲突问题。如果有冲突,为了维护组中一致性,有些事务必须回滚。这意味着需要事务型的存储引擎。此外,InnoDB 存储引擎提供了一些额外的功能,它们结合组复制时能更好地管理和处理冲突。
  2. Primary Keys:每张需要被组复制的表都必须显式定义一个主键。主键在判断事务是否冲突扮演极其重要的角色:通过主键来准确识别每个事务中修改了表中的哪些行。(实际上是将主机hash成写集,然后由certifier来并发事务之间的检测冲突性)
  3. 使用IPv4 地址:MySQL组复制使用的组通信引擎组件只支持 IPv4。因此,必须使用IPv4的网络。
  4. 良好的网络性能:组复制设计的初衷是部署在集群环境中,集群中的节点相互之间都非常近,因此除了网络延迟,网络带宽也会影响组复制。

1.2 配置上的要求

组中的每个成员都必须配置以下选项:

  1. 必须开启二进制日志:设置--log-bin[=log_file_name]。MySQL组复制会复制二进制日志的内容,因此必须开启二进制日志。
  2. Slave Updates Logged:设置--log-slave-updates。节点需要记录applier已应用的日志。组中的每个节点都需要记录它们所接收到并应用的所有事务,这是必须的,因为恢复过程是依赖于组中参与者的二进制日志来进行的。因此,组中每个成员都必须保留每个事务的副本,即使某事务不是在该节点上开始的。
  3. Row Format的二进制日志:设置--binlog-format=row。组复制依赖于基于行格式的二进制日志,以便在组中传播所发生的更改能保持一致性。而且,在探测组中不同节点间发生的并发事务是否冲突时,需要从行格式的日志中提取一些内容来做比较。
  4. 开启GTID复制:设置--gtid-mode=ON。组复制使用GTID(全局事务ID)来精确跟踪每个节点上已经提交了哪些事务。也因此可以推断出某节点上要执行的事务是否和已执行的事务(每个节点上都有副本)冲突。换句话说,GTID是整个组复制判断事务是否冲突的基础。
  5. Replication Information Repositories:设置--master-info-repository=TABLE--relay-log-info-repository=TABLE。applier需要将 master 和 relay log 的元数据信息写入到系统表 mysql.slave_master_infomysql.slave_relay_log_info 中。这保证了组复制插件具有一致性恢复的能力和复制的元数据事务管理能力。
  6. Transaction Write Set Extraction:设置--transaction-write-setextraction=XXHASH64,以便将行写入到二进制日志中时,节点也收集写集。写集基于每行的主键,是唯一标识被更改行的标签的简化形式,该标签后续会用于探测事务冲突性。
  7. Multithreaded Appliers:(某些旧版本没有该要求)可以将组复制成员配置为多线程appliers,使得可以并行应用事务。需要设置--slave-parallel-workers=N(N是applier线程数量)、--slavepreserve-commit-order=1以及--slave-parallel-type=LOGICAL_CLOCK--slaveparallel-workers=N表示启用多applier线程,组复制依赖于建立在所有参与节点都以相同顺序接收和应用、提交事务的一致性机制,因此还必须设置--slave-preserve-commit-order=1以保证并行事务的最终提交是和原事务所在顺序位置一致的。最后,为了决定哪些事务可以并行执行,relay log 必须包含由--slave-parallel-ype=LOGICAL_CLOCK生成的事务父信息(transaction parent information)。当尝试加入一个只设置了--slave-parallel-workers大于0,却没有设置其他两项的新成员,将会报错并阻止它的加入。

2.组复制的限制(局限性)

下面是使用组复制已知的限制:

  1. Replication Event Checksums:由于对复制事件校验的设计缺陷,目前组复制不能使用它们。因此,需要设置--binlog-checksum=NONE
  2. Gap Locks:在验证阶段中(certification process),不会考虑 Gap Locks,因此在 InnoDB 的外部无法获取任何关于Gap 锁的信息。

    注意:

    除非你的应用程序或业务需求依赖于REPEATABLE READ(MySQL默认该隔离级别),否则建议在组复制中使用READ COMMITTED隔离级别。在READ COMMITTED隔离级别中,InnoDB基本上不会使用Gap Locks,这将使得InnoDB自带的冲突探测能和组复制的冲突探测相互对齐从而保持一致。

  3. Table Locks and Named Locks:验证阶段(certification process)中不考虑表锁和命名锁(见get_lock())。
  4. 不支持 SERIALIZABLE 隔离级别:在多主模型下,默认不支持该隔离级别。如果在多主模型下设置了该隔离级别,将拒绝提交事务。
  5. 不支持并发的 DDL 和 DML 操作:不支持在多主模型下不同节点上同时执行DDL和DML修改同一对象。在某节点上对某对象执行DDL语句时,如果在其他节点同时执行DML修改该对象,将有一定风险探测到冲突。(译注:是 DDL+DML 的并发,DDL+DDL 的并发也不允许。这是因为MySQL中没有DDL事务,不能保证DDL的原子性,当DDL和DML同时操作某一个对象,可能DDL修改后,DML将因为对象结构的改变而无法执行,继而回滚)
  6. 不支持级联的外键约束:多主模型的组(所有节点都配置了group_replication_single_primary_mode=OFF)不支持多级外键依赖,特别是表上定义了级联的外键约束(CASCADING foreign key constraints)。这是因为多主模型下执行外键约束的级联操作可能会出现未检测到的冲突,从而导致组内成员间数据不一致。因此,我们推荐在使用多主模型时,在每个节点上都设置group_replication_enforce_update_everywhere_checks=ON以避免出现未检测到的冲突。在单主模型下没有这种问题,因为没有并发写操作,从而不可能会出现未被探测到的冲突。
  7. 大事务可能会错误:如果一个事务非常大,导致GTID的内容非常多,以至于无法在 5 秒内通过网络传输完成,这时组成员间的通信将失败。要避免该问题,可以尽可能地限制事务的大小。例如,将LOAD DATA INFILE的文件切割为多个小块。
  8. 多主模型可能出现死锁:在多主模型下,SELECT ... FOR UPDATE语句可能会导致死锁。这是因为组内成员之间不会共享锁资源(译注:share nothing),因此这样的语句可能达不到预期的结果。

使用MySQL组复制的限制和局限性相关推荐

  1. mysql 组复制 不一致_使用MySQL组复制的限制和局限性

    本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...

  2. MySQL内部开发人员如何看待MySQL组复制?

    MySQL因为高性能.可扩展性和可用性被广泛应用于Web应用程序,成为支持高流量社交媒体.电商应用程序以及快速成长企业的IT平台基础.在MySQL 5.7.17版本中,MySQL Group Repl ...

  3. Mysql组复制故障恢复测试

    在前面的两篇文章中,介绍了mysql组复制的特点及配置过程,本文演示mysql单组复制下的模拟故障测试. 一.组复制所有成员服务器宕机重启后的恢复 连接所有的mysql实例查询当前的组复制成员情况,状 ...

  4. Mysql组复制(MGR)——技术细节

    本文提供mysql组复制相关的更多技术细节. 一. 组复制插件架构 Mysql组复制是一个mysql插件,且其构建于已有mysql复制架构之上,其利用了类似二进制日志,基于行的日志及全局事务标识符等的 ...

  5. Mysql组复制(MGR)——常问的问题

    本文提供常被问到问题的答案. 1.复制组中最多能有多少个mysql服务器? 复制组最多包含9个mysql服务器.尝试向已有9个服务器的组添加另外的服务器将被拒绝. 2.组内服务器间如何连接? 组内服务 ...

  6. Mysql组复制(MGR)——前提及限制

    本文将对组复制的前提条件和限制进行列举和解释. 一.组复制前提 想用组复制的服务器实例必须满足如下前提条件: 1.基础架构 1)InnoDB存储引擎.数据必须存储于InnoDB事务存储引擎.事务被乐观 ...

  7. mysql组复制(MGR)——部署

    mysql组复制作为插件提供给mysql服务器,组内的每个服务器都要求配置和安装该插件.本文提供创建一个至少3个服务器的复制组所需的详细步骤. 一.部署单主模式的组复制 组内的每个服务器实例能运行在独 ...

  8. mysql组复制(MGR)——背景

    本文提供mysql组复制相关的背景信息. 创建容错系统的最常用方式是采用组件冗余方式,换句话说,就是组件能被移除且系统应该继续如期操作.这产生了一系列将系统复杂度上升到不同等级的挑战.特别是,复制数据 ...

  9. MySQL组复制学习笔记(基于MySQL 8+) -- 使用篇

    3.1. 启动/停止 可以通过start/stop group_replication来启动停止组复制进程. mysql> start group_replication; /* 启动MySQL ...

最新文章

  1. (收藏)Wp7开发中文网站
  2. java如何实现redis分片存储_面试官:你说一下Redis吧,怎么实现高可用,还有持久化怎么做的?...
  3. UNITY相关的一些新功能,新想法
  4. AXI4总线协议的发展历史
  5. Dart中的mixins
  6. python点击网页按钮 没有id_button没有id,没有onclick事件。点击却有提交的功能,如何实现的?...
  7. linux中匿名用户怎么登陆_Linux网络配置 | FTP 实战-匿名用户登录
  8. 妈蛋:kinMaxShow旋转木马异常,WebUploader图片上传坑爹,图像被压缩
  9. 【汇编优化】之X86架构优化公用头讲解
  10. Ubuntu——运维的学习笔记
  11. 安兔兔html5测试35000,安兔兔评测 8.4.3 安卓版
  12. 2019迅雷校园招聘后端工程师面试总结
  13. Windows 下编译 EXE 文件时把一个外部 txt 文件编译到 EXE 里面
  14. python basename()函数和dirname()函数
  15. 你真的了解单点登录(SSO)吗? 单点登录实现方式
  16. 577. 员工奖金(简单)
  17. linux.x64_11gR2_database.zip下载
  18. matplotlib画图之设置横轴坐标上下限的两种方法
  19. System.Data.Odbc.OdbcException: ERROR [IM001] [Microsoft][ODBC 驱动程序管理器] 驱动程序不支持此功能
  20. 怎么删除桌面上多余的ie浏览器图标?

热门文章

  1. 笨办法学C 练习22:栈、作用域和全局
  2. iPhone5或明年下半年发布 配备iOS6和A6芯片
  3. leetcode310. Minimum Height Trees
  4. python 字符串部分总结
  5. 如何实现报表设计中的高精度报表套打?
  6. ThroughRain第一次冲刺(每天更新)
  7. 部署 instance 到 VXLAN - 每天5分钟玩转 OpenStack(112)
  8. 深度插值与透视纹理映射插值
  9. lamp下mysql安全加固
  10. 利用Trigger完成WPF 的动画-渐显