当前位置: 首页 > news >正文

运维实施40-MGR高可用

MGR(MySQL Group Replication)是MySQL 5.7.17版本诞生的,是MySQL自带的一个插件,可以灵活部署。

保证数据一致性又可以自动切换,具备故障检测功能、支持多节点写入。

集群是多个MySQL Server节点共同组成的分布式集群,每个Server都有完整的副本,它是基于ROW格式的二进制日志文件和GTID特性。

MGR 优点

强一致性:基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证。

高容错性:只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制。

高扩展性:节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息。

高灵活性:有单主模式和多主模式。单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。工作中优先使用单主模式!

MGR 缺点

仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测。

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

主从状态信息存于表中(–master-info-repository=TABLE 、–relay-log-inforepository=TABLE),–log-slave-updates打开。

MGR不支持大事务,事务大小最好不超过143MB,当事务过大,无法在5秒的时间内通过网络在组成员之间复制消息,则可能会怀疑成员失败了,然后将其驱逐出局。

目前一个MGR集群最多支持9个节点。

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

二进制日志不支持binlog Event Checksum。

MGR 适用场景

金融交易、重要数据存储、对主从一致性要求高的场景。

核心数据总量未过亿。

读多写少,如:互联网电商。

搭建流程

环境准备

Master服务器(hostname:master):192.168.66.143

Slave服务器1(hostname:slave1):192.168.66.144

Slave服务器2(hostname:slave2):192.168.66.145

配置系统环境

将Hosts文件写入master/slave1/slave2节点与内网IP对应关系,后面配置采用域名访问:

3台服务器都执行vim /etc/hosts192.168.66.143 master
192.168.66.144 slave1
192.168.66.145 slave2

分别为三台服务器依次设置主机名称,三台服务器执行命令:

# 第1台服务器
hostnamectl set-hostname master# 第2台服务器
hostnamectl set-hostname slave1# 第3台服务器
hostnamectl set-hostname slave2

配置 MySQL

清除原来的主从配置信息

取消slave服务器中的只读设置

stop slave;reset slave all;

主节点master执行

==半同步复制使用mysql的插件==

# 修改 MySQL 配置
vim /etc/my.cnf# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 关闭binlog校验(MGR强制要求)
binlog_checksum=NONE# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="aaaaaaaa-aaaa-4aaa-aacd-1234567890ab"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="master:24901"# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用master~slave2的主机名替代
loose-group_replication_group_seeds="master:24901,slave1:24901,slave2:24901"# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF

从节点slave1执行

vim /etc/my.cnfserver_id=3
gtid_mode=ON
enforce_gtid_consistency=ON# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 关闭binlog校验(MGR强制要求)
binlog_checksum=NONE# 这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=OFF
loose-group_replication_group_name="aaaaaaaa-aaaa-4aaa-aacd-1234567890ab"
loose-group_replication_start_on_boot=OFF# 设置本机地址slave1:24901
loose-group_replication_local_address="slave1:24901"
loose-group_replication_group_seeds="master:24901,slave1:24901,slave2:24901"
loose-group_replication_bootstrap_group=OFF

从节点slave2执行

vim /etc/my.cnfserver_id=5
gtid_mode=ON
enforce_gtid_consistency=ON# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 关闭binlog校验(MGR强制要求)
binlog_checksum=NONE# 这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=OFF
loose-group_replication_group_name="aaaaaaaa-aaaa-4aaa-aacd-1234567890ab"
loose-group_replication_start_on_boot=OFF# 设置本机地址slave1:24901
loose-group_replication_local_address="slave2:24901"
loose-group_replication_group_seeds="master:24901,slave1:24901,slave2:24901"
loose-group_replication_bootstrap_group=OFF

三台服务器,依次启动 MySQL

systemctl start mysqld

三台服务器,连接到数据库控制台中:

