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

news2025/2/28 19:52:33

文章目录

    • 前言
    • 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.coloradmin.cn/o/1458217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt-双臂SCARA机器人动画

qt-双臂SCARA机器人动画 一、演示效果二、核心程序三、下载链接 在Qt opengl中完成的双臂SCARA机器人的简单模拟。 一、演示效果 二、核心程序 #include "glwidget.h"#include <GL/glu.h>GLWidget::GLWidget(QWidget *parent) :QGLWidget(parent),pitch(30.…

Java集合框架-1

目录 List集合 常见方法 迭代器&#xff08;Iterator&#xff09; List集合特有方法 List 的特点 创建 List 遍历List Java集合框架是Java编程语言提供的各种数据结构和算法的实现。它提供了不同类型的集合类&#xff0c;如列表(List)、集(Set)、映射(Map)等&#xff0c…

iOS通过p12导出公钥失败

通过p12文件导出证书crt文件一直报invalid password错误。 adminJiaozl Downloads % openssl pkcs12 -in ce.p12 -clcerts -nokeys -out MyCertificate.crt Enter Import Password: Mac verify error: invalid password?解决&#xff1a; 在 https://developer.apple.com/acc…

MongoDB文档插入

文章目录 MongoDB文档插入对比增删改查文档插入 MongoDB写安全机制非确认式写入 MongoDB文档查询参数说明查询操作符比较查询操作符逻辑查询操作符元素查询操作符数组查询操作符 模糊查询区别:$regex操作符中的option选项 MongoDB游标介绍游标函数手动迭代游标示例游标介绍 Mon…

AMC8美国数学思维竞赛2000-2024年真题练一练,你能做对几道?

为帮助备考AMC8美国数学竞赛的孩子们了解比赛的题型&#xff0c;掌握相关的知识&#xff0c;我会陆续分享2000-2024年的比赛真题&#xff0c;每道题都有解析&#xff0c;帮助孩子们不但会做题&#xff0c;还掌握背后的知识&#xff0c;从而达到举一反三的效果&#xff0c;提升比…

QT-LCD模拟显示

QT-LCD模拟显示 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "lcd_widget.h" #include <QDebug> #include <QPainter>LCDWidget::LCDWidget(QWidget *parent) : QWidget(parent),display(nullptr), display_char_buffer(…

LeetCode JS专栏刷题笔记(二)

一、前言 LeetCode - JavaScript 专栏刷题笔记第二篇。 第一篇刷题笔记详见&#xff1a;LeetCode JS专栏刷题笔记&#xff08;一&#xff09; 二、算法题目 1. 复合函数 LeetCode地址&#xff1a;2629. 复合函数 请你编写一个函数&#xff0c;它接收一个函数数组 [f1, f2, …

Mac清理系统垃圾软件CleanMyMac X2025免费版本下载

嘿&#xff0c;Mac用户们&#xff0c;你是否经常感觉你的Mac就像是在背着一个沉重的包袱在跑步&#xff1f;是的&#xff0c;我在说那些堆积如山的系统垃圾。清理这些垃圾不仅可以让你的Mac跑得更快&#xff0c;还能让它“呼吸”更畅快。今天&#xff0c;让我们一起来探索如何M…

【医学大模型】MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化,便于LLM理解和应用

MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化&#xff0c;便于LLM理解和应用 提出背景对比传统医学大模型流程步骤临床指导树流程图识别临床决策支持系统 总结解决方案设计数据收集与处理系统实施临床决策支持 提出背景 论文&#xff1a;https://arxiv.org/p…

代码智能生成插件‘通义灵码‘使用指南

介绍 通义灵码&#xff0c;通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云的云服…

相机图像质量研究(36)常见问题总结:编解码对成像的影响--块效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Leo赠书活动-16期 名校毕业生教材

Leo赠书活动-16期 名校毕业生教材 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠…

STM32的SDIO

一.SDIO简介 SDIO&#xff0c;全称Secure Digital Input/Output&#xff0c;是一种用于在移动设备和嵌入式系统中实现输入/输出功能的接口标准。它结合了SD卡的存储功能和I/O功能&#xff0c;允许设备通过SD卡槽进行数据输入输出和外围设备连接。 SDIO接口通常被用于连接各种…

基于SSM的在线教学质量评价系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的在线教学质量评价系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

java中容易被忽视的toString()方法

之前一直认为toString就是将数据转换成字符类型&#xff0c;直到最近写出了一个bug才对toString有了新的认识 不同数据类型&#xff0c;toString() 有不同的操作 定义一个student类&#xff0c;包含姓名 String类型、性别 String类型、年龄 int 类型、分数列表 String类型的li…

网络安全工程师必知的WEB知识

作为一名网络安全工程师&#xff0c;尤其是WEB渗透测试工程师&#xff0c;必须掌握一些WEB相关的基础知识&#xff0c;下面重点从WEB服务架构、浏览器请求过程、服务器操作系统、WEB应用服务器、数据库系统、动态网站脚本语言、WEB前端框架等。 1. Web服务架构 Web服务主要分…

sensitive-word v0.13 特性版本发布 支持英文单词全词匹配

拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署&#xff1f; sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍 更多技术交流 业务背景 对于英文单词 Disburse 之类的&#xff0c;其中的 sb 字母会被…

【Qt学习】QWidget的windowOpacity属性介绍与实例使用(双重检查的引入)

文章目录 1. windowOpacity 介绍2. 使用实例3. 题外话 - 双重检查&#xff08;doubleCheck&#xff09;代码资源 1. windowOpacity 介绍 我们可以查阅qt的官方文档&#xff0c;进行总结&#xff1a; windowOpacity() 表示窗口的不透明度级别。有效的范围是从1.0&#xff08;完…

学习总结19

# 奶牛的耳语 ## 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 n 头奶牛&#xff0c;其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi(0< pi < 10^8) 来表示。在无聊的日子里&#xff0c;奶牛们常常在自己的牛栏里与其它奶牛交…

【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 高效协同

文章目录 01 KafkaSink 版本&导言02 KafkaSink 基本概念03 KafkaSink 工作原理1.初始化连接2.定义序列化模式3.创建KafkaSink算子4.创建数据源5.将数据流添加到KafkaSink6.内部工作机制 04 KafkaSink参数配置05 KafkaSink 应用依赖06 KafkaSink 快速入门6.1 包结构6.2 项目…