MySQL单主模式部署组复制集群
前言
本篇文章介绍MySQL8.0.27版本的组复制详细搭建过程,教你如何快速搭建一个三节点的单主模式组复制集群。
实际上,MySQL组复制是MySQL的一个插件 group_replication.so
,组中的每个成员都需要配置并安装该插件,配置和安装过程见下文。
官方参考文档:group-replication-deploying-in-single-primary-mode.html
1 部署规划
集群包含三个节点,node1作为主库,node2和node3作为从库。主库可以接收可读可写,两个从库只能读取数据。
主机名 | ip地址 | 成员角色 | 版本号 | 服务器版本 |
---|---|---|---|---|
node1 | 192.168.131.10 | primary | MySQL8.0.27 | RHEL7.9 |
node2 | 192.168.131.20 | secondary | MySQL8.0.27 | RHEL7.9 |
node3 | 192.168.131.30 | secondary | MySQL8.0.27 | RHEL7.9 |
2 准备安装环境
准备安装环境的步骤三个节点node1、node2和node3都需要执行。
1)关闭防火墙
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
#或者
[root@node1 ~]# iptables -F
2)关闭selinux
[root@node1 ~]# setenforce 0
setenforce: SELinux is disabled
[root@node1 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
3 配置组复制实例
配置组复制实例的步骤三个节点node1、node2和node3都需要执行。
3.1 解压二进制包并创建软连接
[root@node1 local]# tar -xvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz
[root@node1 local]# ln -s mysql-8.0.27-linux-glibc2.12-x86_64 mysql
3.2 编辑 node1 配置文件
[root@node1 local]# vim /etc/my.cnf
添加如下配置:
[mysqld]
#Server Settingsbasedir=/usr/local/mysql
datadir=/data/mysql/3306/data
user=mysql
port=3306
socket=/data/mysql/3306/data/mysql.sock
log_error=/data/mysql/3306/data/mysqld.err
log_timestamps=system
skip_name_resolve=TRUE
report_host="192.168.131.10"
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
sql_require_primary_key=ON#Replication Frameworkserver_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
super_read_only=ON
binlog_transaction_dependency_tracking=WRITESET#Group Replication Settingsplugin_load_add='group_replication.so'
loose_group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose_group_replication_start_on_boot=off
loose_group_replication_local_address= "192.168.131.10:33061"
loose_group_replication_group_seeds= "192.168.131.10:33061,192.168.131.20:33061,192.168.131.30:33061"
loose_group_replication_bootstrap_group=off
loose_group_replication_recovery_get_public_key=ON#Multi-Source Replication Settingsreplica_parallel_workers=4
replica_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=1[client]
socket=/data/mysql/3306/data/mysql.sock
注意, 需要手动将下面三个系统变量修改为自己实际环境中的配置:report_host
、loose_group_replication_local_address
、loose_group_replication_group_seeds
。
系统变量loose_group_replication_group_name
为集群名称,必须为一个唯一值,可以通过select uuid()生成。
3.3 编辑 node2 配置文件
除了修改下面三个系统变量,其他和node1配置保持一致:
report_host="192.168.131.20"
server_id=2
loose_group_replication_local_address= "192.168.131.20:33061"
3.4 编辑 node3 的配置文件
除了修改下面三个系统变量,其他和node1配置保持一致:
report_host="192.168.131.30"
server_id=3
loose_group_replication_local_address= "192.168.131.30:33061"
3.5 创建数据目录
[root@node1 local]# mkdir -p /data/mysql/3306/data
3.6 添加环境变量
[root@node1 ~]# vim /etc/profile
#添加
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin[root@node1 ~]# source /etc/profile
3.7 添加mysql用户和组
[root@node1 ~]# cd /usr/local/
[root@node1 local]# groupadd mysql
[root@node1 local]# useradd -g mysql mysql
[root@node1 local]# passwd mysql
3.8 初始化实例
[root@node1 local]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure
使用 --initialize-insecure
初始化选项时,新安装的mysql实例 root
用户登录不需要密码,输入mysql后直接回车可以登录到mysql客户端中。但是要注意,在生产环境中注意要及时修改密码,或者使用 --initialize
选项进行初始化,临时密码保存在错误日志中。
3.9 配置systemd系统管理mysql service
1)创建systemd服务配置文件
[root@node1 ~]# vim /usr/lib/systemd/system/mysqld.service
添加:
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network-online.target
After=syslog.target[Install]
WantedBy=multi-user.target[Service]
User=mysql
Group=mysqlType=notify# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql# Sets open_files_limit
LimitNOFILE = 65536Restart=on-failureRestartPreventExitStatus=1# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1PrivateTmp=false
2)配置生效
[root@node1 ~]# systemctl daemon-reload
[root@node1 bin]# systemctl start mysqld
4 启动组复制
主要在node1上执行。
4.1 查看插件是否加载成功
3个节点都确认一下组复制插件 group_replication.so
是否安装成功:
mysql> select * from information_schema.plugins where plugin_name = 'group_replication'\G
*************************** 1. row ***************************PLUGIN_NAME: group_replicationPLUGIN_VERSION: 1.1PLUGIN_STATUS: ACTIVEPLUGIN_TYPE: GROUP REPLICATIONPLUGIN_TYPE_VERSION: 1.4PLUGIN_LIBRARY: group_replication.so
PLUGIN_LIBRARY_VERSION: 1.10PLUGIN_AUTHOR: Oracle CorporationPLUGIN_DESCRIPTION: Group Replication (1.1.0)PLUGIN_LICENSE: GPLLOAD_OPTION: ON
1 row in set (0.00 sec)
4.2 在node1上执行初始化组复制
首次启动一个组复制的过程称为引导(bootstrapping),使用 group_replication_bootstrap_group
系统变量来引导一个组复制。
需要注意的是,引导应该只由其中一个节点完成,且仅执行一次。
这就是为什么此变量没直接写死在配置文件中的原因。如果它保存在配置文件中,那么MySQl Service在重新启动时,服务器将自动引导具有相同名称的第二个组复制。这将导致两个具有相同名称的不同组。
因此,为了安全地引导组复制,需要在启动组复制后再次关闭此系统变量:
mysql> set global group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=off;
组启动成功后,通过视图 performance_schema.replication_group_members
,查看组复制成员信息。此时可以看到组已经创建,并且有一个成员:
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 | f40395ea-c132-11ee-9249-000c29c00092 | 192.168.131.10 | 3306 | ONLINE | PRIMARY | 8.0.27 | XCom |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+----------------------------+
4.3 在引导成员node1上创建复制用户并赋权
创建的用户主要用于下一步配置恢复通道。
mysql>
create user rpl_user@'%' identified by 'rpl_123';
grant replication slave on *.* to rpl_user@'%';
grant connection_admin on *.* to rpl_user@'%';
grant backup_admin on *.* to rpl_user@'%';
grant group_replication_stream on *.* to rpl_user@'%';
注意: 千万别在从节点上执行flush privileges
,执行后会写入从节点的binlog,造成与组复制的事务不一致,导致添加节点失败,报错信息如下:
2024-02-03T00:33:18.335943+08:00 0 [ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 13fc049e-c133-11ee-a377-000c29df1f85:1 > Group transactions: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-10'
2024-02-03T00:33:18.336062+08:00 0 [ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
解决办法有两个:
- 最保险的办法是重建这个从库;
- 也可以在主库上插入空会话,直到组复制事务大于从库的事务,最后再重新添加节点。
SET GTID_NEXT='13fc049e-c133-11ee-a377-000c29df1f85:1';
BEGIN; COMMIT;
SET GTID_NEXT=AUTOMATIC;
4.4 配置node1的恢复通道
在MySQL组复制中,恢复通道(recovery channel)主要用于处理从库的启动和数据同步过程。通过为恢复通道配置用户凭证,可以确保从库能够正确地连接到主库并获取复制所需的数据。
mysql> change master to master_user='rpl_user', master_password='rpl_123' for channel 'group_replication_recovery';
创建测试数据:
mysql>
create database mgrtest;
create table mgrtest.demo(id int primary key,c1 varchar(10));
insert into mgrtest.demo values(1,'a'),(2,'b');
5 添加节点node2和node3
在 node2 和 node3 上执行
1)配置恢复通道
mysql> change master to master_user='rpl_user', master_password='rpl_123' for channel 'group_replication_recovery';
2)启动组复制
mysql> start group_replication;
3)查看集群节点信息
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 | 13fc049e-c133-11ee-a377-000c29df1f85 | 192.168.131.20 | 3306 | ONLINE | SECONDARY | 8.0.27 | XCom |
| group_replication_applier | 248563ac-c133-11ee-a387-000c29551477 | 192.168.131.30 | 3306 | ONLINE | SECONDARY | 8.0.27 | XCom |
| group_replication_applier | f40395ea-c132-11ee-9249-000c29c00092 | 192.168.131.10 | 3306 | ONLINE | PRIMARY | 8.0.27 | XCom |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+----------------------------+
4)验证测试数据
mysql> select * from mgrtest.demo;
+----+------+
| id | c1 |
+----+------+
| 1 | a |
| 2 | b |
+----+------+
【关联文章】
1)MySQL组复制的介绍
2)MySQL单主模式部署组复制
3)MySQL组复制的管理
相关文章:
MySQL单主模式部署组复制集群
前言 本篇文章介绍MySQL8.0.27版本的组复制详细搭建过程,教你如何快速搭建一个三节点的单主模式组复制集群。 实际上,MySQL组复制是MySQL的一个插件 group_replication.so,组中的每个成员都需要配置并安装该插件,配置和安装过程…...

