1.MGR 是什么?
它把多个独立的 MySQL 实例,组成了一个能够自动协调、强一致性、高可用的数据库集群。
2.MGR 的两种模式
|------|-------------------------------|-------------|
| 模式 | 特点 | 使用场景 |
| 单主模式 | 同一时间一个主节点可读写,其它为只读备用节点,自动故障转移 | 生产环境首选 |
| 多主模式 | 所有节点均可读写,且自动同步 | 需要多点写入的特定场景 |
[MGR模式]
3.MGR优点
|-----------|--------------|
| 1.强一致性 | 基本无数据丢失风险 |
| 2.高可用与自动化 | 自动故障检测与主节点选举 |
| 3.原生集成 | MySQL 官方插件 |
| 4.拓展灵活 | 动态调整集群规模 |
[MGR优点]
4.MGR使用的约束与要求
|----------|-----------------|
| 1.版本要求 | MySQL 5.7.17+版本 |
| 2.存储引擎 | 必须使用InnoDB |
| 3.网络要求 | 延迟低,稳定 |
| 4.配置要求 | 需启用GTID |
| 5.多主模式限制 | 不支持级联外键 |
[MGR 的约束与要求]
5.实验环境规划
|-------------|-----------------|--------------------|---------|---------|
| 主机名 | IP | 端口 | 系统 | MySQL版本 |
| mysql-node1 | 192.168.189.139 | 3306\33060\33061 | Centos9 | 8.0.44 |
| mysql-node2 | 192.168.189.142 | 3306\33060\33061 | Centos9 | 8.0.44 |
| mysql-node3 | 192.168.189.143 | 3306\33060\33061 | Centos9 | 8.0.44 |
[实验环境准备]
数据库默认端口3306
MySQL X Protoco默认端口33060
MySQL Group Replication组通信端口33061
6.实验前置准备(所有主机都执行)
6.1关闭防火墙
systemctl disable --now firewalld
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
6.2本地DNS域名解析-/etc/hosts
vim /etc/hosts


6.3安装MySQL
Linux-安装MySQL-CSDN博客(选择Centos9 MySQL8.0.44)
dnf install -y https://repo.mysql.com//mysql84-community-release-el9-2.noarch.rpm
dnf config-manager --disable mysql-8.4-lts-community
dnf config-manager --disable mysql-tools-8.4-lts-community
dnf config-manager --enable mysql80-community
dnf config-manager --enable mysql-tools-community
dnf install -y mysql-community-server
systemctl enable --now mysqld
6.4初始化MySQL
过滤初始密码
grep 'password' /var/log/mysqld.log
修改MySQL密码
mysqladmin -uroot -p"临时密码" password "新密码"
登录MySQL
mysql -uroot -p"新密码"
7.创建第一个实例-mysql-node1
7.1配置参数-/etc/my.cnf(MySQL配置文件)
vim /etc/my.cnf
#关闭其他存储引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#启动GTID
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
#配置MGR
plugin_load_add='group_replication.so' #加载MGR插件
group_replication_group_name="71397dad-e092-11f0-bb1f-000c29ba195e" #集群UUID
group_replication_start_on_boot=off #开机不自启
group_replication_local_address= "mysql-node1:33061" #本节点通信地址
group_replication_group_seeds= "mysql-node1:33061,mysql-node2:33061,mysql-node3:33061" #集群成员
group_replication_bootstrap_group=off #不自动引导集群
~

7.2创建复制用户
7.2.0登录MySQL
mysql -uroot -p'Root@123'
7.2.1删除所有binlog日志
RESET MASTER;
7.2.2暂时关闭binlog日志
SET SQL_LOG_BIN=0;
7.2.3创建配置用户-jack
CREATE USER jack@'%' IDENTIFIED WITH mysql_native_password BY 'Jack@123';
7.2.4授予配置用户权限
|--------------------------|--------|
| REPLICATION SLAVE | 主从复制 |
| CONNECTION_ADMIN | 连接管理 |
| BACKUP_ADMIN | 备份管理 |
| GROUP_REPLICATION_STREAM | MGR流控制 |
[权限用途]
GRANT REPLICATION SLAVE,CONNECTION_ADMIN,BACKUP_ADMIN,GROUP_REPLICATION_STREAM ON *.* TO jack@'%';
7.2.5刷新权限
FLUSH PRIVILEGES;
7.2.6开启binlog日志
SET SQL_LOG_BIN=1;
7.3配置用户凭证
当新节点加入集群时,它会通过一个名为'group_replication_recovery'的通道来从现有节点复制数据,以同步到最新状态。这个命令就是为这个恢复通道设置复制源的用户名和密码。(用于新节点加入后同步已有数据)
CHANGE REPLICATION SOURCE TO SOURCE_USER='jack',SOURCE_PASSWORD='Jack@123' FOR CHANNEL 'group_replication_recovery';

7.4启动复制组
7.4.1开启创建新集群命令(只在创建MGR新集群时使用一次)
SET GLOBAL group_replication_bootstrap_group=ON;
7.4.2使用指定用户启动复制组
启动组复制,并且在启动过程中,使用指定的用户(jack)和密码(Jack@123)来连接集群中的其他节点进行认证,以便进行状态恢复和数据同步
START GROUP_REPLICATION USER='jack', PASSWORD='Jack@123';
7.4.3关闭创建新集群命令
SET GLOBAL group_replication_bootstrap_group=OFF;
7.4.4查看集群成员状态-performance_schema库下replication_group_members表
SELECT * FROM performance_schema.replication_group_members;

7.5测试
7.5.1显示binlog事件
SHOW BINLOG EVENTS;

