MySQL集群高可用架构---mysql高可用之组复制 (MGR)

单主模式:

准备环境三台机器配置好MySQL

|--------|---------------|----------------------------|
| 主机名 | IP | mysql版本 |
| master | 192.168.1.121 | 8.0.40 Source distribution |
| rep1 | 192.168.1.122 | 8.0.40 Source distribution |
| rep2 | 192.168.1.123 | 8.0.40 Source distribution |

  • 配置好三台机器的域名解析

    vim /etc/hosts

配置主机器master:

首先配置好主的配置文件

复制代码
[mysqld]
log_timestamps=SYSTEM
server_id=121
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.1.121:33061"
group_replication_group_seeds= "master:33061,rep1:33061,rep2:33061"
group_replication_bootstrap_group=off
group_replication_ip_whitelist="192.168.1.0/24,127.0.0.1/8"
group_replication_recovery_use_ssl=on
  • disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #组复制,数据必须存储在 InnoDB 事务存储引擎中
  • transaction_write_set_extraction=XXHASH64 #默认开启,组复制使用此信息在所有组成员上进行冲突检测
  • plugin_load_add='group_replication.so' #将组复制插件添加到服务器启动时加载的插件列表中
  • group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #告诉插件它正在加入或创建的组名为"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa"
  • group_replication_start_on_boot=off #插件在服务器启动时不自动启动操作,使用手动启动插件
  • group_replication_local_address= "192.168.168.128:33061" #与其它主机通信时使用的网络地址和端口
  • group_replication_group_seeds= "s1:33061,s2:33061,s3:33061" #设置组成员的主机名和端口
  • group_replication_bootstrap_group=off #指示插件是否启动该组,在首次引导组时在一个服务器上启用
  • group_replication_ip_whitelist="192.168.168.0/24,127.0.0.1/8" #仅允许白名单内的 IP 加入复制组
  • group_replication_recovery_use_ssl=on #caching_sha2_password插件要求安全传输密码,开启主从之间的连接使用SSL/TLS

重启MySQL

sql 复制代码
/etc/init.d/mysqld restart

登录数据库对主进行一下配置:

在主的数据库中使用sql语句添加复制账号并授予权限,从上面也需要设置一样的账号

创建用户并授予权限

sql 复制代码
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES; 刷新权限
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';

启动MGR集群---------使用当前服务器(192.168.1.121)作为引导服务器启动一个新的群组复制过程或者恢复一个已经存在的群组

sql 复制代码
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION USER='rp',PASSWORD='123';
SET GLOBAL group_replication_bootstrap_group=OFF;

在主上查看组信息

sql 复制代码
SELECT * FROM performance_schema.replication_group_members;

从的机器配置:

配置MySQL的配置文件

sql 复制代码
vim /etc/my.cnf
sql 复制代码
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log_timestamps=SYSTEM
server_id=122
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="192.168.1.122:33061"
group_replication_group_seeds="master:33061,rep1:33061,rep2:33061"
group_replication_ip_whitelist="192.168.1.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_recovery_use_ssl=on

重启数据库:

sql 复制代码
/etc/init.d/mysqld restart

登录数据库对从进行以下配置(192.168.1.122,192.168.1.123):

创建用户并授予权限:

sql 复制代码
SET SQL_LOG_BIN=0;
CREATE USER rp@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE ON *.* TO rp@'%';
GRANT CONNECTION_ADMIN ON *.* TO rp@'%';
GRANT BACKUP_ADMIN ON *.* TO rp@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rp@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE REPLICATION SOURCE TO SOURCE_USER='rp', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';

开启组复制

sql 复制代码
START GROUP_REPLICATION USER='rp', PASSWORD='123';

查看组的信息

sql 复制代码
 SELECT * FROM performance_schema.replication_group_members;

测试:

当master宕机后会在从中寻找新的主

测试三台机器对数据库增删改查的情况

在master中创新一个新的数据库

从库中也相应的同步了新的数据库

在从中测试尝试创建库表----从库只能读取不能创建库表,也不能插入数据

测试当主机宕机后的情况

sql 复制代码
#停掉主机的组复制
stop group_replication;

从的组信息--rep1成为新的主机----这时rep1可以对数据库进行数据的插入:

当讲原来的master开启组复制后的情况----master不能恢复主的身份:


多主模式:

配置三台机器的/etc/my.cnf文件增加两条配置:

sql 复制代码
#关闭单master模式
loose-group_replication_single_primary_mode=off
#多主一致性检查
loose-group_replication_enforce_update_everywhere_checks=ON

在其中一台主机里面执行以下mysql命令

sql 复制代码
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

查看组的成员

在剩下两台机器中配置:

sql 复制代码
start group_replication;

测试:

增删改查情况

master创建库

rep1创建库表

rep2增加表的id字段的主键并增加数据

相关推荐
光泽雨3 分钟前
UNION 和 UNION ALL 作用
数据库·sql
heimeiyingwang16 分钟前
【架构实战】SQL调优实战:从执行计划到索引优化
数据库·sql·架构
恼书:-(空寄20 分钟前
分库分表风险应对手册(生产实战版)
数据库·分库分表
两万五千个小时37 分钟前
Claude Code 源码:Agent 工具 — 多 Agent 的路由与定义机制
人工智能·程序员·架构
XDHCOM44 分钟前
ORA-06521: PL/SQL映射函数错误,权威解析Oracle报错故障修复与远程处理方案
数据库·sql·oracle
仲芒1 小时前
[24年单独笔记] MySQL 常用的 DDL 命令
笔记·mysql·oracle
数厘1 小时前
2.11 约束的使用(主键、外键、非空、唯一、默认值约束)
sql·mysql·数据分析
wgzrmlrm741 小时前
mysql如何配置全文索引停用词_mysql ft_stopword_file设置
jvm·数据库·python
城数派2 小时前
2025年南京市全类别POI(55W+数据)
数据库·arcgis·信息可视化·数据分析·excel
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 小时前
MySQL半同步复制与GTID实战详解
android·mysql·adb