【大厂AI课学习笔记】【1.5 AI技术领域】(10)对话系统
对话系统,Dialogue System,也称为会话代理。是一种模拟人类与人交谈的计算机系统,旨在可以与人类形成连贯通顺的对话,通信方式主要有语音/文本/图片,当然也可以手势/触觉等其他方式 一般我们将对话系统,分…...

【ARM 嵌入式 编译系列 2.7 -- GCC 编译优化参数详细介绍】
请阅读【嵌入式开发学习必备专栏 】 文章目录 GCC 编译优化概述常用优化等级-O1 打开的优化选项-O2 打开的优化选项-O3 打开的优化选项-Os 打开的优化选项优化技术使用优化选项的注意事项GCC 编译优化概述 GCC(GNU Compiler Collection)包含了用于C、C++、Objective-C、Fort…...

《剑指 Offer》专项突破版 - 面试题 38、39 和 40 : 通过三道面试题详解单调栈(C++ 实现)
目录 面试题 38 : 每日温度 面试题 39 : 直方图最大矩形面积 方法一、暴力求解 方法二、递归求解 方法三、单调栈法 面试题 40 : 矩阵中的最大矩形 面试题 38 : 每日温度 题目: 输入一个数组,它的每个数字是某天的温度。请计算每天需要等几天才会…...
动态规划C语言
#include <stdio.h> #include <stdlib.h> //0-1背包问题是一种经典的组合优化问题, //问题描述为:有一个给定容量的背包和一组具有不同价值和重量的物品,如何选择物品放入背包中,以使得背包中物品的总价值最大化&…...

