前期回顾

这期的专题我们来介绍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
1.png

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
2.png

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

  • 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/

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