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
IP | hostname | Role |
---|---|---|
172.16.104.56 | 172-16-104-56 | Master |
172.16.104.57 | 172-16-104-56 | Secondary |
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函数模板作用: 建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表,提高复用性 1.2语法: //第一种 template <typename T> 函数声明或定义//第二种 template <class T&…...

22-k8s中pod的调度-亲和性affinity
一、概述 在k8s当中,“亲和性”分为三种,节点亲和性、pod亲和性、pod反亲和性; 亲和性分类名称解释说明nodeAffinity节点亲和性通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上&…...
通俗易懂,Spring Bean生命周期管理的理解
目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中,Bean是最基本的组件,它是Spring框架中的一个Java对象。 下面通过Bean来理解bean的生命周期: 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’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决方案 遇到…...

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

第三十六天| 435. 无重叠区间、763.划分字母区间、56. 合并区间
Leetcode 435. 无重叠区间 题目链接:435 无重叠区间 题干:给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 思考:贪心法。和452 用最少数量的…...
React setState同步还是异步
React18 setState是同步还是异步?_react18 同步-CSDN博客 React18之前或者React18使用了ReactDOM.render,setState在React调度流程中是异步更新,在原生事件和setTimeout中是同步更新。React18使用ReactDOM.createRoot,那么默认都是…...
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(Interquartile Range)四分位距的含义2 如何计算IQR参考: 1 IQR(Interquartile Range)四分位距的含义 官方定义: 四分位距(interquartile range, IQR&a…...

Vision Transformer - VIT
文章目录 1. Embedding层2. Encoder层3. MLP Head层4. Hybrid混合模型 论文:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 网址:https://arxiv.org/abs/2010.11929 Hybrid - 传统CNN和Transformer混合模型 模型架构 输…...
HTTP与HTTPS:网络安全之门户
源码分享 https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2 在进行网页爬取和数据收集时,我们经常会与HTTP(超文本传输协议)和HTTPS(安全的超文本传输协议)打交道。这两种协议都用于互联网上的数据传…...
头歌:共享单车之数据分析
第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很小的整数,默认有符号 [-128,127]/[0,255]SMALLINT[UNSIGNED]2较小的整数,默认有符号 [-32768,32767]/[0,65535]MEDIUMINT[UNSIGNED]3中等的整数,默认有符号 [-8388608,8388607]/[0,16777215]…...

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

『论文阅读|研究用于视障人士户外障碍物检测的 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 性能指…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...