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

8.2 新特性 - 透明的读写分离

文章目录

    • 前言
    • 1. 安装部署
      • 1.1 下载安装包
      • 1.2 MySQL Shell
      • 1.3 配置 MySQL 实例
      • 1.4 启动 ReplicaSet
      • 1.5 启动 8.2 Router
    • 2. 测试路由
    • 总结

前言

MySQL 8.0 官方推出过一个高可用方案 ReplicaSet 主要由 Router、MySQL Shell、MySQL Server 三个组件组成。

MySQL Shell 负责管理 ReplicaSet 包括部署、切换、节点加入等,都可以通过内置 AdminAPI 自动化完成。

MySQL Router 是一款轻量级中间件,可在应用程序和 ReplicaSet 之间提供透明路由和读写分离功能。
在这里插入图片描述
8.0 时期的 Router 读写需要配置两个端口,应用如果想要使用读写分离的特性,需要额外适配。

-- MySQL 经典协议
- Read/Write Connections: localhost:6446, /data/myrouter/mysql.sock
- Read/Only Connections:  localhost:6447, /data/myrouter/mysqlro.sock-- MySQL X 协议
- Read/Write Connections: localhost:6448, /data/myrouter/mysqlx.sock
- Read/Only Connections:  localhost:6449, /data/myrouter/mysqlxro.sock

到了 MySQL 8.2 版本 Router 自动可以识别读取和写入,按照配置规则分配到不同的实例,无需使用额外端口。

1. 安装部署

让我们一起从 0 部署一套 MySQL 8.2 ReplicaSet 集群吧 !

  • 系统版本:CentOS Linux release 7.8.2003 (Core)
  • MySQL Server:8.0.32
IPhostnameRole
172.16.104.56172-16-104-56Master
172.16.104.57172-16-104-56Secondary
vi /etc/hosts
172.16.104.56 172-16-104-56
172.16.104.57 172-16-104-57

1.1 下载安装包

MySQL 官网下载地址:https://downloads.mysql.com/archives/community

在这里插入图片描述
压缩包里面包含 MySQL Server 和 MySQL Router 组件。安装 MySQL Server 步骤参考下文👇

MySQL 部署:MySQL 自动化安装部署

1.2 MySQL Shell

官方下载地址:MySQL Shell download

mv mysql-shell-8.0.31-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
export PATH=/usr/local/mysqlsh/bin/:$PATH
echo 'PATH=$PATH:/usr/local/mysqlsh/bin/' >> /etc/profile

进入 MySQL Shell 使用 \py & \js 可以切换命令模式,本篇文章使用 python 模式演示:
在这里插入图片描述

1.3 配置 MySQL 实例

部署好 MySQL 实例后,需要创建一个用户,提供给 MySQL Shell 使用,这里演示创建的用户是:rw_shell

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 'rw_shell'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'rw_shell'@'%' 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 'rw_shell'@'%' 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 'rw_shell'@'%' 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 'rw_shell'@'%' WITH GRANT OPTION;

配置 MySQL 实例,检查是否符合创建 ReplicaSet 的条件,如果发现需要修改的地方,就会提示确认修改。
执行次命令会让用户输入密码,保存后会进入检查阶段。

dba.configure_replica_set_instance('rw_shell@172-16-104-55:3306', {"clusterAdmin": "rw_shell@'%'"})
dba.configure_replica_set_instance('rw_shell@172-16-104-56:3306', {"clusterAdmin": "rw_shell@'%'"})

MySQL Shell 会检查数据库参数是否满足创建 ReplicaSet 条件,并提出修改建议:
在这里插入图片描述
此阶段执行完成后,表示实例都具备组成 ReplicaSet 条件,可进入下一步。

1.4 启动 ReplicaSet

使用 MySQL Shell 连接到主实例,否则测试中会报 session 错误。

An open session is required to perform this operation.

\c rw_shell@172-16-104-56:3306

创建 ReplicaSet 默认当前进入的实例为主库实例:

rs = dba.create_replica_set("prd_op_service")

添加复制节点:

rs.add_instance("172-16-104-57:3306")

至此,ReplicaSet 已配置完成,下图为拓扑信息:

{"replicaSet": {"name": "prd_op_service", "primary": "172-16-104-56:3306", "status": "AVAILABLE", "statusText": "All instances available.", "topology": {"172-16-104-56:3306": {"address": "172-16-104-56:3306", "instanceRole": "PRIMARY", "mode": "R/W", "status": "ONLINE"}, "172-16-104-57:3306": {"address": "172-16-104-57:3306", "instanceRole": "SECONDARY", "mode": "R/O", "replication": {"applierStatus": "APPLIED_ALL", "applierThreadState": "Waiting for an event from Coordinator", "applierWorkerThreads": 4, "receiverStatus": "ON", "receiverThreadState": "Waiting for source to send event", "replicationLag": null, "replicationSsl": "TLS_AES_128_GCM_SHA256 TLSv1.3", "replicationSslMode": "REQUIRED"}, "status": "ONLINE"}}, "type": "ASYNC"}
}

