【MySQL高可用集群】MySQL的MGR搭建

前情提要:

  MySQL官方在 5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR),使用类似 zookeeper 的多于一半原则。在一个集群由 2N+1 个节点共同组成一个复制组,一个事务的提交,必须经过 N+1 (也就是集群节点数 / 2+ 1)个节点决议并通过后才可以提交。这是目前 MySQL 数据库高可用与高扩展的最优解决方案。MGR有以下几个限制条件:

1、存储引擎必须为Innodb,即仅支持InnoDB表

2、每张表必须有主键,用于做write set的冲突检测

3、不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚

4、必须开启GTID特性,二进制日志格式必须设置为ROW,用于选主与write set

5、二进制日志binlog不支持Replication event checksums

6、多主模式(也就是多写模式) 下:不支持SERIALIZABLE事务隔离级别,不完全支持级联外键约束,不支持在不同节点上对同一个数据库对象并发执行DDL

8、只支持ipv4网络,最多支持9个节点

一、环境准备

Ubuntu 22.04 LTS (三台虚拟机),每台上面安装MySQL 8.0.33。

分别在每个节点配置 /etc/hosts 主机域名映射。

    IP          主机名
10.53.207.20  master1
10.53.207.21  slave1
10.53.207.22  slave2

关闭 ubuntu 防火墙或者设置三个节点进白名单。

二、MySQL配置文件设置

分别在三个节点进行配置,内容基本相同,只有server_id、report_host、group_replication_local_address 值不同。它们在三个接点的值分别设置如下:

10.53.207.20:server_id=20;report_host = 10.53.207.20,group_replication_local_address =  "10.53.207.20:33061"

10.53.207.21:server_id=21;report_host = 10.53.207.21;group_replication_local_address =  "10.53.207.21:33061"

10.53.207.22:server_id=22;report_host = 10.53.207.22;group_replication_local_address =  "10.53.207.22:33061"

属性 group_replication_bootstrap_group 配置是否引导组复制,如果某个节点设置此属性为ON,则先启动此节点创建一个组服务并成为 master 节点,接受其他后启动节点加入组复制集群。

如果属性 group_replication_single_primary_mode =ON,则其他后启动组复制服务的节点会以slave 节点的身份自动加入复制组 ,最终组成一主多从集群。如果属性 group_replication_single_primary_mode =OFF,则其他后启动组复制服务的节点会以master 节点的身份自动加入复制组 ,最终组成多主集群。复制组白名单group_replication_ip_whitelist 在 8.03以后变为group_replication_ip_allowlist,配置形式可以直接使用ip地址或者C类ip地址[C类的为255.255.255.0(/24)]表示,例如 10.53.207.20/24 表示 10.53.207.x 的地址都可访问。

[mysqld]
#禁止 MGR 不支持的引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=20
report_host = 10.53.207.20
#GTID
gtid_mode=ON
enforce_gtid_consistency=ON
#binlog
#log_bin=binlog
binlog_format=ROW
expire_logs_days=10
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
#relaylog
relay_log_info_repository=TABLE
relay_log_recovery = 1
log_slave_updates=ON
master_info_repository=TABLE
#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#MGR
#服务启动加载安装复制组插件
plugin_load_add='group_replication.so'
#复制组名称确保每个机器都一样,可以用“select uuid()”生成
group_replication_group_name="35693218-3d99-11ee-a7ba-489ebd770e95"
#MySQL启动时是否自动启动组复制
group_replication_start_on_boot=OFF
#当前主机的主机名和复制组端口
group_replication_local_address= "10.53.207.20:33061"
#复制组的成员信息
group_replication_group_seeds= "10.53.207.20:33061,10.53.207.21:33061,10.53.207.22:33061"
#复制组白名单
group_replication_ip_whitelist = '10.53.207.20,10.53.207.21,10.53.207.22'
#是否引导组服务,如果开启每次重启都会创建新的复制组,所以配置文件中一定要关闭
group_replication_bootstrap_group=OFF
#是否单主模式,默认是
#group_replication_single_primary_mode=ON
#多主模式下,强制检查每一个实例是否允许写操作,默认关闭
#group_replication_enforce_update_everywhere_checks=OFF

 配置完之后在centos命令进行重启服务:

systemctl restart  mysqld
登录MYSQL:
mysql -uroot -p

MySQL中查看组复制插件是否安装:

show plugins;

 由图可知插件已经正常安装。

本实例是通过在 my.cnf 中添加 plugin_load_add='group_replication.so' 配置,在mysql 服务启动时自动安装。还有另外一种安装方式是通过MySQL命令行进行安装(命令行安装后必须重启):

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

三、MGR集群的配置和启动。

1、分别在三个节点执行以下SQL命令:

创建集群数据同步账户

SET SQL_LOG_BIN=0;
CREATE USER 'repl'@'10.53.207.%' IDENTIFIED BY 'P@repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.53.207.%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

