MySQL高可用集群

article/2025/7/15 20:22:46

https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html

1 什么是MySQL高可用集群
  • MySQL高可用集群MySQL InnoDB Cluster
  • InnoDB ClusterMySQL官方实现高可用+读写分离架构方案包含以下组件
    • MySQL Group Replication简称MGRMySQL主从同步高可用方案包括数据同步角色选举
    • MySQL ShellInnoDB 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端口测试读写


http://www.hkcw.cn/article/ZcEFPYvFmg.shtml

相关文章

山洪灾害声光电监测预警解决方案

一、方案背景 我国是一个多山的国家,山丘区面积约占国土面积的三分之二。每年汛期,受暴雨等因素影响,极易引发山洪和泥石流。山洪、泥石流地质灾害具有突发性、流速快、流量大、物质容量大和破坏力强等特点,一旦发生,将…

2025年最新工程项目管理系统应该具备哪些模块?

随着数字化转型浪潮席卷工程行业,工程项目管理系统的作用愈发凸显。2025年,工程项目管理系统的核心目标不仅是提升项目效率,更在于通过智能化、集成化技术实现全生命周期的精细化管理。基于行业趋势和企业实际需求,结合金众诚工程…

unity入门:同一文本不同颜色显示

unity入门:同一文本不同颜色显示 同一文本不同颜色显示#RRGGBBAA(带透明度)用法 同一文本不同颜色显示 在Unity中,如果想让文本中的某一部分显示不同的颜色,可以使用富文本(Rich Text)标记,在字符串中插入…

128、STM32H723ZGT6实现串口IAP

Bootloader程序通过串口接收*.bin文件数据,写入到内部flash区域,然后跳转APP应用程序 flash读写数据参考我的博客:127、stm32h743XI内部flash 注意:H723系列flash必须32字节写入,并且擦除时别重启|断电,不然…

【Netty系列】Reactor 模式 2

目录 流程图说明 关键流程 以下是 Reactor 模式流程图,结合 Netty 的主从多线程模型,帮助你直观理解事件驱动和线程分工: 流程图说明 Clients(客户端) 多个客户端(Client 1~N)向服务端发起连…

接口自动化测试用例的编写方法

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 phpunit 接口自动化测试系列 Post接口自动化测试用例 Post方式的接口是上传接口,需要对接口头部进行封装,所以没有办法在浏览器下直接调…

2025030给荣品PRO-RK3566开发板单独升级Android13的boot.img

./build.sh init ./build.sh -K ./build.sh kernel 【导入配置文件】 Z:\Android13.0\rockdev\Image-rk3566_t\config.cfg 【更新的内核】 Z:\Android13.0\rockdev\Image-rk3566_t\boot.img 【导入分区表,使用原始的config.cfg会出错的^_】 Z:\Android13.0\rockdev\…

伊拉克军方打死6名“伊斯兰国”武装分子

△伊拉克联合行动指挥部发布视频截图当地时间5月30日,伊拉克联合行动指挥部下属安全媒体中心发表声明称,29日晚至30日早间,伊军方出动战机对位于该国北部萨拉赫丁省沙伊谷地的极端组织“伊斯兰国”武装分子藏匿点发动空袭,打死了6名武装分子,并摧毁其藏匿点。(总台记者 米…

Python打卡训练营Day40

DAY 40 训练和测试的规范写法 知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业&#x…

Haproxy搭建web群集

目录 一:Haproxy 1.Haproxy常见的调度算法 二:环境案例 1.配置web主机 2.配置haproxy主机 3.Haproxy日志 一:Haproxy Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如 LVS 和 Nginx。相比较而言&#…

ansible自动化playbook简单实践

方法一:部分使用ansible 基于现有的nginx配置文件,定制部署nginx软件,将我们的知识进行整合 定制要求: 启动用户:nginx-test,uid是82,系统用户,不能登录 启动端口82 web项目根目录/…

一句话开发Chrome摸鱼插件

本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴。 CodeBuddy 一、CodeBuddy新功能特色 Craft智能体:自然语言驱动的全栈开发引擎Craft开发智能体的核心突破在于实现需求理解-任务拆解-代码生成的…

2024PLM系统实施案例:天水天轲零部件

一、行业背景与中小企业的现实挑战 汽车零部件行业竞争激烈,中小企业普遍面临研发周期长、数据管理混乱、供应链协同效率低等问题。天水天轲零部件作为一家年产值约700万元的小型制造企业,其痛点具有行业典型性: 研发数据分散&#xff1a…

Linux(8)——进程(控制篇——上)

目录 ​编辑 一、进程创建 1.fork函数的回顾 2.fork的返回值 3.写时拷贝 4.fork的常规用法 5.fork调用失败的原因 二、进程终止 1.进程退出的场景 2.进程常见的退出方法 3.进程退出码 4.进程正常退出 1)_exit函数 2)exit函数 3&#xff…

万亿小吃市场背后:冷链配送如何破解连锁门店“到店难题”?

在餐饮行业连锁化率突破23%、小吃快餐品类占据连锁门店半壁江山的今天,冷链配送已成为支撑品牌扩张的隐形基础设施。从田间到餐桌,从中央厨房到终端门店,冷链物流的每一次温度波动都直接关联着消费者的味蕾体验与品牌口碑。本文将解析冷链配送…

基于Java+MySQL 实现(Web)企业信息展示系统

基于java web企业信息展示系统设计和实现 摘要 随着企业经营环境的不断变化和竞争的口益加剧,企业经营管理水平的提高已成当务之急,人力资源管理作为企业管理中最重要的部分,其水平的高低已成企业发展的关键因素。随着计算机技术特别是互联…

11.2 java语言执行浅析3美团面试追魂七连问

美团面试追魂七连问:关于Object o New Object() ,1请解释一下对象的创建过程(半初始化) 2,加问DCL要不要volatile 问题(指令重排) 3.对象在内存中的存储布局(对象与数组的存储不同),4.对象头具体包括什么.5.对象怎么定位.6.对象怎么分配(栈-线程本地-Eden-Old)7.在…

SpringBoot+Vue+微信小程序校园自助打印系统

概述​​ 校园自助打印系统是现代化校园建设中不可或缺的一部分,基于SpringBootVue微信小程序开发的​​免费Java源码​​项目,包含完整的用户预约、打印店管理等功能模块。 ​​主要内容​​ ​​ 系统功能模块​​ ​​登录验证模块​​:…

特伦斯 S75 电钢琴:奏响极致音乐体验的华丽乐章

在音乐爱好者增多、音乐教育普及,以及科技进步的推动下,电钢琴市场蓬勃发展。其在技术、品质和应用场景上变化巨大,高端化、个性化产品受青睐,应用场景愈发多元。在此背景下,特伦斯 S75 电钢琴以卓越性能和独特设计&am…

OpenCV---pointPolygonTest

一、基本概念与用途 pointPolygonTest 是 OpenCV 中用于判断点与多边形关系的重要函数,常用于: 目标检测:判断像素点是否属于检测到的轮廓区域碰撞检测:检测物体是否重叠图像分割:确定点是否在分割区域内几何分析&am…