在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理

Pisa-Proxy:SQL解析实践与数据库 Pisa-Proxy是一个功能强大的开源工具,它可以拦截和解析SQL查询,并提供了对查询的修改和转换的能力。通过以上的代码示例,我们深入了解了Pisa-Proxy在SQL解析实践和与数据库的交互中的应用。使用Pisa-Proxy,我们可以轻松地解析SQL查询,并获得查询的各个组成部分,例如SELECT语句中的表名、列名等。除了解析和修改SQL查询,Pisa-Proxy还允许我们添加额外的逻辑,以便在查询执行前或执行后进行一些额外的操作。现在,我们已经成功建立了Pisa-Proxy与数据库的连接。 阅读详情

一

背景

在 Database Mesh 中,Pisanix 是一套以数据库为中心的治理框架,为用户提供了诸多治理能力,例如:数据库流量治理,SQL 防火墙,负载均衡和审计等。在 Pisanix 中,Pisa-Proxy 是作为整个 Database Mesh 实现中数据平面的核心组件。Pisa-Proxy 服务本身需要具备 MySQL 协议感知,理解 SQL 语句,能对后端代理的数据库做一些特定的策略,SQL 并发控制和断路等功能。在这诸多特性当中,能够理解 MySQL 协议就尤为重要,本篇将主要介绍 MySQL 协议和在 Pisa-Proxy 中 MySQL 协议的 Rust 实现。

Why Rust

为什么要选用 Rust 语言呢?我们的考量有以下几个必要条件。

  • 安全性: 首先作为数据库治理的核心组件,其语言的安全性是居首位的。Rust 中,类型安全实现内存安全,如所有权机制、借用、生命周期等特性避免了程序开发过程中的空指针、悬垂指针等问题,从而保证了服务在语言层面的安全性。
  • 优秀的性能表现: Rust 的目标在性能方面对标 C 语言,但在安全和生产力方面则比 C 更胜一筹。 其无 GC,不需要开发人员手动分配内存等特性,极大程度地减少内存碎片,简化内存管理。
  • 低开销: 从开发效率和可读可维护性上来说,有足够的抽象能力,并且这种抽象没有运行时开销(runtime cost)。零开销抽象,通过泛型和 Trait 在编译期展开并完成抽象解释。
  • 实用性: 有优秀的包管理器工具 Crate、文档注释支持、详细的编译器提示、友好的错误处理等,在开发过程中能够高效帮助程序员快速开发出可靠、高性能的应用。

二

整体架构,模块设计

整体架构。

图 1 Pisa-Proxy 工作流程图

工作流程

在图 1 中我们可以看出整个 Proxy 服务可以概括为以下几个阶段。

1. 首先 Pisa-Proxy 支持 MySQL 协议,将自己伪装为数据库服务端,应用连接配置只需修改访问地址即可建连 Pisa-Proxy 通过读取应用发来的握手请求和数据包;

2. 得到应用发来的 SQL 语句后对该 SQL 进行语法解析,并得到该 SQL 的 AST;

3. 得到对应 AST 后,基于 AST 实现高级访问控制和 SQL 防火墙能力;

4. 访问控制和防火墙通过后 SQL 提交执行,SQL 执行阶段的指标将采集为 Prometheus Metrics,最后根据负载均衡策略获取执行该语句的后端数据库连接;

5. 如果连接池为空将根据配置建立和后端数据库的连接,SQL 将从该连接发往后端数据库;

6. 最后读取 SQL 执行结果,组装后返回给客户端。

三

如何用 Rust 快速实现 MySQL 代理服务

如图 2,在整个代理服务中总体分为两部分:服务端和客户端,即代理服务作为服务端处理来自客户端的请求。和服务端,需要对服务端发起认证,并将客户端端命令发送给 MySQL 数据库。在这两部分中我们需要创建两套 Socket 来完成网络数据包的处理。

图 2

技术选型

介绍

