准备三台服务器
| 编号 | IP | 主机名 | 角色 |
| 1 | 192.168.88.101 | node1 | master |
| 2 | 192.168.88.102 | node2 | slave01 |
| 3 | 192.168.88.103 | node3 | slave02 |
安装MySQL8.0.40数据库
第一步:关闭防火墙和SELINUX、设置IP与主机映射、时间同步,安装必备工具vim、wget、rsync
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
vim /etc/hosts
尾部追加如下内容
192.168.88.101 node1 node1.xiaoteng.cn
192.168.88.102 node2 node2.xiaoteng.cn
192.168.88.103 node3 node3.xiaoteng.cn
dnf install vim wget rsync -y
第二步:使用MX连接node1、node2、node3
node1(master)
node2(slave01)
node3(slave02)
第三步:
把配对的master.sh与mysql软件包上传master节点
source master.sh
把配对的slave.sh与mysql软件包上传slave01/slave02节点
source slave.sh
第四步:
master节点:
systemctl stop mysqld
rm -rf /export/server/mysql/data/auto.cnf
rsync -av /export/server/mysql/data node2:/export/server/mysql/
rsync -av /export/server/mysql/data node3:/export/server/mysql/
6、MGR配置实战
第一步:node1主服务器配置
vim /etc/my.cnf
[mysqld]
basedir=/export/server/mysql
datadir=/export/server/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/export/server/mysql/master.err
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
# Group Replication
server_id = 101 # 服务 ID
gtid_mode = ON # 全局事务
enforce_gtid_consistency = ON # 强制 GTID 的一致性
master_info_repository = TABLE # 将 master.info 元数据保存在系统表中
relay_log_info_repository = TABLE # 将 relay.info 元数据保存在系统表中
binlog_checksum = NONE # 禁用二进制日志事件校验
log_slave_updates = ON # 级联复制
log_bin = binlog # 开启二进制日志记录
binlog_format = ROW # 以行的格式记录
transaction_write_set_extraction = XXHASH64 # 使用哈希算法将其编码为散列
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' # 加入的组名
loose-group_replication_start_on_boot = off # 不自动启用组复制集群
loose-group_replication_local_address = '192.168.88.101:33061' # 以本机端口 33061 接受来自组中成员的传入连接
loose-group_replication_group_seeds = '192.168.88.101:33061, 192.168.88.102:33062, 192.168.88.103:33063' # 组中成员访问表
loose-group_replication_bootstrap_group = off # 不启用引导组
注意:group_replication_group_name 组名称主要是通过 uuidgen 命令生成
重启MySQL服务
touch /export/server/mysql/master.err
chown -R mysql.mysql /export/server/mysql
systemctl restart mysqld
创建复制账号
mysql -uroot -p
Enter password: 123456
mysql> set SQL_LOG_BIN=0; # 停掉日志记录
mysql> create user repl@'%' identified with 'mysql_native_password' by '123';
mysql> grant replication slave,replication client on *.* to repl@'%';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; # 开启日志记录
mysql> change master to master_user='repl',master_password='123' for channel
'group_replication_recovery'; # 构建 group replication 集群
安装 group replication 插件
安装插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
查看 group replication 组件
mysql> show plugins;

启动服务器 node1 上 MySQL 的 group replication
mysql> set global group_replication_bootstrap_group=ON;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;
mysql> select * from performance_schema.replication_group_members; # 查看状态

