MySQL高可用集群
https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html
1 什么是MySQL高可用集群
- MySQL高可用集群:MySQL InnoDB Cluster
- InnoDB Cluster是MySQL官方实现高可用+读写分离的架构方案,包含以下组件
- MySQL Group Replication:简称MGR,是MySQL的主从同步高可用方案,包括数据同步和角色选举
- MySQL Shell是InnoDB Cluster的管理工具,用来创建和管理集群
- MySQL Router是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离
- MySQL InnoDB Cluster架构图
- InnoDB Cluster将三个MySQL数据库实例构成一个高可用集群
- 其中一个实例是具有读写能力的主成员
- 其他两个实例是具有只读能力的次成员
- 组复制将数据从主成员复制到次成员
- MySQL Router将连接读写端口的客户端请求转发到主成员,将连接到只读端口的客户端请求转发到次成员
2 搭建高可用集群示例
2.1 准备三个MySQL实例
2.2.1 准备MySQL实例20000
- 创建目录
mkdir -p /opt/mysql/20000/{data,log,tmp}
- 准备配置文件
vi /opt/mysql/20000/my.cnf[mysql]
#设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
port=20000
pid-file= /opt/mysql/20000/mysqld.pid
socket= /opt/mysql/20000/mysqld.sock
datadir= /opt/mysql/20000/data
log-error=/opt/mysql/20000/log/mysqld.log
tmpdir=/opt/mysql/20000/tmp
mysqlx-port=20010
mysqlx-socket=/opt/mysql/20000/mysqldx.sock
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#服务器唯一ID,默认是1
server-id=20000
#启用二进制日志
log-bin=mysql-bin
#最大连接数
max_connections=1000
#设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
user = mysql
#启用全局事务标识符(GTID)模式
gtid_mode=on
#强制GTID的一致性。这意味着在执行事务时,MySQL将确保所有涉及的服务器都使用相同的GTID集。
enforce_gtid_consistency=on
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64
- 初始化库
chown -R mysql:mysql /opt/mysql/20000
mysqld --defaults-file=/opt/mysql/20000/my.cnf --initialize
- 启库
mysqld --defaults-file=/opt/mysql/20000/my.cnf &
- 初始化密码
#查看临时密码
cat /opt/mysql/20000/log/mysqld.log|grep "A temporary password"
#登录
mysql -uroot -p'ji2m:aJ9K26y' --socket=/opt/mysql/20000/mysqld.sock
>ALTER USER 'root'@'localhost' identified by '123456';
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
flush privileges;
- 给root账号赋InnoDB Cluster 相关权限
mysql -uroot -p'123456' --socket=/opt/mysql/20000/mysqld.sock
>GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'root'@'%' WITH GRANT OPTION;GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'root'@'%' WITH GRANT OPTION;
2.2.2 复制实例20001
cp -rf /opt/mysql/20000 /opt/mysql/20001
sed -i "s#20000#20001#g" /opt/mysql/20001/my.cnf
sed -i "s#20010#20011#g" /opt/mysql/20001/my.cnf
rm -f /opt/mysql/20001/data/auto.cnf
chown -R mysql:mysql /opt/mysql/20001
mysqld --defaults-file=/opt/mysql/20001/my.cnf &
2.2.3 复制实例20002
cp -rf /opt/mysql/20000 /opt/mysql/20002
sed -i "s#20000#20002#g" /opt/mysql/20002/my.cnf
sed -i "s#20010#20012#g" /opt/mysql/20001/my.cnf
rm -f /opt/mysql/20002/data/auto.cnf
chown -R mysql:mysql /opt/mysql/20002
mysqld --defaults-file=/opt/mysql/20002/my.cnf &
2.2 MySQL Shell部署集群
2.2.1 安装MySQL Shell
MySQL :: Download MySQL Shell
2.2.2 MySQL Shell 集群相关常用命令
mysqlsh root@192.168.221.100:20000 --js
> dba.help(); --查看帮助文档? dba.deploySandboxInstance --查看具体操作的帮助文档
2.2.3 检测实例是否满足要求
mysqlsh root@192.168.221.100:20000 --js
> dba.checkInstanceConfiguration('root@192.168.221.100:20000');dba.checkInstanceConfiguration('root@192.168.221.100:20001');dba.checkInstanceConfiguration('root@192.168.221.100:20002');
返回ok表示验证通过
2.2.4 初始化InnoDB Cluster配置
mysqlsh root@192.168.221.100:20000 --js
> dba.configureInstance('root@192.168.221.100:20000');dba.configureInstance('root@192.168.221.100:20001');dba.configureInstance('root@192.168.221.100:20002');
2.2.5 使用主实例创建集群
- 创建集群
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.createCluster('myCluster');
- 创建集群后默认会将当前节点添加进集群,并作为主节点
- 默认创建单主模式集群
- 查看集群状态
mysqlsh root@192.168.221.100:20000 --js > var cluster = dba.getCluster('myCluster');cluster.status();
2.2.6 添加副本实例
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.addInstance('root@192.168.221.100:20001');cluster.addInstance('root@192.168.221.100:20002');cluster.status();
新添加进来的实例默认作为副本节点
2.3 InnoDB Cluster数据同步测试
- 主库20000添加数据
mysql -uroot -p'123456' --socket=/opt/mysql/20000/mysqld.sock
> create database test;use test;create table test (id int,name varchar(10));ALTER TABLE test ADD PRIMARY KEY id(id);insert into test values(1,'a'),(2,'b'),(3,'c');
- 从库20001查询数据
mysql -uroot -p'123456' --socket=/opt/mysql/20001/mysqld.sock
> use test;select * from test;
- 从库20002查询数据
mysql -uroot -p'123456' --socket=/opt/mysql/20002/mysqld.sock
> use test;select * from test;
2.4 InnoDB Cluster主从切换测试
- kill主库实例20000
- 查看组成员
mysql -uroot -p'123456' --socket=/opt/mysql/20001/mysqld.sock > SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;
- 查看集群状态
mysqlsh root@192.168.221.100:20001 --js > var cluster = dba.getCluster('myCluster');cluster.status();
2.5 MySQL Shell集群常见操作
2.5.1 参数配置
- 使用cluster.options()查看当前集群的配置属性
- 集群参数配置分为两种方式
- cluster.setOption()设置集群属性,所有节点的
- cluster.setInstanceOption()设置指定节点属性
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.setOption("memberWeight",50);#重新加入集群重试次数改为5次cluster.setOption("autoRejoinTries",5);#将其中一个节点的权重改为75
cluster.setInstanceOption("192.168.221.100:20001","memberWeight",75);#重新加入集群重试次数改为10次
cluster.setInstanceOption("192.168.221.100:20001","autoRejoinTries",10)
2.5.2 配置节点权重
- memberWeight选项的值域为0~100之间的整数,缺省值为50;
- 该值是故障转移时自动选举主节点的百分比权重
- 具有较高memberWeight值的实例更有可能在单主集群被选为主节点
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');#查看集群的参数配置cluster.options();#创建集群配置dba.createCluster('myCluster', {memberWeight:75});#添加实例时配置var cluster = dba.getCluster();cluster.addInstance('root@192.168.221.100:20001',{memberWeight:50});#集群创建完后修改配置
cluster.setInstanceOption('192.168.221.100:20000','memberWeight',100)
2.5.3 将节点重新加入集群
- 状态为missing的节点是组复制关闭或者中断
- 可使用cluster.rejionInstance()重新加入集群
- 会重新对该节点设置MGR相关参数
2.5.4 集群多数节点异常恢复
- 当集群多个节点异常,则失去了仲裁机制,无法选举出主节点
- 使用cluster.forceQuorumUsingPartitionOf将集群剥离为单节点运行
2.5.5 集群节点角色切换
- 单主模式指定主节点切换
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.setPrimaryInstance('192.168.221.100:20001');
- 单主模式切换为多主模式
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.switchToMultiPrimaryMode();
- 多主模式切换为单主模式
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');
cluster.switchToSinglePrimaryMode("192.168.221.100:20000")
2.5.6 销毁集群
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.dissolve();
2.5.7 创建集群管理用户
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.setupAdminAccount('test');
- 该操作会创建MySQL系统账号
- mysqlsh连接集群时也可使用该账号登录
2.6 MySQL Router连接集群
2.6.1 安装MySQL Router
MySQL :: Download MySQL Router
2.6.2 配置路由
mysqlrouter --bootstrap root@192.168.221.100:20000 --force --user=root
2.6.3 查看集群路由信息
mysqlsh root@192.168.221.100:20000 --js > var cluster = dba.getCluster('myCluster');cluster.listRouters();
2.6.4 启动路由
mysqlrouter &
2.6.5 通过路由连接MySQL
- mysql client连接路由
mysql -uroot -p123456 -P6446 -h192.168.221.100
- mysqlsh连接路由
mysqlsh root@192.168.221.100:6446 --sql
2.7 MySQL Router连接测试
- R/W端口测试读写
- R/O端口测试读写
- R/W Split端口测试读写
相关文章:

