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.conf

InnoDB 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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/397158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

第四篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:pyttsx3自动化脚本经典案例

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、雏形示例代码二、扩展思路介绍三、批量处理文本示例代码四、自定义语音设置示例代码五、结合其他库和API示例代码六、语音交互系统示例代码七、多语言支持示例代码八、添加…

c#,dotnet, DataMatrix 类型二维码深度识别,OCR,(基于 Halcon)

代码中部分调用的 c 函数参数,具体说明自行研究~(我也是参考的其他资源,还没研究透彻) 例如:HOperatorSet.GenRectangle2() , 2000, 2000, 0, 2000, 2000 这些数字应该是选取的图片解析范围、尺寸&#xff…

如何利用Idea创建一个Servlet项目(新手向)

💕"Echo"💕 作者:Mylvzi 文章主要内容:如何利用Idea创建一个Servlet项目(新手向) Servlet是tomcat的api,利用Servlet进行webapp开发很方便,本文将介绍如何通过Idea创建一个Servlet项目(一共分为七步,这可能是我们写过的…

数据结构-最短路径(Dijkstra算法与Floyd算法)

介绍 对于网图来说,最短路径是指两顶点之间经过的边上权值之和最少的路径,其路径上第一个点记为源点,最后一个为终点。 计算最短路径有两个经典算法,即迪杰斯特拉(Dijkstra)算法与弗洛伊德(Fl…

【医学大模型】Text2MDT :从医学指南中,构建医学决策树

Text2MDT :从医学指南中,构建医学决策树 提出背景Text2MDT 逻辑Text2MDT 实现框架管道化框架端到端框架 效果 提出背景 论文:https://arxiv.org/pdf/2401.02034.pdf 代码:https://github.com/michael-wzhu/text2dt 假设我们有一…

设计模式三:工厂模式

工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式,其中后两者属于23中设计模式 各种模式中共同用到的实体对象类: //汽车类:宝马X3/X5/X7;发动机类:B48TU、B48//宝马汽车接口 public interface BMWCar {void s…

代码随想录算法训练营第三七天 | 单调递增的数字、监控二叉树

目录 单调递增的数字监控二叉树 LeetCode 738.单调递增的数字 LeetCode 968.监控二叉树 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xf…

Linux CentOS stream 9 firewalld

随着互联网行业快速发展&#xff0c;服务器成为用户部署网络业务重要的网络工具&#xff0c;但随之而来的就是更密集的网络攻击&#xff0c;这给网站带来了很大的阻碍。防火墙作为保障网络安全的主要设备&#xff0c;可以很好的抵御网络攻击。 防火墙基本上使用硬件和软件两种…

虚拟机 安装 centos7 带桌面

虚拟机 安装 centos7 流程 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ CentOS-7-x86_64-DVD-2009.iso vmware 安装 centos7 的时候&#xff0c; 如果 不是 选择的 稍后 安装操作系统 &#xff0c; 会不让你选择配置选项&#xff0c;自动帮你把系统…

高数总结(6

目录 1.总结&#xff1a;小结&#xff1a; 1.总结&#xff1a; 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广&#xff0c;搜我的公众号即可&#xff1a;

RK3588平台开发系列讲解(视频篇)ffmpeg 的移植

文章目录 一、ffmpeg 介绍二、ffmpeg 的组成三、ffmpeg 依赖库沉淀、分享、成长,让自己和他人都能有所收获!😄 📢ffmpeg 是一种多媒体音视频处理工具,具备视频采集功能、视频抓取图像、视频格式转换、给视频加水印并能将视频转化为流等诸多强大的功能。它采用 LGPL 或 G…

【办公类-16-07-03】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环、有场地、贴墙版”(python 排班表系列)

作品展示——有场地说明 背景需求&#xff1a; 前期做了一份“贴周计划”用的班主任版的户外游戏安排表&#xff08;中X班19周&#xff0c;没有场地&#xff09; 【办公类-16-07-02】“2023下学期 周计划-户外游戏 每班1周五天相同场地&#xff0c;6周一次循环”&#xff08;…

React近一年的发展趋势与挑战,以及距离v19版本的进展情况

大家好&#xff0c;我是宝哥 React近一年的发展趋势和挑战主要体现在以下几个方面&#xff1a; 版本发布频率下降&#xff1a;React自上一次版本更新以来&#xff0c;已经有一年多没有发布新的稳定版本&#xff0c;这引起了社区的广泛关注和讨论。最后一次更新是在2022年6月&…

从入门到精通:AI绘画与修图实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在这篇文章中&#xff0c;我们将深入探讨如何利…

面试官:如何设计幂等性接口

什么是幂等性&#xff1f; 所谓幂等性&#xff0c;就是一次操作和多次操作同一个资源&#xff0c;所产生的影响均与一次操作的影响相同。 "幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 幂等函数&…

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错&#xff0c;提示无法定位包&#xff0c;提示如下 出现这个问题是因为apt的源没有更新&#xff0c;我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

物流EDI:Verizon EDI 需求分析

作为物流行业的企业&#xff0c;Verizon与其供应商之间通过EDI来传输业务单据。在与Verizon建立EDI连接时&#xff0c;需要参考EDI 指南、采购订单条款和条件以及运输路线指南这三个文档。 点击此链接&#xff0c;获取上述的三个文档 Verizon供应商可以通过上述链接找到用于处…

ThreadLocal用法

一.项目需求 在我们进行新增用户时,会涉及到创建人和修改人字段如何获取的问题.我们不可能再后端将这两个字段写成静态的值. 1.1 解决方案 通过某种方式动态获取当前登录员工的id 员工登录成功后会生成JWT令牌并响应给前端: /*** 员工管理*/ RestController RequestMapping(&q…

【软考问题】-- 2 - IT知识 - 信息技术发展

一、基本问题 2 - IT知识 - 信息技术发展 问题1:数据库根据存储方式可以分为什么? 数据结构模型 层次模型:最早使用的 一种模型,它用 “树 ” 结构表示实体集之间的关联,其中实体集(用矩形框表示)为结点,而树中各结点之间的连线表示它们之间的关联。格式化数据模型 网状…