为组复制通道指定账号密码

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='P@repl' FOR CHANNEL 'group_replication_recovery';

2、启动组复制:

10.53.207.20 作为引导节点启动组复制服务,此节点将作为主节点接收其他节点加入集群。

SET GLOBAL group_replication_single_primary_mode=ON; # ON单主模式(如果是单主模式则当前引导节点为master,其他加入节点为slave)。OFF 多主模式(所有节点都是master)
SET GLOBAL group_replication_bootstrap_group=ON;   #开启节点的引导模式,创建复制组并接受其他节点加入复制组
START GROUP_REPLICATION;                 #开启组复制数据同步服务
SET GLOBAL group_replication_bootstrap_group=OFF;   #将当前节点设置为引导节点后关闭

查看组复制信息:

SELECT * FROM performance_schema.replication_group_members;

 然后启动另外两个节点(暂且叫做从节点以示区分)组复制服务加入集群,直接执行下面一条命令即可:

START GROUP_REPLICATION;

发现报错了,报错如下(这是本人遇到的错误,读者朋友如果正常启动可以忽略下面异常相关的步骤):

 查看日志详情:

Can't start group replication on secondary member with single-primary mode while asynch
ronous replication channels are running

 网上各种查资料都找不到原因,来来回回折腾好久。仔细看了日志,发现当前节点貌似连接到了一个空的channel上面,看下面这个日志:

Replica receiver thread for channel '': connected to source 'repl@10.53.207.20:3306' with server_uuid=7dad9e38-31c7-11ee-85
dc-5254004bdc94, server_id=20. Starting GTID-based replication.

这时恍然大悟,之前用这个节点做过基于GTID 的主从同步,然后通过 show slave status\G 查看了下,果然有相关信息,那就好办了,在两个从节点执行下面命令:

#停止数据同线程
stop slave;
#清理并重置binlog
reset master;
#启动组复制线程
start group_replication

一切OK!注意reset master 生产环境不要使用,这是集群初始搭建重置binlog。

查看MGR集群状态:

SELECT * FROM performance_schema.replication_group_members;

如果要运行多主集群,需要在启动时设置每个节点的下列属性值。(可以通过配置文件设置,但建议通过命令行设置,这样就可以在线进行多主和单主模式的切换)

SET GLOBAL group_replication_single_primary_mode=OFF;
SET GLOBAL group_replication_enforce_update_everywhere_checks=true;

四、集群监控

MySQL 的 performance_schema 库中记录了MGR集群的相关运行状态,相关表查看:

use performance_schema;
show tables like '%replication_group%';

replication_group_members:记录组复制成员的实时状态,其中字段 MEMBER_STATE 有 5 种,分别是:ONLINE(在线)、OFFLINE(离线)、RECOVERING(恢复中)、ERROR(发生错误) 和 UNREACHABLE(无法通信)。

replication_group_member_stats :记录组复制中每个成员事务的验证和应用的统计信息。

replication_connection_status:复制组中连接状态信息,处理事务的 I/O 线程状态,以及 clone 通道状态信息。

五、集群验证

在 primary节点(10.53.207.20)执行命令:stop group_replication,此节点变为OFFLINE状态,在另外两个节点查看MGR集群状态,如下图。主节点 primary 从 10.53.207.20 变为了 10.53.207.21,说明主从切换成功。再重启 10.53.207.20 节点的组复制服务 start group_replication,发现它会作为从节点加入集群。

 在primary节点进行数据的更新,会同步至其他节点。

 至此,MGR 集群搭建完成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/409229.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Babylonjs学习必备

基于babylonjs封装的一些功能和插件 ,希望有更多的小伙伴一起玩babylonjs; 欢迎加群:464146715 ​ 官方文档 中文文档 Babylonjs案例分享 ​ ​

kafka生产者2

1.数据可靠 • 0:生产者发送过来的数据,不需要等数据落盘应答。 风险:leader挂了之后,follower还没有收到消息。。。。 • 1:生产者发送过来的数据,Leader收到数据后应答。 风险:leader应答…

Vision Mamba:使用双向状态空间模型进行高效视觉表示学习

模型效果 将DeiT和Vim模型之间的性能和效率比较,为了进行准确性比较,我们首先在IN1K分类数据集上预训练DeiT和Vim,然后在不同的下游密集预测任务上微调通用主干,即,语义分割、目标检测、实例分割。结果表明&#xff0c…

VIO第5讲:后端优化实践

VIO第5讲后端优化实践:逐行手写求解器 文章目录 VIO第5讲后端优化实践:逐行手写求解器1 非线性最小二乘求解流程1.1 H矩阵不满秩的解决办法1.2 H矩阵的构建1.2.1 确定维度1.2.2 构建海塞矩阵 1.3 初始化μ—LM算法1.4 求解线性方程1.4.1 非SLAM问题—求逆…

