前言:

         需要清楚知道:MySQL 复制组能够以一种自动优先选择的单主模式运行,在某个时间只有一个服务器接受更新 。但是对于更高优先级的用户,组能够以多主模式部署,所有的服务器都能够接受更新,即使它们是同时发生的。组复制中存在着一种内建的组成员关系服务用来保持组的视图一致,并且在任意时间对于组中的所有的服务器都可用。MySQL 服务器能够退出或者加入组中,而且视图也会相应的更新。有时服务器可能会意外的退出组 (故障),在这种情况下失败检测机制检测这种情况并且告知复制组视图发生了变化,这所有的一切都是自动实现的。

目录

1.服务器环境部署

2.MGR组复制单主模式配置

(1)组复制第一个实例配置

①参数配置

②重启服务

③用户凭据

④组复制插件

⑤加入组复制

⑥数据测试

(2)组复制添加其他实例成员

①参数配置

②重启服务

③用户凭据

④组复制插件

⑤加入组复制

(3)数据测试

总结


1.服务器环境部署

本节实验环境部署的是mysql 8.0.42三台实例

主机名IPServer IDOSMySQL version
node1192.168.72.16381OpenEuler24.3Mysql 8.0.42
node2192.168.72.16482OpenEuler24.3Mysql 8.0.42
node3192.168.72.16583OpenEuler24.3Mysql 8.0.42
#所有主机添加hosts解析
[root@node1 ~]# cat /etc/hosts
192.168.72.163 node1
192.168.72.164 node2
192.168.72.165 node3

2.MGR组复制单主模式配置

(本案例采用 MGR 默认单主模式)。

(1)组复制第一个实例配置
①参数配置

先给这组 MGR 起个组名,组名可以随便起,但是不能使用主机的 GTID.

可以通过节点的 UUID 作为 loose-group_replication_group_name 的组名,并且每个节点的这个组名必须一样!

这里使用参照官网设置手册,如下设置组名,https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html

 # 如果要通过节点的UUID设置组名,查看节点node1的uid[root@node1 mysql]# cat /var/lib/mysql/auto.cnf [auto]server-uuid=dd746660-528a-11ed-9c86-000c293b9f86-- 或者通过sql查看mysql> select uuid();+--------------------------------------+| uuid()                               |+--------------------------------------+| bf4b19ea-60f1-11ed-a06b-000c293b9f86 |+--------------------------------------+# 配置参数文件[root@node1 ~]# vim /etc/my.cnf[mysqld]# 原有默认配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 密码验证方式
default_authentication_plugin=mysql_native_password
#Storage Engines
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#Replication Framework
server_id=81
gtid_mode=ON
enforce_gtid_consistency=ON
​binlog_checksum=NONE​
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64​
sync-master-info =1
sync_binlog =1
#Group Replication Settings
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= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=off
# 双主模式,如果是单主模式无需配置,默认单主模式# 当前不配置,后续切换多主模式后再持久化该参数# group_replication_single_primary_mode=off# group_replication_enforce_update_everywhere_checks=on

参数说明:

 #以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。transaction_write_set_extraction=XXHASH64plugin_load_add='group_replication.so'#组的名字可以随便起,但不能用主机的GTID! 所有节点的这个组名必须保持一致!group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"#为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。group_replication_start_on_boot=offgroup_replication_local_address= "node1:33061"group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"group_replication_bootstrap_group=off#关闭单主模式的参数#group_replication_single_primary_mode=off#开启多主模式的参数#group_replication_enforce_update_everywhere_checks=on
②重启服务
 # 所有节点systemctl restart mysqld
③用户凭据

为了在每个实例上单独创建复制用户,可以禁用二进制日志记录后再创建,请按照以下语句执行:

https://dev.mysql.com/doc/refman/8.0/en/group-replication-user-credentials.html

[root@node1 ~]# mysql -proot
mysql>
# mysql8默认密码认证方式,客户端是无法连接的,使用mysql_native_password,或在参数文件中加入参数
# default_authentication_plugin=mysql_native_password
# CREATE USER repl@'%' IDENTIFIED BY 'repl';
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED with mysql_native_password BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;​
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

