① mysql组复制是mysql5.7.16以后的版本才支持的,小于5.7.17版本的请升级
② InnoDB 存储引擎
数据库非系统表的必须是innoDB存储引擎,可以设置
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
② 主键
组要复制的每个表都必须具有定义的主键,或等效的主键,其中等效键是非空唯一键。这些键需要作为表中每一行的唯一标识符,使系统能够通过准确识别每个事务修改了哪些行来确定哪些事务发生冲突。
③ IPv4(mysql8.0好像支持IPv6了)和网络性能要好
④ 隔离级别:官网建议READ COMMITTED级别,不支持SERIALIZABLE隔离级别;
不建议使用级联外键;
①准备工作
主机 | |
192.168.88.128 | master |
192.168.88.130 | slave |
192.168.88131 | slave |
三台主机的mysql都已经安装完毕,安装细节略过。
② 主机192.168.88.128配置
vim /etc/my.cnf
server_id=129 #唯一的服务器标识符
gtid_mode=ON #开启二进制
enforce_gtid_consistency=ON ##开启GTID
master_info_repository=TABLE ## mysql.slave_master_info
relay_log_info_repository=TABLE ## relay日志写入mysql.slave_relay_log_info表中 Group Replication 插件对复制元数据具有一致的可恢复性和事务管理
binlog_checksum=NONE ##二进制日志校验和关闭
log_slave_updates=ON ##备机中的二进制日志也写入
log_bin=binlog ##开启二进制
binlog_format=ROW ##二进制的日志格式
mysql.slave_master_info表 用于保存从库的IO线程连接主库的连接状态、帐号、IP、端口、密码以及IO线程当前读取主库binlog的file和position等信息(被称为IO线程信息日志)
mysql.slave_relay_log_info表 从库的IO线程会把最近的master的二进制日志写入到relay(中继日志)中,sql线程读取relay日志并重放
plugin_load_add='group_replication.so' ##加载群复制的插件
transaction_write_set_extraction=XXHASH64 ##识与事务关联的写入的哈希的算法设置 XXHASH64为以避免不必要的哈希冲突,从而导致认证失败和用户事务回滚
group_replication_group_name="1c4e283e-b727-11ec-b473-00163e350e12" ##组复制的名称
group_replication_start_on_boot=off ##表示mysql启动时,插件不需要自动启动,我们这里都设置OFF,然后在进入mysql后手动启动
group_replication_local_address= "192.168.88.128:10061" #本机的ip地址
group_replication_group_seeds= "192.168.88.128:10061,192.168.88.130:10061,192.168.88.131:10061" ##组里面的ip
group_replication_bootstrap_group=off ##MGR插件是否引导该组,我们这里都设置OFF,然后在进入mysql后手动启动
③ 配置用户凭证
也就是创建复制的用户,MGR是依赖于group_replication_recovery
复制通道进行通讯的。
为了避免创建用户也写入二进制中,所以需要先关闭二进制
##创建用户
SET SQL_LOG_BIN=0;
CREATE USER mgr_user@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='mgr_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
④ 启动组
首次启动组的过程称为引导,使用group_replication_bootstrap_group来引导
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
引导只能由单个服务器完成,即启动组的服务器并且只执行一次。这就是为什么group_replication_bootstrap_group选项的值没有存储在实例的选项文件中的原因。如果它保存在选项文件中,则在重新启动服务器时会自动引导第二个具有相同名称的组。这将导致两个不同的组具有相同的名称
可以检查该组现在是否已创建并且其中有一个成员
select * from performance_schema.replication_group_members;
⑤ 把slave主机添加到群组中
A) 192.168.88.130 配置
### MGR配置
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id = 130
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 = binlog
binlog_format= ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="1c4e283e-b727-11ec-b473-00163e350e12"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.88.130:33061"
group_replication_group_seeds= "192.168.88.130:33061,192.168.88.131:33061,192.168.88.128:33061"
group_replication_bootstrap_group=off
只用更新下面两个参数
server_id = 130
group_replication_local_address= "192.168.88.130:33061"
B) 进入mysql执行下面的
SET SQL_LOG_BIN=0;
CREATE USER mgr_user@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='mgr_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
C) 启动 Group Replication 和 s2 启动加入组的过程。
这里不需要执行SET GLOBAL group_replication_bootstrap_group=ON;来引导组,因为组已经创建,直接假如组即可
START GROUP_REPLICATION;
D) 在master主机查看组成员
select * from performance_schema.replication_group_members;
F) 查看组成员
select * from performance_schema.replication_group_members;
里面的的状态 member_state 如果都是ONLINE,则表示都是在线的,但是上面出现了recovering则表示我们的这个组员有问题,需要看mysql的日志。
出现了 Slave I/O for channel 'group_replication_recovery': error connecting to master 'test@master-129:3306' - retry-time: 60 retries: 1, Error_code: 1045
这种错误表示我们的账户没有配置成功,则需要重新执行下面的账户和change master
SET SQL_LOG_BIN=0;
CREATE USER mgr_user@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='mgr_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
然后在start group_replication操作。
如果上面还是报Slave I/O for channel 'group_replication_recovery'错误,则需要在slave机上面配置hosts;
vim /etc/hosts
因为mysql上面的请求是用host去请求的,如果没有配置hosts就解析不了ip,上面的ip是master主机和master主机的hostname
G) 192.168.88.131 配置跟130的一样配置 然后状态都是ONLINE即可