【架构】GPU架构总结

文章目录 GPU架构GPU渲染内存架构Streaming Multiprocessor(SM)CUDA CoreTensor CoreRT CoreCPU-GPU异构系统GPU资源管理模型 GPU架构演进G80 架构Fermi 架构Maxwell架构Tesla架构Pascal架构Volta 架构Turing架构Ampere 架构Hopper架构 参考文献 GPU架构 主要组成包括&#xf…

【C语言】指针初阶

正文开始之前,我们要记住一个东西就是:地址指针 目录 一、指针的解释二、指针变量和地址1、取地址操作符2、指针变量和解引用操作1、指针变量2、拆解指针类型3、解引用操作符4、注意事项 3、指针变量的大小4、指针的解引用5、void*指针 三、指针的运算1、…

【Java程序设计】【C00277】基于Springboot的招生管理系统(有论文)

基于Springboot的招生管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的招生管理系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块:在系统首页可以查看首页、专业…

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l),头文件搜索路径,库文件搜索路径,连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前,我们首先来…

【Linux】MySQL数据库的使用

【Linux】MySQL数据库的使用 一、访问MySQL数据库二、创建及删除库和表1、创建新的库2、创建新的表3、删除一个数据表4、删除一个数据库 三、管理表中的数据记录1、插入数据记录2、查询数据记录3、修改数据记录4、删除数据记录 四、数据库用户授权1、授予权限2、查看权限3、撤销…

C/C++暴力/枚举/穷举题目持续更新(刷蓝桥杯基础题的进!)

目录 前言 一、百钱买百鸡 二、百元兑钞 三、门牌号码(蓝桥杯真题) 四、相乘(蓝桥杯真题) 五、卡片拼数字(蓝桥杯真题) 六、货物摆放(蓝桥杯真题) 七、最短路径(蓝…

文献阅读:Large Language Models are Null-Shot Learners

文献阅读:Large Language Models are Null-Shot Learners 1. 文章简介2. 方法介绍3. 实验考察 & 结论 1. 基础实验 1. 实验设计2. 实验结果 2. 消融实验 1. 小模型上的有效性2. ∅CoT Prompting3. 位置影响4. 组成内容 4. 总结 & 思考 文献链接&#xff1…

双重检查锁定与延迟初始化

双重检验锁:多线程下的单例模式。 懒加载模式:延迟初始化。

域名系统与IP地址分配

域名 域名的概述 域名是一个逻辑的概念,它不反映主机的物理地点 域名结构 由于数字形式的IP地址难以记忆和理解,为此人们采用英文符号来表示IP地址,这就产生了域名,域名长度不超过255各字符,每一层域名长度不超过6…

利用psutil库检查脚本是否在运行

摘要 如果要判断某一脚本是否在运行,可以通过psutil库获取所有进程的cmdline,并判断指定的文件名是否在cmdline中。 目录 1.psutil库简介 2.检查代码及说明 2.1检查思路 2.2异常捕获 2.3执行方法 1.psutil库简介 psutil 是一个跨平台(…

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

算法沉淀——动态规划之简单多状态 dp 问题上 01.按摩师02.打家劫舍 II03.删除并获得点数04.粉刷房子 01.按摩师 题目链接:https://leetcode.cn/problems/the-masseuse-lcci/ 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在…

【Unity】提示No valid Unity Editor liscense found.Please active your liscense.

有两个软件,如果只有一个,点黑的不会有效果、、、、(楼主是这个原因,可以对号入座一下) 简而言之,就是去下载Unity Hub,再里面激活管理通行证 问题情境: 点击unity出现以下弹窗&a…

防御保护--入侵防御系统IPS

目录 DFI和DPI技术 --- 深度检测技术 入侵防御(IPS) 签名 入侵防御策略的配置 内容安全:攻击可能只是一个点,防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI--深度包检测技术--主要针对完整的数据包&#xff0…

操作符详解3

✨✨ 欢迎大家来到莉莉的博文✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 前面我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作 符,今天继续介绍一部分。 目录 1.操作符的分类 2…

typescript 类型声明文件

typescript 类型声明文件概述 在今天几乎所有的JavaScript应用都会引入许多第三方库来完成任务需求。这些第三方库不管是否是用TS编写的,最终都要编译成JS代码,才能发布给开发者使用。6我们知道是TS提供了类型,才有了代码提示和类型保护等机…

K8S—集群调度

目录 前言 一 List-Watch 1.1 list-watch概述 1.2 list-watch工作机制 二 集群调度 2.1 调度过程 2.2 Predicate 和 Priorities 的常见算法和优先级选项 2.3 调度方式 三 亲和性 3.1 节点亲和性 3.2 Pod 亲和性 3.3 键值运算关系 3.4 Pod亲和性与反亲和性 3.5 示例…