MySQL高可用集群
https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html 1 什么是MySQL高可用集群 MySQL高可用集群:MySQL InnoDB ClusterInnoDB Cluster是MySQL官方实现高可用读写分离的架构方案,包含以下组件 MySQL Group Replication:简…...

day14 leetcode-hot100-27(链表6)
21. 合并两个有序链表 - 力扣(LeetCode) 1. 暴力法 思路 创建一个空节点,用来组装这两个链表,谁小谁就是下一个节点。 知识 创建空节点:ListNode n1 new ListNode(-1); 具体代码 /*** Definition for singly-l…...

YOLOv5 :训练自己的数据集
- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 我们接着上一篇文章配置完YOLOv5需要的环境后&#…...

flutter项目迁移空安全
重中之重 备份好项目文件,甚至连已经加载好的flutter库也可以备份。环境包升级 2.1 不要直接换成flutter:3.0以上的版本,这样做既有基本的库兼容问题,又有空安全下的语法问题(整个项目中需要增加 late、?、!的语法错误,一片报错的…...
vue element日期范围选择器只能选择指定天数内的
<el-date-pickerv-model"dateRange"type"daterange"range-separator"至"start-placeholder"开始日期"end-placeholder"结束日期"format"yyyy-MM-dd"value-format"yyyy-MM-dd"clearable:picker-optio…...
从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)
五、RabbitMQ 工作原理全揭秘 在深入了解了 RabbitMQ 的核心组件之后,接下来让我们深入探究 RabbitMQ 的工作原理,揭开其在消息生产、投递、消费以及可靠性保障等方面的神秘面纱。 5.1 消息生产与投递流程 建立连接与信道:生产者首先通过 …...

MySql(十二)
目录 MySql约束 1.添加主键约束 语法格式 1)创建一个带主键的表 查看表结构 2)创建表的时候指定主键名称 查看表结构 3)创建一个表然后,然后再使用alter为列添加主键 查看表结构 4)为表添加数据 1---正常数据 2---主键…...

51c视觉~3D~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D时空中追踪万物!国防科大提出首个长时场景流估计方法 本篇分享 TPAMI 2025 论文SceneTracker: Long-term Scene Flow Estimation Network,国防科大提出首…...
windows11安装编译QtMvvm
windows11安装编译QtMvvm 1 从github下载代码2 官方的Download/Installtion3 自行构建编译QtMvvm遇到的问题3.1 `qmake`问题执行命令报错原因分析qmake报错:找不到编译器 cl解决方案3.2 `make qmake_all`问题执行命令报错原因分析make命令未识别解决方案3.3 缺少`perl`问题执行…...

【2025年电工杯数学建模竞赛A题】光伏电站发电功率日前预测问题+完整思路+paper+源码
本人7年数学建模竞赛经验,历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博,有需要数模竞赛帮助的可以私信我 本题主要涉及数据预测,数据分析,机器学习,时间序列等知识 1.问题背景与问题描述 2.解题思路分析 …...

OpenCv高阶(十九)——dlib关键点定位
文章目录 一、什么是人脸关键点定位?二、关键点模型的下载及关键信息的理解三、dlib关键点定位的简单实现(1)导入必要的库(2)从指定路径读取图像文件(3)创建dlib的正面人脸检测器对象࿰…...

BUUCTF之[ACTF2020 新生赛]BackupFile
打开环境就一句话 找出源文件! 结合题目名字:BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…...

头歌之动手学人工智能-Pytorch 之autograd
目录 第1关:Variable 任务描述 编程要求 测试说明 没有伟大的愿望,就没有伟大的天才。——巴尔扎克开始你的任务吧,祝你成功! 第2关:Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…...
OIer常用的软件
前言 现在许多软件的官网多不好找,所以我今天就将常用的一些软件官网地址翻了出来,并简单介绍了他的用法。 正文 1.DEV-C DEV-C 用途:c编译软件,是OIer的生涯之路的必备软件 2.Katex KATex 用途:展现公式的软件&…...
Centos7.x内网环境Jenkins前端打包环境配置
Centos7.x内网环境Jenkins前端打包环境配置 参考地址: https://www.cnblogs.com/guangdelw/p/18763336 https://2048.csdn.net/682c1be8606a8318e857d687.html 前言:环境描述和目标 最近公司新接了一个项目,要求是:需要再桌面…...

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot
Kafka集成Flume Flume生产者 ③、安装Flume,上传apache-flume的压缩包.tar.gz到Linux系统的software,并解压到/opt/module目录下,并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…...

Scratch节日 | 拯救屈原 | 端午节
端午节快乐! 这款特别为端午节打造的Scratch游戏 《拯救屈原》,将带你走进古代中国,感受历史与文化的魅力! 🏮 游戏介绍 扮演勇敢的探险者,穿越时空回到古代,解锁谜题,完成任务&…...

rabbitmq Direct交换机简介
在实际开发中,需求可能变得复杂,如消息的收发和处理。以支付系统为例,成功支付后需要改变订单状态并通知用户,而失败则不需要。为处理这种情况,提出了使用Direct交换机,它可以根据规则将消息路由到指定队列…...

Git实战--基于已有分支克隆进行项目开发的完整流程
Git克隆项目开发流程 ✅ 一、完整流程概述✅ 二、详细操作步骤Step 1:克隆仓库(如果尚未克隆)Step 2:获取远程分支信息并切换到 feature/ 获取所有远程分支Step 3:创建并切换到你的新分支Step 4:开始开发新…...
MapReduce(期末速成版)
起初在B站看3分钟的速成视频,感觉很多细节没听懂。 具体例子解析(文件内容去重) 对于两个输入文件,即文件A 和文件B,请编写MapReduce 程序,对两个文件进行合并,并剔除 其中重复的内容,得到一个新的输出文件…...
鸿蒙OSUniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器#三方框架 #Uniapp
UniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器 在移动互联网时代,直播已经成为一种主流的内容形式。本文将详细介绍如何使用 UniApp 框架开发一个优雅的直播流播放器,并融入鸿蒙系统的设计理念,实现一个既美观又实用…...

C3、C2f、C3K2、C2PSA的具体结构
YOLOV5 C3 Bottleneck C2f...

2_MCU开发环境搭建-配置MDK兼容Keil4和C51
MCU开发环境搭建-配置MDK兼容Keil4和C51 一、概述 本文以MDK-ARM V5.36版本基础介绍DMK-ARM工程兼容Keil4和C51的配置。 注:在阅读本文前,请先安装和配置完成MDK-ARM(Keil5)。 二、工具包下载 链接: https://pan.baidu.com/s/1Tu2tDD6zRra4xb_PuA1Wsw 提取码: 81pp 三、…...

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?
本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…...

百度golang研发一面面经
输入一个网址,到显示界面,中间的过程是怎样的 IP 报文段的结构是什么 Innodb 的底层结构 知道几种设计模式 工厂模式 简单工厂模式:根据传入类型参数判断创建哪种类型对象工厂方法模式:由子类决定实例化哪个类抽象工厂模式&#…...

TC3xx学习笔记-启动过程详解(一)
文章目录 前言Firmware启动过程BMHD Check流程ABM启动Internal Flash启动Bootloader ModeProcessing in case no valid BMHD foundProcessing in case no Boot Mode configured by SSW 总结 前言 之前介绍过UCB BMHD的使用,它在启动过程中起着重要的作用࿰…...

Scratch节日 | 六一儿童节抓糖果
六一儿童节怎么能没有糖果?这款 六一儿童节抓糖果 小游戏,让你变身小猫,开启一场甜蜜大作战! 🎮 游戏玩法 帮助小猫收集所有丢失的糖果,收集越多分数越高! 小心虫子一样的“坏糖果”ÿ…...
系统调用与程序接口的关系
程序接口类型 系统调用:是操作系统提供给应用程序的接口 ,允许应用程序请求操作系统执行特定操作,像文件操作(打开、读写、关闭文件 )、进程管理(创建、终止进程 )、设备管理(操作磁…...
从线性方程组角度理解公式 s=n−r(3E−A)
从线性方程组角度理解公式 sn−r(3E−A) 这个公式本质上是 齐次线性方程组解空间维度 的直接体现。下面通过三个关键步骤解释其在线性方程组中的含义: 1. 公式对应的线性方程组 考虑矩阵方程: (3E−A)x0 其中: x 是 n 维未知向量3E−…...

通信算法之280:无人机侦测模块知识框架思维导图
1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计...