1.5 启动 8.2 Router

解压二进制包,开箱即用。

xz -d mysql-router-8.2.0-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-router-8.2.0-linux-glibc2.12-x86_64.tar

创建 router 专用用户:

rs.setup_router_account('op_router')

更新 router 配置信息:

./mysqlrouter \--bootstrap rw_shell@172-16-104-56:3306 \--directory /data/myrouter \--conf-use-sockets \--account op_router \--user=root

此时 Router 输出的配置信息:

After this MySQL Router has been started with the generated configuration$ ./mysqlrouter -c /data/myrouter/mysqlrouter.confInnoDB ReplicaSet 'prd_op_service' can be reached by connecting to:## MySQL Classic protocol- Read/Write Connections: localhost:6446, /data/myrouter/mysql.sock
- Read/Only Connections:  localhost:6447, /data/myrouter/mysqlro.sock
- Read/Write Split Connections: localhost:6450, /data/myrouter/mysqlsplit.sock## MySQL X protocol- Read/Write Connections: localhost:6448, /data/myrouter/mysqlx.sock
- Read/Only Connections:  localhost:6449, /data/myrouter/mysqlxro.sock

从输出结果看,相比于之前的版本,多了一个 6450 端口。

启动 mysqlrouter 服务:

./mysqlrouter -c /data/myrouter/mysqlrouter.conf &

2. 测试路由

使用 6450 端口连接 MySQL:

mysql -urw_shell -P6450 -h172.16.104.56 -p
rw_shell@mysql 17:21:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-57 |
+---------------+
1 row in set (0.01 sec)rw_shell@mysql 17:22:  [(none)]>begin;
Query OK, 0 rows affected (0.01 sec)rw_shell@mysql 17:22:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-56 |
+---------------+
1 row in set (0.01 sec)rw_shell@mysql 17:22:  [(none)]>commit;
Query OK, 0 rows affected (0.00 sec)rw_shell@mysql 17:22:  [(none)]>
rw_shell@mysql 17:22:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-57 |
+---------------+
1 row in set (0.01 sec)

从上面的实验,我们可以看到,默认情况下,如果执行读取操作,我们将到达复制节点,但如果启动事务,我们将到主节点,而无需更改端口并使用相同的连接。

rw_shell@mysql 17:25:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-57 |
+---------------+
1 row in set (0.01 sec)rw_shell@mysql 17:25:  [(none)]>start transaction read only;
Query OK, 0 rows affected (0.02 sec)rw_shell@mysql 17:26:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-57 |
+---------------+
1 row in set (0.01 sec)

启动事务类型为只读事务的话,也会直接到复制节点。

rw_shell@mysql 17:32:  [(none)]>ROUTER SET access_mode='read_only';
Query OK, 0 rows affected (0.00 sec)rw_shell@mysql 17:32:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-57 |
+---------------+
1 row in set (0.02 sec)rw_shell@mysql 17:33:  [(none)]>ROUTER SET access_mode='read_write';
Query OK, 0 rows affected (0.00 sec)rw_shell@mysql 17:33:  [(none)]>select @@hostname;
+---------------+
| @@hostname    |
+---------------+
| 172-16-104-56 |
+---------------+
1 row in set (0.02 sec)

可以通过 ROUTER SET 语句,定义接下来 SQL 访问类型。

总结

MySQL 8.2 版本的 router 读写分离支持使用一个端口,无需业务适应更改,是一项非常很有价值的功能,可以优化数据库性能和可扩展性,而无需对应用程序进行任何更改。

参考资料:https://lefred.be/content/mysql-8-2-transparent-read-write-splitting/

相关文章:

8.2 新特性 - 透明的读写分离

文章目录 前言1. 安装部署1.1 下载安装包1.2 MySQL Shell1.3 配置 MySQL 实例1.4 启动 ReplicaSet1.5 启动 8.2 Router 2. 测试路由总结 前言 MySQL 8.0 官方推出过一个高可用方案 ReplicaSet 主要由 Router、MySQL Shell、MySQL Server 三个组件组成。 MySQL Shell 负责管理…...

关于三维GIS开发成长路线的一些思考

三维GIS是将GIS三维化表达,从一个三维GIS开发门外汉的角度来看,三维GIS开发成长路线分几个层面: 第一层面 做三维开发,最基本的Cesium、ThreeJS、MapBox这些要能做到接口级熟悉,熟悉接口是用来干嘛的,接口…...

