使用MySQL组复制的限制和局限性
本节列出和解释了组复制相关的要求和限制。
1.组复制的要求
要使用组复制,每个MySQL节点必须满足以下条件:
1.1 基本要求
- InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中。事务以乐观形式执行,然后在提交前会检测冲突问题。如果有冲突,为了维护组中一致性,有些事务必须回滚。这意味着需要事务型的存储引擎。此外,InnoDB 存储引擎提供了一些额外的功能,它们结合组复制时能更好地管理和处理冲突。
- Primary Keys:每张需要被组复制的表都必须显式定义一个主键。主键在判断事务是否冲突扮演极其重要的角色:通过主键来准确识别每个事务中修改了表中的哪些行。(实际上是将主机hash成写集,然后由certifier来并发事务之间的检测冲突性)
- 使用IPv4 地址:MySQL组复制使用的组通信引擎组件只支持 IPv4。因此,必须使用IPv4的网络。
- 良好的网络性能:组复制设计的初衷是部署在集群环境中,集群中的节点相互之间都非常近,因此除了网络延迟,网络带宽也会影响组复制。
1.2 配置上的要求
组中的每个成员都必须配置以下选项:
- 必须开启二进制日志:设置
--log-bin[=log_file_name]。MySQL组复制会复制二进制日志的内容,因此必须开启二进制日志。 - Slave Updates Logged:设置
--log-slave-updates。节点需要记录applier已应用的日志。组中的每个节点都需要记录它们所接收到并应用的所有事务,这是必须的,因为恢复过程是依赖于组中参与者的二进制日志来进行的。因此,组中每个成员都必须保留每个事务的副本,即使某事务不是在该节点上开始的。 - Row Format的二进制日志:设置
--binlog-format=row。组复制依赖于基于行格式的二进制日志,以便在组中传播所发生的更改能保持一致性。而且,在探测组中不同节点间发生的并发事务是否冲突时,需要从行格式的日志中提取一些内容来做比较。 - 开启GTID复制:设置
--gtid-mode=ON。组复制使用GTID(全局事务ID)来精确跟踪每个节点上已经提交了哪些事务。也因此可以推断出某节点上要执行的事务是否和已执行的事务(每个节点上都有副本)冲突。换句话说,GTID是整个组复制判断事务是否冲突的基础。 - Replication Information Repositories:设置
--master-info-repository=TABLE和--relay-log-info-repository=TABLE。applier需要将 master 和 relay log 的元数据信息写入到系统表 mysql.slave_master_info 和 mysql.slave_relay_log_info 中。这保证了组复制插件具有一致性恢复的能力和复制的元数据事务管理能力。 - Transaction Write Set Extraction:设置
--transaction-write-setextraction=XXHASH64,以便将行写入到二进制日志中时,节点也收集写集。写集基于每行的主键,是唯一标识被更改行的标签的简化形式,该标签后续会用于探测事务冲突性。 - 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.组复制的限制(局限性)
下面是使用组复制已知的限制:
- Replication Event Checksums:由于对复制事件校验的设计缺陷,目前组复制不能使用它们。因此,需要设置
--binlog-checksum=NONE。 Gap Locks:在验证阶段中(certification process),不会考虑 Gap Locks,因此在 InnoDB 的外部无法获取任何关于Gap 锁的信息。
注意:
除非你的应用程序或业务需求依赖于REPEATABLE READ(MySQL默认该隔离级别),否则建议在组复制中使用READ COMMITTED隔离级别。在READ COMMITTED隔离级别中,InnoDB基本上不会使用Gap Locks,这将使得InnoDB自带的冲突探测能和组复制的冲突探测相互对齐从而保持一致。
- Table Locks and Named Locks:验证阶段(certification process)中不考虑表锁和命名锁(见get_lock())。
- 不支持 SERIALIZABLE 隔离级别:在多主模型下,默认不支持该隔离级别。如果在多主模型下设置了该隔离级别,将拒绝提交事务。
- 不支持并发的 DDL 和 DML 操作:不支持在多主模型下不同节点上同时执行DDL和DML修改同一对象。在某节点上对某对象执行DDL语句时,如果在其他节点同时执行DML修改该对象,将有一定风险探测到冲突。(译注:是 DDL+DML 的并发,DDL+DDL 的并发也不允许。这是因为MySQL中没有DDL事务,不能保证DDL的原子性,当DDL和DML同时操作某一个对象,可能DDL修改后,DML将因为对象结构的改变而无法执行,继而回滚)
- 不支持级联的外键约束:多主模型的组(所有节点都配置了
group_replication_single_primary_mode=OFF)不支持多级外键依赖,特别是表上定义了级联的外键约束(CASCADING foreign key constraints)。这是因为多主模型下执行外键约束的级联操作可能会出现未检测到的冲突,从而导致组内成员间数据不一致。因此,我们推荐在使用多主模型时,在每个节点上都设置group_replication_enforce_update_everywhere_checks=ON以避免出现未检测到的冲突。在单主模型下没有这种问题,因为没有并发写操作,从而不可能会出现未被探测到的冲突。 - 大事务可能会错误:如果一个事务非常大,导致GTID的内容非常多,以至于无法在 5 秒内通过网络传输完成,这时组成员间的通信将失败。要避免该问题,可以尽可能地限制事务的大小。例如,将
LOAD DATA INFILE的文件切割为多个小块。 多主模型可能出现死锁:在多主模型下,
SELECT ... FOR UPDATE语句可能会导致死锁。这是因为组内成员之间不会共享锁资源(译注:share nothing),因此这样的语句可能达不到预期的结果。
使用MySQL组复制的限制和局限性的更多相关文章
- MySQL中间件之ProxySQL(15):ProxySQL代理MySQL组复制
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL+组复制前言 在以前的ProxySQL版本中,要支 ...
- Mysql组复制之单主模式(一)
环境 系统:CentOS release 6.9 (Final) Mysql:5.7 机器: S1 10.0.0.7 lemon S2 10.0.0.8 lemon2 S3 10.0.0.9 lemo ...
- mysql组复制集群简介
mysql组复制集群拓扑: 环境: centos6.5 mysql5.7.19 一.组复制搭建: 配置hosts文件 再三台服务器上分别启动一个mysql实例,共三个. 参考配置文件如下: serve ...
- 【MySQL 组复制】1.组复制技术简介
组复制有两种模式 单主模式(single-primary/single-master)下自动选举出一个主节点,从而只允许在同一时刻只有该主节点可以更新数据. 对于MySQL的高级使用人员,可以通过复制 ...
- mysql组复制安装
参考文档 https://blog.csdn.net/li123128/article/details/80744568 https://www.cnblogs.com/ctulzq/p/863109 ...
- 监控MySQL组复制
使用 Perfomance Schema 中的表来监控组复制,假定你的MySQL编译时已经启动了 Performance Schema 表.组复制将添加如下两张 P_S 表: performance_ ...
- MySQL组复制MGR(一)-- 技术概述
(一)复制技术的发展 MySQL的复制技术主要经历了异步主从复制,半同步复制,组复制(Group Replication)3个阶段. (1)传统的异步主从复制 传统的MySQL提供了一种简单的主从复制 ...
- MySQL组复制MGR(二)-- 组复制搭建
(一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...
- MySQL组复制MGR(四)-- 单主模式与多主模式
(一)概述 组复制可以运行在单主模式下,也可以运行在多主模式下,默认为单主模式.组的不同成员不能部署在不同模式下,要切换模式,需要使用不同配置重新启动组而不是单个server. 相关参数如下: # 该 ...
随机推荐
- 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch
本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...
- python 中爬虫 content和text的区别
一直在想requests的content和text属性的区别,从print 结果来看是没有任何区别 import requests headers = { "User-Agent" ...
- MySql在Mac上的安装配置
一.下载安装 官网下载社区版dmg安装文件: https://dev.mysql.com/downloads/mysql/ 1.执行安装文件,按步骤完成安装. 2.安装完成后终端输入: mysql - ...
- python 变量,if,while,运算符
变量由变量名 赋值 值 a = 1 ###### 必须是一个等于号 一个等于号是赋值 变量的命名规则: 1.数字,字母,下划线组成 2.数字不能在前面 3.区分大小写 4.禁止使用python关键字 ...
- 03 of learning python
01 input输入的是str类型 如果输入的是数字的话,要记得强制转换一下! 02 isdigit() 这个方法是用来检测字符串是否全部由数字组成 str.isdigit() 如果字符串只包含数字则 ...
- shiro认证流程
创建测试工程 加入shiro-core的jar包及其依赖包 与其它java开源框架类似,将shiro的jar包加入项目就可以使用shiro提供的功能了.shiro-core是核心包必须选用,还提供了与 ...
- Hadoop Partition函数应用(归档)
一.实例描述 在这个实例里我们使用简单的数据集,里面包含多条数据,每条数据由姓名.年龄.性别和成绩组成.实例要求是按照如下规则归档用户. 1.找出年龄小于20岁中男生和女生的最大分数 2.找出20岁到 ...
- QQ的成功,远没有你想象的那么顺利和轻松
本文来自公众号“傅老师”(ID:fustory)的原创分享,感谢作者. 1.引言 如果QQ是一个人,看似风光,其实从出生到成长,过程饱经错荡,堪算坎坷.它的人生历程确实也够励志的了. 学习交流: ...
- LSTM和GRU
LSTM和GRU LSTM 忽略偏置: \[\begin{align} i_t&=\sigma(x_t\cdot W_i+h_{t-1}\cdot U_i)\\ f_t&=\sigma ...
- scws简单中文分词
demo如下: /** * 中文分词 * @param $keyword * @param $getTop * @param $limit * @return array */ function sp ...