# 创建slave账户,此账户用于实现主从数据同步
CREATE USER slave@'%' IDENTIFIED with mysql_native_password by '123456';# 赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO slave@'%';# 创建一个远程连接用户
create user 'remote'@'%' identified with mysql_native_password by '123456';# 为remote用户赋予所有数据库资源的访问权限
grant all privileges on *.* to remote@'%';# 让刚才的修改生效
FLUSH PRIVILEGES;# 删除已产生的binlog
# 一定要RESET MASTER,它会删除刚才已产生的binlog
# 因为刚才binlog包含创建用户这种高权限操作,用于主从同步的slave账户是没有权限执行的
# 这就会导致relaylog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了
RESET MASTER;
安装 MGR 插件

在三台服务器的MySQL控制台中,安装MGR插件,执行命令:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

在主服务器的MySQL控制台上,执行下述命令:

# 注意:只在主服务器上运行
# 我们在 primary.cnf 配置文件中把 group_replication_bootstrap_group 参数设置成 OFF
# 在 primary 服务器启动时并不会直接启动复制组,通过下面的命令动态的开启复制组是我们的集群更安全
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

出现问题请查看对应日志信息

cat /var/log/mysqld.log

确保SELinux是关闭的

在两个从服务器MySQL控制台上,执行下述命令:

# 指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="slave", MASTER_PASSWORD="123456" FOR CHANNEL 'group_replication_recovery';# 开启组网数据同步
START GROUP_REPLICATION;

当两个从节点都运行完毕后,运行下面SQL结果进行验证:

SELECT * FROM performance_schema.replication_group_members;

出现以下情况,每个节点都是ONLINE状态,说明集群搭建成功:

MySQL 组复制(Group Replication)要求 log_replica_updates 必须为 ON

MySQL 8.0 开始已经 弃用了 log_slave_updates,并推荐使用新的参数名log_replica_updates = ON

将 log-slave-updates = 1 替换为 log_replica_updates = ON

清除本地未同步事务(适用于非主节点)

==transaction 事务错误==

重置复制信息

RESET MASTER;
RESET SLAVE ALL;

重新加入组复制

START GROUP_REPLICATION;

MySQL MGR 故障转移

上面已经将MySQL MGR集群搭建完毕,并且节点都是ONLINE状态。

http://www.lqws.cn/news/123283.html

相关文章:

  • Android 颜色百分比对照
  • 国产化Word处理控件Spire.Doc教程:Java实现HTML 转Word自动化
  • 四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型
  • 测试面试题总结一
  • Hive终极性能优化指南:从原理到实战
  • linux shell脚本硬件定时检测通过邮箱警告管理人员
  • c++提升
  • 【计算机网络】网络层协议
  • skynet monitor线程的作用
  • 【学习笔记】TCP 与 UDP
  • go语言学习 第4章:流程控制
  • FFmpeg avformat_open_input函数分析
  • 量化Quantization初步之--带量化(QAT)的XOR异或pyTorch版250501
  • Hadoop大数据集群深度实践:源码分析、参数调优与自动化运维平台选型全解
  • 从 CLIP 和 Qwen2.5-VL 入门多模态技术
  • Spine交换机和Leaf交换机
  • 解决idea编译运行项目时间长的问题
  • ideal2022.3.1版本编译项目报java: OutOfMemoryError: insufficient memory
  • spel 多层list嵌套表达式踩坑记
  • 智能进化论:AI必须跨越的四大认知鸿沟
  • 【Python实战】零基础实战教程(三) 变量与数据类型
  • 《IDEA 高效开发:自定义类/方法注释模板详解》
  • Apache POI操作Excel详解
  • 完成一个可交互的k8s管理平台的页面开发
  • C++——智能指针 unique_ptr
  • 微信小程序动态组件加载的应用场景与实现方式
  • 3D动画在微信小程序的实现方法
  • Quipus系统的视频知识库的构建原理及使用
  • 让音乐“看得见”:使用 HTML + JavaScript 实现酷炫的音频可视化播放器
  • 英国2025年战略防御评估报告:网络与电磁域成现代战争核心