git操作---> 使用git push,和使用git push origin HEAD:[分支名]有什么区别呢?

git push origin HEAD:branch2: 这个命令显式地指定了你要推送的本地引用(HEAD),以及远程仓库的目标引用(origin/branch2)。 HEAD 是一个引用,指向你当前所在的本地分支的最新提交。 这个命令的意图是将当…...

基于Java的大学社团管理平台

功能介绍 平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括:首页、社团详情、申请加入、用户中心模块。后台功能包括:社团管理、分类管理…...

1.函数模板基础

1.1函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体指定&#xff0c;用一个虚拟的类型来代表&#xff0c;提高复用性 1.2语法&#xff1a; //第一种 template <typename T> 函数声明或定义//第二种 template <class T&…...

22-k8s中pod的调度-亲和性affinity

一、概述 在k8s当中&#xff0c;“亲和性”分为三种&#xff0c;节点亲和性、pod亲和性、pod反亲和性&#xff1b; 亲和性分类名称解释说明nodeAffinity节点亲和性通过【节点】标签匹配&#xff0c;用于控制pod调度到哪些node节点上&#xff0c;以及不能调度到哪些node节点上&…...

通俗易懂,Spring Bean生命周期管理的理解

目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中&#xff0c;Bean是最基本的组件&#xff0c;它是Spring框架中的一个Java对象。 下面通过Bean来理解bean的生命周期&#xff1a; Bean(initMethod "customInit", destroyMethod "cust…...

找座位 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,在不移动现有观众座位…...

npm run dev运行出现NODE_OPTIONS=--max_old_space_size=4096 vite --mode dev --host?

问题描述 PS E:\AWorkDataease\DataEase\core\core-frontend> npm run dev dataease0.0.0 dev NODE_OPTIONS–max_old_space_size4096 vite --mode dev --host 0.0.0.0 ‘NODE_OPTIONS’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决方案 遇到…...

钠离子电池技术

一、什么是钠离子电池 1、发展背景 在现有电池技术中&#xff0c;锂离子电池&#xff08;LIB&#xff09;具有无与伦比的能量密度和多功能性。自其首次商业化以来&#xff0c;便携式设备一直在推动其高速增长。近年&#xff0c;电动汽车和固定式储能应用开始兴起。由于锂离子…...

第三十六天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

Leetcode 435. 无重叠区间 题目链接&#xff1a;435 无重叠区间 题干&#xff1a;给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 思考&#xff1a;贪心法。和452 用最少数量的…...

React setState同步还是异步

React18 setState是同步还是异步&#xff1f;_react18 同步-CSDN博客 React18之前或者React18使用了ReactDOM.render&#xff0c;setState在React调度流程中是异步更新&#xff0c;在原生事件和setTimeout中是同步更新。React18使用ReactDOM.createRoot&#xff0c;那么默认都是…...

Docker安装和使用Redis

Docker安装和使用Redis 一、拉取 Redis 镜像二、根据镜像运行容器三、配置 Redis 密码1、进入 redis 容器内部2、使用 redis 命令行设置密码 一、拉取 Redis 镜像 docker pull redis二、根据镜像运行容器 docker run \ --name redis \-p 6379:6379 \-d \redis \redis-server …...

四分位距IQR_ interquartile range

四分位距IQR_ interquartile range 1 IQR&#xff08;Interquartile Range&#xff09;四分位距的含义2 如何计算IQR参考&#xff1a; 1 IQR&#xff08;Interquartile Range&#xff09;四分位距的含义 官方定义&#xff1a; 四分位距&#xff08;interquartile range, IQR&a…...

Vision Transformer - VIT

文章目录 1. Embedding层2. Encoder层3. MLP Head层4. Hybrid混合模型 论文&#xff1a;An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 网址&#xff1a;https://arxiv.org/abs/2010.11929 Hybrid - 传统CNN和Transformer混合模型 模型架构 输…...

HTTP与HTTPS:网络安全之门户

源码分享 ​​https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2​​ 在进行网页爬取和数据收集时&#xff0c;我们经常会与HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全的超文本传输协议&#xff09;打交道。这两种协议都用于互联网上的数据传…...

头歌:共享单车之数据分析

第1关 统计共享单车每天的平均使用时间 package com.educoder.bigData.sharedbicycle;import java.io.IOException; import java.text.ParseException; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java…...

MySQL的数据类型和细节

