## 前期回顾

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


## MGR架构

| 主机名 |业务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|从|

[image:710 size:orig]



## 1. 配置私网

MGR建议组内成员间的通讯使用专用网络,类似RAC的private ip

我们这里重新添加网卡并设置和业务IP不同的网段地址



**RAC1**

```
10.10.10.11
```

**RAC2**

```
10.10.10.12
```


**RAC3**

```
10.10.10.13
```

最后测试是不是可以相互联通

## 2. 配置hosts文件

我们将三台服务器的信息写入hosts文件

请原谅我的主机名是rac~

**三台服务器**

```
11.12.14.29  rac1
11.12.14.30  rac2
11.12.14.39  rac3

10.10.10.11 rac1-priv
10.10.10.12 rac2-priv
10.10.10.13 rac3-priv
```


## 3. 配置存储引擎

MGR需要我们存储数据的存储引擎为innodb,否则会出错

my.cnf文件添加

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

在MySQL 8.0.16之前如果禁用MyISAM时使用mysql_upgrade命令会报错,如果需要可以首先启用MyISAM后再运行


## 4. 配置复制参数

MGR同时也需要我们设置如下参数

my.cnf文件添加

**rac1**

```
server_id=11121429
gtid_mode=ON 
enforce_gtid_consistency=ON 
master_info_repository=TABLE 
relay_log_info_repository=TABLE 
binlog_checksum=NONE 
log_slave_updates=ON 
log_bin=/oradata/datalog/mysql/binlog/mysql-bin.log
binlog_format=ROW
```

**rac2**

```
server_id=11121430
gtid_mode=ON 
enforce_gtid_consistency=ON 
master_info_repository=TABLE 
relay_log_info_repository=TABLE 
binlog_checksum=NONE 
log_slave_updates=ON 
log_bin=/datalog/mysql/binlog/mysql-bin.log
binlog_format=ROW
```


**rac3**

```
server_id=11121439
gtid_mode=ON 
enforce_gtid_consistency=ON 
master_info_repository=TABLE 
relay_log_info_repository=TABLE 
binlog_checksum=NONE 
log_slave_updates=ON 
log_bin=/datalog/mysql/binlog/mysql-bin.log
binlog_format=ROW
```

最后重新数据库


## 5. 安装组复制插件

**三台服务器**

```
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
```

然后通过SHOW PLUGINS;查看是否安装成功



## 6.配置组复制参数


我们需要配置用于组复制的一些参数

**rac1**

```
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="4e551942-aeb6-11e9-a5c8-0050568cef02"
group_replication_start_on_boot=off 
group_replication_local_address= "rac1-priv:33061" 
group_replication_group_seeds= "rac1-priv:33061,rac2-priv:33061,rac3-priv:33061" 
group_replication_bootstrap_group=off
```
**rac2**

```
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="4e551942-aeb6-11e9-a5c8-0050568cef02"
group_replication_start_on_boot=off 
group_replication_local_address= "rac2-priv:33061" 
group_replication_group_seeds= "rac1-priv:33061,rac2-priv:33061,rac3-priv:33061" 
group_replication_bootstrap_group=off
```

**rac3**

```
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="4e551942-aeb6-11e9-a5c8-0050568cef02"
group_replication_start_on_boot=off 
group_replication_local_address= "rac3-priv:33061" 
group_replication_group_seeds= "rac1-priv:33061,rac2-priv:33061,rac3-priv:33061" 
group_replication_bootstrap_group=off
```

[image:711 size:orig]


下面来详细说明参数的意义

- plugin_load_add 代表在数据库启动时自动加载的插件(组复制是通过插件的形式集成的)
- group_replication_group_name 告诉插件加入或者新建的组的名称,必须为一个有效的uuid,我们可以使用SELECT UUID()来生成一个
- group_replication_start_on_boot,代表数据库启动时是否自动启动组复制,这里设为off是因为我们还没有建立组复制,在建立完成后我们应该将其设置为ON
- group_replication_local_address  代表用于组成员间内部的通信的地址和端口对,可以使用IP也可以使用域名,不过要保证可以解析的到,推荐的端口为33061,各服务器间端口可以相同也可以不同,这里需要使用私有地址
- group_replication_group_seeds 用于新成员和组建立连接和同步时使用的,如rac3需要加入组,它既可以连接rac1做同步,也可以连接rac2做同步,可以是子集,一般来说我们这里填写所有的成员信息,这里还是需要用私有地址
- group_replication_bootstrap_group  代表该成员是否引导组,我们设置为off,一般我们手动开启该参数,注意组内只能在一个服务器上开启,在第一次创建组或者关闭重启整个组时需要引导组

## 7. 从主库恢复从库

由于MGR也是通过基于GTID的复制来进行数据同步的,如果主库的二进制信息有被清过,那么这部分的数据是不会被从库应用的,这时我们我们需要通过备份主库的形式在从库中还原到最近的状态

如果主库也是新建不久,或者所有库都是新库,这时所有的日志都在,就不用这个步骤了,

这部分可以参考我前面的文章,这里就写下步骤,我们使用基于GTID的复制

由于MGR不能有除innodb其他引擎,而一些系统表不符合,这里只导出应用的数据库

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

```

shell> mysqldump -S /data/mysql/data/mysql.sock -usystem -p --databases test  --master-data=2  --set-gtid-purged=auto  --triggers --events --routines > /tmp/dumpmaster.sql


shell> scp /tmp/dumpmaster.sql root@11.12.14.30:/tmp

shell> chown mysql:mysql /tmp/dumpmaster.sql

mysql> create database test;
mysql> reset master;
shell> mysql -S /data/mysql/data/mysql.sock -usystem -p  test </tmp/dumpmaster.sql
```


## 8. 参考资料

[https://dev.mysql.com/doc/refman/5.7/en/group-replication-getting-started.html](https://dev.mysql.com/doc/refman/5.7/en/group-replication-getting-started.html)