注意:在集群没有搭建完成之前,不要往任何数据库中插入数据,否则会导致三端数据不统一,集群容易出现故障!
第二步:node2从服务器配置
修改/etc/my.cnf 配置文件,方法和之前相同vim /etc/my.cnf
vim /etc/my.cnf
[mysqld]
basedir=/export/server/mysql
datadir=/export/server/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/export/server/mysql/slave.err
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
# Group Replication
server_id = 102 # 注意服务 ID 不一样
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
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.88.102:33062'
loose-group_replication_group_seeds = '192.168.88.101:33061,192.168.88.102:33062,192.168.88.103:33063'
loose-group_replication_bootstrap_group = off
重启MySQL
touch /export/server/mysql/slave.err
chown -R mysql.mysql /export/server/mysql
systemctl restart mysqld
安装 group replication 插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
把实例添加到之前的复制组
mysql -u root -p
Enter password: 123456
mysql> set SQL_LOG_BIN=0; # 停掉日志记录
mysql> create user repl@'%' identified with 'mysql_native_password' by '123';
mysql> grant replication slave,replication client on *.* to repl@'%';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; # 开启日志记录
mysql> reset master;
mysql> -- 设置想要加入组信息
mysql> change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
mysql> start group_replication;
返回node1主服务器,查看复制组状态
mysql> select * from performance_schema.replication_group_members;
注意:在集群没有搭建完成之前,不要往任何数据库中插入数据,否则会导致三端数据不统一,集群容易出现故障!
第三步:node3从服务器配置
修改/etc/my.cnf 配置文件,方法和之前相同vim /etc/my.cnf
vim /etc/my.cnf
[mysqld]
basedir=/export/server/mysql
datadir=/export/server/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/export/server/mysql/slave.err
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
# Group Replication
server_id = 103 #注意服务 ID 不一样
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
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.88.103:33063'
loose-group_replication_group_seeds = '192.168.88.101:33061,192.168.88.102:33062,192.168.88.103:33063'
loose-group_replication_bootstrap_group = off
进入mysql,安装 group replication 插件
touch /export/server/mysql/slave.err
chown -R mysql.mysql /export/server/mysql/slave.err
systemctl start mysqld
mysql -uroot -p
Enter password: 123456
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
把实例添加到之前的复制组
mysql> set SQL_LOG_BIN=0; #停掉日志记录
mysql> create user repl@'%' identified with 'mysql_native_password' by '123';
mysql> grant replication slave,replication client on *.* to repl@'%';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; # 开启日志记录
mysql> reset master;
mysql> -- 设置想要加入组信息
mysql> change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
mysql> start group_replication;
在node1上查看复制组状态
mysql> select * from performance_schema.replication_group_members;
如果以上状态为ONLINE,则搭建完毕。如果以上状态为RECORYING,则代表两端数据无法同步到一致状态。解决方案:参考常见问题中问题2进行解决。
建议:当MGR高可用集群搭建完毕后,需要给每一个节点创建快照,因为下面的操作,如果数据不统一等等问题,可能会导致集群出现故障。
第四步:测试MySQL
回到master,登录mysql,执行如下指令:
mysql> create database test;
mysql> use test;
mysql> create table t1 (id int primary key,name varchar(20)); #注意创建主键
mysql> insert into t1 values (1,'jack');
mysql> select * from t1;
mysql> show binlog events;
返回node2或node3,查看数据库发现 test 库和 t1 表已经完成同步操作
mysql> show databases;
第五步:测试高可用效果
查看哪个节点是主节点,然后使用systemctl stop mysqld终止主节点,在查看集群变化
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+-------- --------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_ COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+-------- --------------------+
| group_replication_applier | 1b6e2247-2ae2-11f0-b1be-000c2961ec25 | node3.itcast.cn | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
| group_replication_applier | 7792fd47-2998-11f0-81a4-000c29d9e0c0 | node1.itcast.cn | 3306 | ONLINE | PRIMARY | 8.0.40 | XCom |
| group_replication_applier | fb783c29-299a-11f0-b046-000c296d8526 | node2.itcast.cn | 3306 | ONLINE | SECONDARY | 8.0.40 | XCom |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+-------- --------------------+
3 rows in set (0.01 sec)
# 终止master主节点
systemctl stop mysqld
# 进入node2、node3查看集群变化
select * from performance_schema.replication_group_members;
以上单 master 节点的集群就搭建完毕!