1.整型 数值类型字节描述TINYINT[UNSIGNED]1很小的整数&#xff0c;默认有符号 [-128,127]/[0,255]SMALLINT[UNSIGNED]2较小的整数&#xff0c;默认有符号 [-32768,32767]/[0,65535]MEDIUMINT[UNSIGNED]3中等的整数&#xff0c;默认有符号 [-8388608,8388607]/[0,16777215]…...

自建AWS S3存储服务

unsetunset前言unsetunset AWS S3&#xff08;Amazon S3&#xff0c;全名为亚马逊简易存储服务&#xff09;&#xff0c;是亚马逊公司利用其亚马逊网络服务系统所提供的网络在线存储服务。我常用的很多SaaS服务中提供的文件存储功能&#xff0c;底层也都是AWS S3&#xff0c;比…...

『论文阅读|研究用于视障人士户外障碍物检测的 YOLO 模型』

研究用于视障人士户外障碍物检测的 YOLO 模型 摘要1 引言2 相关工作2.1 障碍物检测的相关工作2.2 物体检测和其他基于CNN的模型 3 问题的提出4 方法4.1 YOLO4.2 YOLOv54.3 YOLOv64.4 YOLOv74.5 YOLOv84.6 YOLO-NAS 5 实验和结果5.1 数据集和预处理5.2 训练和实现细节5.3 性能指…...

taotoken模型广场如何帮助开发者根据任务需求选择合适大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken模型广场如何帮助开发者根据任务需求选择合适大模型 面对市场上众多的大语言模型&#xff0c;开发者常常陷入选择困境&…...

AI Agent如何在毫秒级边缘设备上自主决策?揭秘轻量化推理框架与动态资源调度的7个关键技术突破

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI Agent边缘计算应用的范式演进 随着终端设备算力持续增强与轻量化模型技术日趋成熟&#xff0c;AI Agent不再仅依赖云端协同执行决策任务&#xff0c;而是逐步下沉至网络边缘&#xff0c;形成具备感知、推理…...

掌握AI写教材方法,低查重工具让教材编写变得如此简单!

许多教材编写者常感到失落&#xff0c;因为经过反复琢磨的教材内容&#xff0c;在缺乏相应的辅助资源时&#xff0c;教学效果往往大打折扣。课后练习的题型设计需要有层次感&#xff0c;但往往缺乏创新灵感&#xff1b;想要制作出直观的教学课件&#xff0c;却没有技术来实现&a…...

用一块老芯片玩转计数器:手把手教你用74390与非门搭一个24小时制时钟电路

用一块老芯片玩转计数器&#xff1a;手把手教你用74390与非门搭一个24小时制时钟电路 记得大学时第一次在实验室看到LED数字管跳动的那种兴奋感吗&#xff1f;那种从抽象理论到具象显示的魔法时刻&#xff0c;正是电子设计的魅力所在。今天我们就用上世纪70年代诞生的74390这块…...

3分钟学会:免费歌词制作工具让你轻松成为音乐剪辑高手 [特殊字符]

3分钟学会&#xff1a;免费歌词制作工具让你轻松成为音乐剪辑高手 &#x1f3b5; 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 你是否曾经想为自己喜欢的歌曲制作…...

HS2-HF_Patch终极指南:如何快速获得完整汉化与去码体验

HS2-HF_Patch终极指南&#xff1a;如何快速获得完整汉化与去码体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是《Honey Select 2》游戏的全功…...

在fnOS飞牛NAS上部署宝塔+NocoBase低(零)代码平台的方法

在fnOS飞牛NAS上部署宝塔NocoBase低&#xff08;零&#xff09;代码平台的方法 温馨提醒&#xff1a;本文全文免费&#xff0c;严禁盗用、二次收费行为&#xff01; 更新日志&#xff1a; 2026/03/29 首次发布 2026/05/22 1、新增通过systemd托管进程&#xff0c;实现重启后自…...

RDP Wrapper终极指南:Windows家庭版开启多用户远程桌面的完整解决方案

RDP Wrapper终极指南&#xff1a;Windows家庭版开启多用户远程桌面的完整解决方案 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap RDP Wrapper Library是一款让Windows家庭版支持多用户远程桌面连接的革命性工具&a…...

5分钟掌握Excel MCP Server:无需安装Excel的终极数据处理方案

5分钟掌握Excel MCP Server&#xff1a;无需安装Excel的终极数据处理方案 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server 在数据驱动的现代工作中&…...

Java 读写 Excel 公式:从基础到高级的实战总结

做数据处理的朋友应该都遇到过这种场景&#xff1a;需要批量生成带公式的Excel报表&#xff0c;或者读取现有表格中的公式进行二次计算。以前我都是手动在Excel里写公式&#xff0c;后来发现用Java代码来处理更高效&#xff0c;尤其是数据量大的时候。 今天整理一下平时用得比较…...