8.添加第二个实例-mysql-node2(只有8.1与8.4与上面不同)
8.1配置参数-/etc/my.cnf(MySQL配置文件)
vim /etc/my.cnf
#关闭其他存储引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#启动GTID
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
#配置MRG
plugin_load_add='group_replication.so'
group_replication_group_name="71397dad-e092-11f0-bb1f-000c29ba195e" #集群UUID
group_replication_start_on_boot=off
group_replication_local_address= "mysql-node2:33061" #本节点通信地址
group_replication_group_seeds= "mysql-node1:33061,mysql-node2:33061,mysql-node3:33061"
group_replication_bootstrap_group=off

8.2创建复制用户
8.2.0登录MySQL
mysql -uroot -p'Root@123'
8.2.1删除所有binlog日志
RESET MASTER;
8.2.2暂时关闭binlog日志
SET SQL_LOG_BIN=0;
8.2.3创建配置用户-jack
CREATE USER jack@'%' IDENTIFIED WITH mysql_native_password BY 'Jack@123';
8.2.4授予配置用户权限
|--------------------------|--------|
| REPLICATION SLAVE | 主从复制 |
| CONNECTION_ADMIN | 连接管理 |
| BACKUP_ADMIN | 备份管理 |
| GROUP_REPLICATION_STREAM | MGR流控制 |
[权限用途]
GRANT REPLICATION SLAVE,CONNECTION_ADMIN,BACKUP_ADMIN,GROUP_REPLICATION_STREAM ON *.* TO jack@'%';
8.2.5刷新权限
FLUSH PRIVILEGES;
8.2.6开启binlog日志
SET SQL_LOG_BIN=1;
8.3配置用户凭证
当新节点加入集群时,它会通过一个名为'group_replication_recovery'的通道来从现有节点复制数据,以同步到最新状态。这个命令就是为这个恢复通道设置复制源的用户名和密码。(用于新节点加入后同步已有数据)
CHANGE REPLICATION SOURCE TO SOURCE_USER='jack',SOURCE_PASSWORD='Jack@123' FOR CHANNEL 'group_replication_recovery';

8.4启动复制组
8.4.1使用指定用户启动复制组
启动组复制,并且在启动过程中,使用指定的用户(jack)和密码(Jack@123)来连接集群中的其他节点进行认证,以便进行状态恢复和数据同步
START GROUP_REPLICATION USER='jack', PASSWORD='Jack@123';
8.4.2查看集群成员状态-performance_schema库下replication_group_members表
SELECT * FROM performance_schema.replication_group_members;
主机状态需要显示online才算成功

9.添加第三个实例-msyql-node3
9.1配置参数-/etc/my.cnf(MySQL配置文件)
vim /etc/my.cnf
#关闭其他存储引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#启动GTID
server-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
#配置MRG
plugin_load_add='group_replication.so'
group_replication_group_name="71397dad-e092-11f0-bb1f-000c29ba195e" #集群UUID
group_replication_start_on_boot=off
group_replication_local_address= "mysql-node3:33061" #本节点通信地址
group_replication_group_seeds= "mysql-node1:33061,mysql-node2:33061,mysql-node3:33061"
group_replication_bootstrap_group=off

9.2创建复制用户
9.2.0登录MySQL
mysql -uroot -p'Root@123'
9.2.1删除所有binlog日志
RESET MASTER;
9.2.2暂时关闭binlog日志
SET SQL_LOG_BIN=0;
9.2.3创建配置用户-jack
CREATE USER jack@'%' IDENTIFIED WITH mysql_native_password BY 'Jack@123';
9.2.4授予配置用户权限
|--------------------------|--------|
| REPLICATION SLAVE | 主从复制 |
| CONNECTION_ADMIN | 连接管理 |
| BACKUP_ADMIN | 备份管理 |
| GROUP_REPLICATION_STREAM | MGR流控制 |
[权限用途]
GRANT REPLICATION SLAVE,CONNECTION_ADMIN,BACKUP_ADMIN,GROUP_REPLICATION_STREAM ON *.* TO jack@'%';
9.2.5刷新权限
FLUSH PRIVILEGES;
9.2.6开启binlog日志
SET SQL_LOG_BIN=1;
9.3配置用户凭证
当新节点加入集群时,它会通过一个名为'group_replication_recovery'的通道来从现有节点复制数据,以同步到最新状态。这个命令就是为这个恢复通道设置复制源的用户名和密码。(用于新节点加入后同步已有数据)
CHANGE REPLICATION SOURCE TO SOURCE_USER='jack',SOURCE_PASSWORD='Jack@123' FOR CHANNEL 'group_replication_recovery';

9.4启动复制组
9.4.1使用指定用户启动复制组
启动组复制,并且在启动过程中,使用指定的用户(jack)和密码(Jack@123)来连接集群中的其他节点进行认证,以便进行状态恢复和数据同步
START GROUP_REPLICATION USER='jack', PASSWORD='Jack@123';
9.4.2查看集群成员状态-performance_schema库下replication_group_members表
SELECT * FROM performance_schema.replication_group_members;
主机状态显示online才算成功

10验证与测试集群
10.1数据同步测试


10.2模拟mysql-node1停机
10.2.1在mysql-node1关闭MySQL服务
systemctl stop mysqld
10.2.2在mysql-node2查看集群成员状态

10.2.3使用mysql-node2创建数据库test3后再将mysql-node1加入集群
10.2.3.1使用mysql-node2创建数据库test3

10.2.3.2将mysql-node1加入集群
START GROUP_REPLICATION USER='jack', PASSWORD='Jack@123';
