尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

详细介绍:MySQL高可用集群

详细介绍:MySQL高可用集群
📅 发布时间:2026/6/19 8:53:42

详细介绍:MySQL高可用集群

2025-10-05 10:17  tlnshuju  阅读(0)  评论(0)    收藏  举报

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

1 什么是MySQL高可用集群
  • MySQL高可用集群:MySQLInnoDBCluster
  • InnoDBCluster是MySQL官方实现高可用+读写分离的架构方案,包含以下组件
    • MySQLGroupReplication:简称MGR,是MySQL的主从同步高可用方案,包括数据同步和角色选举
    • MySQLShell是InnoDBCluster的管理工具,用来创建和管理集群
    • MySQLRouter是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离
  • MySQLInnoDBCluster架构图

  • InnoDBCluster将三个MySQL数据库实例构成一个高可用集群
  • 其中一个实例是具有读写能力的主成员
  • 其他两个实例是具有只读能力的次成员
  • 组复制将数据从主成员复制到次成员
  • MySQLRouter将连接读写端口的客户端请求转发到主成员,将连接到只读端口的客户端请求转发到次成员

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.2MySQL 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
  • mysqlclient连接路由
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端口测试读写

相关新闻

  • 最好的翻译论文网站
  • 这些行业软件你用过哪个
  • 提供远程服务

最新新闻

  • 面试被问“你的缺点是什么”,90%的应届生都答错了!(附满分话术)
  • Spring Cloud Alibaba 最佳实践:基于 Spring Boot 4.0 的完整微服务示例项目
  • 三步掌握AI斗地主:如何用DouZero智能助手提升你的游戏胜率
  • 2026山东大学项目实训个人博客(六)
  • DC/DC电源设计实战:从MIC261201选型到PCB布局与热管理全解析
  • 2026济南婚纱摄影选型全指南:行业标准、品牌梯队与合规避坑全解析 - 速递信息

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号