在网络报处理和运行时处理上,我们选用了 Rust 实现的 Tokio(
https://github.com/tokio-rs/tokio )框架。Tokio 框架是 Rust 编写的可靠、异步和精简应用程序的运行时。并且 Tokio 是一个事件驱动的非阻塞 I/O 平台,用于使用 Rust 编程语言编写异步应用程序。在高层次上,它提供了几个主要组件:

  • 一个多线程、基于工作窃取的任务调度程序( https://docs.rs/tokio/latest/tokio/runtime/index.html )。
  • 由操作系统的事件队列(epoll、kqueue、IOCP 等)支持的响应式编程。
  • 异步 TCP 和 UDP( https://docs.rs/tokio/latest/tokio/net/index.html )套接字。

同时,Tokio 还提供了丰富的工具链,例如编解码工具包、分帧包等等,可以使我们更加方便快捷地处理 MySQL 中各种各样的数据报文。

项目地址:
https://github.com/tokio-rs/tokio

优势

a. 快速: Tokio 的设计旨在使应用程序尽可能都快。

b. 零成本抽象: Tokio 以 Future 为基础。虽然 Future 并非 Rust 独创,但与其他语言的 Future 不同的是,Tokio Future 编译成了状态机,用 Future 实现常见的同步,不会增加额外开销成本。Tokio 的非阻塞 IO 可以充分发挥系统优势,例如实现类似 Linux Epoll 这种多路复用技术,在单个线程上的多路复用允许套接字并批量接收操作系统消息,从而减少系统调用,所有这些都可以减少应用程序的开销。

c. 可靠: Rust 的所有权模型和类型系统可以实现系统级应用程序,而不必担心内存不安全。

d. 轻量级: 没有垃圾收集器,因为 Tokio 是基于 Rust 构建的,所以编译后的可执行文件包含最少的语言运行时。这意味着,没有垃圾收集器, 没有虚拟机,没有 JIT 编译,也没有堆栈操作。这样在编写多线程并发的系统时,能够有效避免阻塞。

e. 模块化: 每个组件都位于一个单独的库中。如果需要,应用程序可以挑选所需的组件,避免依赖不需要的组件。

代码实现

Rust 中数据包处理

#[derive(Debug)]
pub struct Packet {
    pub sequence: u8,
    pub conn: BufStream<LocalStream>,
    pub header: [u8; 4],
}

以上为 Proxy 数据包处理逻辑中核心的结构体,结构体中包含了三个字段分别为:

  • sequence:报文中的序列号 ID
  • conn:处理链接的 Socket
  • header:存储消息头报文的数组,长度为 4 字节

在包处理逻辑中主要定义了以下

mysql-proxy-rs-一个MySQL代理-Rust开发 mysql-proxy-rs基于tokio-core构建MySQL代理服务器的实现。 概述此板条箱提供了一个MySQL代理服务器,您可以将其用作mysql-proxy-rs基于tokio-core构建MySQL代理服务器的实现。 概述此板条箱提供了一个MySQL代理服务器,您可以使用自己的自定义逻辑对其进行扩展。 以下是一些代理用例的示例:捕获应用程序发出SQL查询的日志查询执行时间的概要信息监视查询模式(例如威胁检测)记录SQL流量以供以后回放以进行自动测试用法代理定义了以下特征以用于定义一包 立即下载

相关推荐

基于 Tokio 的异步 Rust Mysql 驱动程序。

mysql-异步基于 Tokio 的异步 MySql 客户端库,用于 Rust 编程语言。安装托管在crates.io上的库。[dependencies ]mysql_async =" <desired>"例子请参阅docs.rs上的 crate 文档。执照获得许可Apache 许可证,版本 2.0(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0 )MIT 许可证(LICENSE-MIT或http://opensource.org/licenses/MIT )供您选择。贡献除非您另有明确说明,否则根据 Apache-2.0 许可证的定义,您有意提交的包含在作品中的任何贡献均应获得上述双重许可,没有任何附加条款或条件。

mysql_common-MySql协议原语-Rust开发

mysql_common此板条箱是基本MySql协议原语的实现。 这个板条箱:定义基本的MySql常数; 实现必要的功能mysql_common此板条箱是基本MySql协议原语的实现。 这个板条箱:定义基本的MySql常量; 为MySql cached_sha2_password和mysql_native_password身份验证插件实现必要的功能; 为MySql协议IO实现辅助特性; 为准备好的语句实现对命名参数的支持; 为MySql协议数据包的子集实现解析器; 定义MySql协议值和行的锈表示; 实现转换

保姆级教程:用YOLOv5+ROS2 Humble搞定奥比中光Dabai DCW深度相机的3D物体定位

本教程详细介绍了如何使用YOLOv5模型和ROS2 Humble系统,结合奥比中光Dabai DCW深度相机实现3D物体定位。从环境配置、模型部署到深度数据融合,提供完整的实战指南,帮助开发者快速掌握三维坐标提取技术,适用于机器人开发和计算机视觉应用。

weixin_26765363的博客 270

软件工程导论考试通关秘籍:太原理工大学历年真题解析(附答案)

本文为太原理工大学《软件工程导论》考试提供高效备考指南,通过解析近六年真题,揭示高频考点如软件生命周期、UML建模和结构化设计等核心模块的命题规律。文章提供真题拆解、实战策略和避坑指南,帮助考生掌握图形转换题和简答题的应答技巧,助力考试通关。

weixin_29233333的博客 222

1.2 固态变压器:传统工频变压器的局限与SST的技术起源

本小节明确传统工频变压器在电力系统中的基础定位与核心工作特性,系统分析其在新型电力系统场景下的固有技术瓶颈,梳理固态变压器(Solid State Transformer, SST,又称电力电子变压器Power Electronic Transformer, PET)从概念提出到工程化成熟的完整演进路径,为后续SST技术优势、设计需求与规范符合性要求的讲解建立底层逻辑,同时对应GB/T 40429-2021《电力电子变压器通用技术要求》的需求制定背景。

技术工作者 656

别再只放按钮了!巧用微信小程序‘长按识别’功能,打造无缝加群体验

本文深入探讨了微信小程序'长按识别'功能在社群运营中的创新应用,通过简化加群流程至一步操作,显著提升用户转化率。文章详细解析了技术实现细节、UI/UX设计策略,并对比了与企业微信API的适用场景,为开发者提供打造无缝加群体验的完整解决方案。

weixin_42627853的博客 434

【论文翻译】YOLO26: KEY ARCHITECTURAL ENHANCEMENTS AND PERFORMANCE BENCHMARKING FOR REAL-TIME OBJECT DETEC

本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其在实时边缘目标检测领域的关键架构改进与性能基准测试结果。YOLO26于2025年9月发布,是YOLO系列中最新、最先进的模型,专为在边缘设备和低功耗设备上实现高效能、高精度和部署就绪性而设计。论文依次详细介绍了YOLO26的架构创新,包括移除分布焦点损失(DFL)、采用端到端无非极大值抑制(NMS)推理、集成渐进式损失(ProgLoss)和小目标感知标签分配(STAL),以及引入MuSGD优化器以实现稳定收敛。

Limiiiing的博客 1681

深度强化学习 | 基于DQN实现Flappy Bird游戏与分析

在Flappy Bird中,玩家需要通过控制小鸟安全穿过随机长度的水管来得分。本文基于深度Q网络DQN来实现Flappy Bird游戏的自主探索与学习

FRIGIDWINTER的博客 5911

【AI黑话日日新】什么是算力调度?

算力调度 = 在有限资源下,把任务智能分配到最合适的计算节点,实现效率、成本、稳定性最优。更完整的定义:算力调度是对 CPU、GPU、内存、网络、存储等异构资源进行统一抽象、感知、决策、分配、监控与自愈的全生命周期管理,是分布式系统的“智能管家”。算力调度不是玄学,它是资源管理 + 算法 + 工程实践的结合。先懂概念 → 再玩工具 → 再写策略 → 再优化算法从单机到集群,从CPU到GPU,从离线到在线,循序渐进未来AI与算力网络时代,算力调度是性价比最高、最稀缺、最长期吃香的技术方向之一。

专注:太空算力、AI infra、异构调度、大模型成本工程 266

【Autosar COM】Marvell 88Q5050 以太网交换机驱动技术解析

本驱动实现了对Marvell 88Q5050交换机的全面控制,通过模块化设计满足AUTOSAR规范要求。增加DMA加速机制提升大数据量处理性能实现TSN(时间敏感网络)特性支持引入异步通知机制替代轮询操作增强安全特性,如MACsec支持该驱动架构为车载以太网交换机控制提供了可靠基础,其设计思想可推广到其他车载网络控制器开发中。随着车载网络技术的演进,驱动需持续迭代以支持新特性与更高通信速率需求。

1450

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附权威答案)
下一篇: JDBC 在性能测试中的应用
Java5658
博客等级 码龄4年 169粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值