https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements-and-limitations.html
关于Group Replication System Variables这一节没有讲,主要是变量属于工具类,需要查看的时候去搜一下即可
https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html
18.8.1 Group Replication Requirements
需要使用MGR的实例必须满足如下要求
基础设施
- InnoDB存储引擎
- 主键
- 网络性能
实例配置
- 开启binlog
- log-slave-update=on
- binlog必须是row格式
- GTID=on
- 复制信息必须以table存储 --master-info-repository=TABLE and --relay-log-info-repository=TABLE
- 事务写集 --transaction-write-set-extraction=XXHASH64
- 多线程复制开启
1. slave_parallel_type=LOGICAL_CLOCK
2. slave_preserve_commit_order=1
3. slave_parallel_workers= (0~1024) ## 可以配置使用多线程,也可以不使用多线程
18.8.2 Group Replication Limitations
下面列了一些已知的MGR的限制
注意:由于MGR是在GTID的基础上构建的,所以GTID的限制也同样是MGR的限制 Section 17.1.3.6, “Restrictions on Replication with GTIDs”.
- 复制event的checksums --binlog-checksum=NONE
由于设计的问题,MGR不能使用event的checksums
--binlog-checksum=NONE 必须这样设置
- Gap locks , 建议设置隔离级别为 READ COMMITTED
由于认证阶段无法使用gap lock,所以建议使用隔离级别为READ COMMITTED,READ COMMITTED 不适用gap locks
- SERIALIZABLE , MGR不支持SERIALIZABLE隔离级别
- 并发DDL和DML在同一个对象上的操作,会有问题
举例:
A实例 表t进行DDL
B实例 表t进行dml
会导致冲突无法检测到,会有很高的风险
这种情况一般在multi-primary模式下容易遇到(因为多实例写嘛的原因嘛),所以DDL要特别小心
- 外键级联约束
- 大事务
在5秒钟的世界窗口中如果无法将事务copy到其他成员的话,那么MGR的通信会失败,重传,会有严重影响
建议切分、限制 事务大小
- multi-primary的死锁检测
多主模式下,如果使用SELECT .. FOR UPDATE 会导致死锁
主要是lock无法跨越多服务器
- 复制过滤
MGR中不要使用任何复制的filter