修改mysql密码 

进入mysql创建复制用户

④组复制插件
 # 安装组复制插件# INSTALL PLUGIN group_replication SONAME 'group_replication.so';# 本次已经在配置文件添加引导,无需再次安装mysql> SHOW PLUGINS;+----------------------------+----------+--------------------+----------------------+-------------+| Name                       | Status   | Type               | Library              | License     |+----------------------------+----------+--------------------+----------------------+-------------+| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | PROPRIETARY |​(...)​| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | PROPRIETARY |+----------------------------+----------+--------------------+----------------------+-------------+
⑤加入组复制
 # 引导只能由单个服务器完成,即启动组的服务器并且只执行一次。# 这就是为什么group_replication_bootstrap_group选项的值没有存储在实例的选项文件中的原因。# 如果它保存在选项文件中,则在重新启动服务器时会自动引导第二个具有相同名称的组。这将导致两个不同的组具有相同的名称mysql>
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;# 可以检查该组现在是否已创建并且其中有一个成员# 要保证group_replication_applier的状态为"ONLINE"!
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 | dd746660-528a-11ed-9c86-000c293b9f86 | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.31         | XCom                       |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+1 row in set (0.00 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)mysql>  START GROUP_REPLICATION;Query OK, 0 rows affected (1.30 sec)mysql>  SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)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 | fa4f25e1-5beb-11f0-885f-000c29c274d2 | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.42         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
1 row in set (0.00 sec)

⑥数据测试
 # 组复制环境下要求每个表都需要有主键,否则表上的DML会报错:# ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.mysql>
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');​
mysql> SELECT * FROM test.t1;+----+------+| c1 | c2   |+----+------+|  1 | Luis |+----+------+
mysql> SHOW BINLOG EVENTS;
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)mysql> USE test;
Database changed
mysql>  CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.03 sec)mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| Log_name      | Pos | Event_type     | Server_id | End_log_pos | Info                              |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| binlog.000001 |   4 | Format_desc    |         1 |         126 | Server ver: 8.0.42, Binlog ver: 4 |
| binlog.000001 | 126 | Previous_gtids |         1 |         157 |                                   |
| binlog.000001 | 157 | Stop           |         1 |         180 |                                   |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
3 rows in set (0.00 sec)

(2)组复制添加其他实例成员
①参数配置

参数配置和第一个节点的参数类似,只需修改server_idgroup_replication_local_address.

 # 将参数文件拷贝到其他节点[root@node1 ~]# scp /etc/my.cnf root@node2:/etc/my.cnf[root@node1 ~]# scp /etc/my.cnf root@node3:/etc/my.cnf​# 配置参数文件,其他参数相同,修改如下两个参数[root@node2 ~]# vim /etc/my.cnf[mysqld]server_id = 82group_replication_local_address= "node2:33061"[root@node3 ~]# vim /etc/my.cnf[mysqld]server_id = 83group_replication_local_address= "node3:33061"

切换到node2主机修改配置文件 

 切换到node3主机修改配置文件

②重启服务
 # 所有节点systemctl restart mysqld
③用户凭据

为了在每个实例上单独创建复制用户,可以禁用二进制日志记录后再创建,请按照以下语句执行:

User Credentials For Distributed Recovery

mysql>
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;​
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

切换到node2主机创建复制用户

 切换到node3主机创建复制用户

④组复制插件
 # 安装组复制插件# INSTALL PLUGIN group_replication SONAME 'group_replication.so';# 本次已经在配置文件添加引导,无需再次安装
⑤加入组复制
 #这里只需要执行这一步即可,因为组已经创建mysql> START GROUP_REPLICATION;#查看组内情况,发现node2,node3已经成功加入这个组了#一主两从模式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 | 2dd88a45-6161-11ed-b5d2-000c299aa451 | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.31         | XCom                       || group_replication_applier | 30c9d73b-6161-11ed-b523-000c2913fd72 | node2       |        3306 | ONLINE       | SECONDARY   | 8.0.31         | XCom                       || group_replication_applier | 32710bb7-6161-11ed-b45b-000c29b2256f | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.31         | XCom                       |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+3 rows in set (0.00 sec)

