## 前期回顾

这期的专题我们来介绍MySQL组复制相关的内容

| 主机名 |业务IP|私有IP  |复制用户|角色
| --- | --- | --- |  --- | ---|
| rac1 | 11.12.14.29| 10.10.10.11 |rpl|主|
| rac2| 11.12.14.30| 10.10.10.12|rpl|从|
| rac3 | 11.12.14.39 | 10.10.10.13|rpl|从|


前面我们说了如何部署MGR的单主和多主模式

这节总体来说下部署MGR有哪些要求和限制


## 1. 部署MGR的需求

### 1. 基础架构

**innodb存储引擎**

数据必须存储在innodb存储引擎内

我们通过设置如下参数来禁用其他存储引擎

```
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
```

**主键**

每张表都必须定义一个主键或者等价的非空的唯一键

**IPv4网络**

服务器必须支持IPv4网络

**网络性能**

MGR组中的各个服务器必须相互联通且网络性能要求较高



### 1.2 数据库配置要求

**binlog日志**

必须开启二进制日志文件功能

```

--log-bin[=log_file_name]
```

**Slave Updates Logged**

组内中的服务器必须可以记录所有事务的日志

--log-slave-updates

**二进制日志格式**

必须设定二进制日志格式为row

```
--binlog-format=row.
```
 
 **Binary Log Checksums Off**
 
 设定 --binlog-checksum=NONE.
 
 **开启GTID**
 
 必须开启GTID功能,用来检测MGR中事务的执行情况
 
 
 **Replication Information Repositories**

必须设定如下参数记录主从库的元数据信息

```

--master-info-repository=TABLE

--relay-log-info-repository=TABLE
```

**Transaction Write Set Extraction**

设置如下参数使在记录日志的时候同时记录写集,用来检测冲突

```
 --transaction-write-set-extraction=XXHASH64
```


**Lower Case Table Names**

设置--lower-case-table-names 参数为同一个值

innodb中设置为1 注意不同平台的该值可能不一致


**Multithreaded Appliers**

我们可以设定一些参数使同步进程并行起来

```
 --slave-parallel-workers=N
 --slave-preserve-commit-order=1
 --slave-parallel-type=LOGICAL_CLOCK
```


## 2. MGR的一些限制


**GTID的一些限制**

由于MGR依赖于GTID,所以首先有GTID的一些现在

[http://www.zhaibibei.cn/mysql/replication/tutorial10/](http://www.zhaibibei.cn/mysql/replication/tutorial10/)


**Gap Locks**

MGR推荐使用 READ COMMITTED 隔离级别来避免使用Gap Locks


**Table Locks and Named Locks**

MGR的验证过程不考虑table locks 和named locks
**Replication Event Checksums**

MGR无法使用复制事件检测

**SERIALIZABLE隔离级别**

MGR不支持串行化隔离级别

**DDL和DML**

多主模式下,MGR不支持同时不同服务器上的同一个对象的的DDL和DML

**级联约束的外键索引**

多主模式下,MGR不支持级联约束的外键索引


**MySQL Enterprise Audit and MySQL Enterprise Firewall**

MySQL 5.7.21以前,MySQL Enterprise Audit and MySQL Enterprise Firewall使用的是MyISAM表,所以不支持


**多主模式下死锁**

多主模式下,SELECT .. FOR UPDATE语句会引发死锁

**Replication Filters**

MGR不支持复制过滤

**组大小**

MGR最多可以有9个成员 


**事务大小的限制**

一个成员的独立事务如果过大可能会导致无法在5s内传输到各个节点,这时可能会提出该成员

如果我们不设置单独参数限定大小的话,默认为slave_max_allowed_packet参数的大小,默认是1G

我们可以使用如下方法限定MGR中事务的大小

- 如果可以减少你事务的大小
- 设定group_replication_transaction_size_limit参数,5.7中该参数为0,8.0为143M
- group_replication_compression_threshold 设定消息大小进行压缩的大小,默认为1M

## 3. 参考资料

[https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements-and-limitations.html](https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements-and-limitations.html)