基于微信小程序的校园二手交易平台
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

K8S系列文章之 [使用 Alpine 搭建 k3s]
官方文档:K3s - 轻量级 Kubernetes | K3s 官方描述,可运行在 systemd 或者 openrc 环境上,那就往精简方向走,使用 alpine 做系统。与 RHEL、Debian 的区别,主要在防火墙侧;其他基础配置需求类似࿰…...

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量
Hi,大家好,我是半亩花海。在当今科技飞速发展的时代,我们身边充斥着各种智能设备,然而,如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目,通过手势…...

python28-Python的运算符之三目运算符
Python可通过if语句来实现三目运算符的功能,因此可以近似地把这种if语句当成三目运算符。作为三目运算符的f语句的语法格式如下 True_statements if expression else False_statements 三目运算符的规则是:先对逻辑表达式expression求值,如果逻辑表达式…...

高德 API 10009
问题 笔者使用高德地图所提供的API接口,访问接口报错 {"info":"USERKEY_PLAT_NOMATCH","infocode":"10009","status":"0","sec_code_debug":"d41d8cd98f00b204e9800998ecf8427e"…...

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?
嗨,大家好!我是波罗学。 本文是系列文章 Go 技巧第十五篇,系列文章查看:Go 语言技巧。 我们先看这样一个问题:“Go 语言中,将 byte 转换为 int 时是否涉及字节序(endianness)&#x…...

论文阅读——MP-Former
MP-Former: Mask-Piloted Transformer for Image Segmentation https://arxiv.org/abs/2303.07336 mask2former问题是:相邻层得到的掩码不连续,差别很大 denoising training非常有效地稳定训练时期之间的二分匹配。去噪训练的关键思想是将带噪声的GT坐标…...

JPEG图像的压缩标准(1)
分3个博客详细介绍JPEG图像的压缩标准,包含压缩和解压缩流程,熵编码过程和文件存储格式。 一、JPEG压缩标准概述 JPEG压缩标准由国际标准化组织 (International Organization for Standardization, ISO) 制订,用于静态图像压缩。JPEG标准包…...
数解 transformer 之 self attention transformer 公式整理
句子长度为n;比如2048,或1024,即,一句话最多可以是1024个单词。 1, 位置编码 可知,E是由n个列向量组成的矩阵,每个列向量表示该列号的位置编码向量。 2, 输入向量 加入本句话第一个单词的词嵌入向量是, 第…...
ubuntu22.04@laptop OpenCV Get Started
ubuntu22.04laptop OpenCV Get Started 1. 源由2. 步骤3. 预期&展望4. 参考资料 1. 源由 OpenCV在学校的时候接触过,不过当时专注在物理、研究方面,没有好好的学习下。 这次借后续视频分析刚性需求,对OpenCV做个入门的学习和研读&#…...

【Java】苍穹外卖 Day01
苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示: 管理端-外卖商家使用用户端-点餐用户使用当我们完成该项目的学习,可以培养以下能力: 1. 软件开发整体介绍 作为一名软件开…...

Ivanti Pulse Connect Secure VPN SSRF(CVE-2023-46805)漏洞
免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…...
GPT-4:比ChatGPT3.5好得多,但它有多好你知道么?
GPT-4简介 GPT-4是一款由OpenAI开发的人工智能语言模型,它是ChatGPT3.5的升级版。GPT-4拥有更强大的学习能力、更高的生成质量和更广泛的知识覆盖范围,被誉为人工智能技术的重要突破。 GPT-4与ChatGPT3.5的对比 1. 学习能力 GPT-4采用了更多的神经网…...
测试:JMeter如何获取非json格式的响应参数
JMeter如何获取非json格式的响应参数 在 JMeter 中获取非 JSON 格式的响应参数通常涉及使用后置处理器来提取这些参数。以下是一些常见的方法来获取不同类型的响应数据: 正则表达式提取器: 适用于提取文本、HTML、XML 等格式中的特定文本。使用正则表达…...
2024年刘谦魔术大揭秘,其中竟用到了约瑟夫环?
目录 前言 魔术过程 揭秘过程 结尾 前言 不知道昨天春晚时刘谦的魔术大家看了没有,相信大家跟我一样也很疑惑,所以爆肝一天我得出了结论。如果你觉得还不错的话,记得点赞收藏,分享给更多的朋友看。 魔术过程 整个魔术可以分…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...