切换到node2主机加入组复制 

切换到node3主机加入组复制 

(3)数据测试
#主库创建
mysql> CREATE DATABASE recovery_test;
Query OK, 1 row affected (0.01 sec)
mysql> USE recovery_test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.03 sec)mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.01 sec)#从库查询
mysql> SELECT * FROM recovery_test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)
#主库添加数据
INSERT INTO recovery_test.t1 VALUES (2, 'Klaus');
#从库查询
mysql>  SELECT * FROM recovery_test.t1;
+----+-------+
| c1 | c2    |
+----+-------+
|  1 | Luis  |
|  2 | Klaus |
+----+-------+
2 rows in set (0.00 sec)

node2验证 

node3验证

以上验证成功后,组复制配置结束

总结:

        基于GTID的组复制通过事务唯一标识+自动位点同步,显著简化了分布式集群的运维复杂度。部署核心在于:

        1.全节点GTID参数统一配置;

        2.初始数据强一致保障;

        3.多主架构下冲突解决策略优化;

        4.配套半同步复制与自动故障转移提升可用性。

        5.生产环境中需持续监控GTID执行进度,并规避非事务引擎操作,以维持集群稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88642.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88642.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88642.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国国际会议会展中心模块化解决方案的技术经济分析报告

——以模块化、可持续材料与ESG为核心的运营效益提升路径研究-----中国会展经济研究会原副会长,学术委员会副主任 姚望一、报告概述1.1报告目的本报告深入探讨了一种经济视角下的综合评估,针对某国际会议会展中心采用的一种模块化、多功能、可持续升级的…

模拟开关、可编程增益仪表放大器电路

一、模拟开关1.CD4052CD4052是一种模拟多路开关,也可以称作是一个模拟多路复用器,输入引脚可以提供可变电压,可以通过输出引脚获得相同电压,常见的封装有DIP16、SOP16、TSSOP16。 CD4052的引脚功能如下图,可以用于控制…

时序数据库 TDengine × SSRS:专为工业、能源场景打造的报表解决方案

每当听到“做报表”三个字,是不是内心都会先叹口气?尤其在工业、能源、制造等场景,面对那些结构固定、字段繁多、格式要求严苛的报表任务,用 Excel 手动拼,真的是既费时又容易出错。 现在解决方案来了——时序数据库 …

C++设计秘籍:为什么所有参数都需类型转换时,非成员函数才是王道?

当所有参数都需要类型转换时,为什么要选择非成员函数? 在C++的世界里,有一个看似简单却蕴含深意的设计原则:当所有参数(包括被this指针所指的那个隐式参数)皆须进行类型转换时,请为此采用非成员函数实现。这个原则背后隐藏着C++类型系统的精妙设计,也揭示了成员函数与…

Markmap:基于Markdown生成思维导图

Markmap 是一款用于将 Markdown 文本转换为思维导图的免费工具。 Markmap 的核心原理是通过输入:结构化的 Markdown 文本,根据标题层级构建一个树形数据结构,然后使用 d3.js 可视化 JavaScript 库将树形数据渲染成可交互的 SVG 思维导图。 主…

学习threejs,使用自定义GLSL 着色器,生成漂流的3D能量球

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录一、🍀前言1.1 ☘️GLSL着色器1.1.1 ☘️着色器…

分布式推客系统全栈开发指南:SpringCloud+Neo4j+Redis实战解析

一、推客系统概述与市场背景推客系统(或称"推荐客"系统)是一种基于社交关系和内容分发的推荐营销平台,近年来在电商、内容平台和社交媒体领域迅速崛起。根据最新统计数据,2023年全球社交电商市场规模已达1.2万亿美元&am…

Redis数据类型之list

上篇文章: Redis数据类型之hashhttps://blog.csdn.net/sniper_fandc/article/details/149139615?fromshareblogdetail&sharetypeblogdetail&sharerId149139615&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 lpush、lpu…

在 Windows 上安装和配置 Kafka

消息代理是一种软件,充当在不同应用程序之间发送消息的中介。它的功能类似于服务器,从一个应用程序(称为生产者)接收消息,并将其路由到一个或多个其他应用程序(称为消费者)。消息代理的主要目的…

FPGA实现SDI转LVDS视频发送,基于GTP+OSERDES2原语架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案FPGA实现LVDS视频收发方案 3、工程详细设计方案工程设计原理框图SDI 输入设备Gv8601a 均衡器GTP 高速接口-->解串SMPTE SD/HD/3G SDI IP…

uniapp+vue3项目实现:H5的文件预览、文件下载功能(文章参考)

uniappvue3项目实现:H5的文件预览、文件下载功能(文章参考) 文章参考: uniapp的移动端h5实现文件下载兼容手机各版本浏览器 uni-app之微信小程序实现‘下载保存至本地预览’功能 uniapp:h5和微信小程序文件下载方式

汽车功能安全-软件单元验证 (Software Unit Verification)【定义、目的、要求建议】6

文章目录1 软件单元验证 (Software Unit Verification)2 ISO 26262-6对单元验证的实施要求和建议2.1 要求和建议2.2 通俗易懂的解释与总结2.3 示例2.3.1 场景1:电动助力转向系统 (EPS)2.3.2 场景2:自动紧急制动系统 (AEB)2.3.3 示例模型验证2.4 核心要点…

提示工程:突破Transformer极限的计算科学

Why Prompt Design Matters and Works: A Complexity Analysis of Prompt Search Space in LLMs 提示工程如何从经验技巧升级为系统科学 一、Transformer的先天缺陷:计算深度固化与信息丢失 原理 Transformer架构的计算能力存在固有局限: 计算深度固化:其隐状态仅在层间…

【2025/07/11】GitHub 今日热门项目

GitHub 今日热门项目 🚀 每日精选优质开源项目 | 发现优质开源项目,跟上技术发展趋势 📋 报告概览 📊 统计项📈 数值📝 说明📅 报告日期2025-07-11 (周五)GitHub Trending 每日快照&#x1f55…

LeetCode 278. 第一个错误的版本

LeetCode 278. 第一个错误的版本 解析 这个问题要求找到第一个错误的版本,其中给定一个 API isBadVersion(version) 可以判断某个版本是否错误。由于版本号是有序的,且错误版本之后的所有版本都是错误的,因此可以使用二分查找高效地定位第一个…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | Pango 的时钟资源——锁相环

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 1.实验简介 实验目的: 了解 PLL IP 的基本使用方法。 实验环境: Window11 PDS2022.2-SP6.4…

Graph Contrastive Learning with Generative Adversarial Network基于生成对抗网络的图对比学习

1. 什么是图?(Graph)想象一下社交网络,每个人是一个“点”(节点),他们之间的朋友关系是“线”(边)。这样的点和线组成的结构就是“图”。在计算机科学中,图被…

PyTorch中的torch.argmax()和torch.max()区别

在PyTorch中,torch.argmax()和torch.max()都是针对张量操作的函数,但它们的核心区别在于返回值的类型和用途:1. torch.argmax() 作用:仅返回张量中最大值所在的索引位置(下标)。返回值:一个整数…

WebSocket主从服务器架构完整教程

目录 1. 前言:为什么要学习WebSocket主从架构 第一章:基础知识准备 2.1 什么是WebSocket 生活中的例子 技术特点 2.2 WebSocket vs HTTP 什么时候用WebSocket? 2.3 什么是主从架构 生活中的例子 技术架构图 2.4 环境准备 需要的软件 项目结构 第二章:WebSock…

Java的extends通配符

在Java泛型中,extends通配符用于限定泛型类型的上界,即指定泛型可以是某个类型或其子类型。它有两种常见用法:类型参数限定和通配符限定,下面详细介绍: 1. 类型参数限定(在类/方法定义中) 在定义…