作者介绍
贺春旸,dbaplus社群金牌专家,凡普金科和爱钱进DBA团队负责人,《MySQL管理之道:性能调优、高可用与监控》第一&二版、《MySQL运维进阶指南》作者,曾任职于中国移动飞信、安卓机锋网。五次荣获dbaplus年度MVP,致力于MariaDB、MongoDB等开源技术的研究,主要负责数据库性能调优、监控和架构设计。
一、前言
在数据库管理中,许多开发人员都面临着如何在不影响实时应用功能的前提下保持性能的挑战。这就引出了本文的焦点技术——ReadySet。
ReadySet 是什么?根据其 GitHub 存储库,ReadySet 旨在通过提供强大的 SQL 缓存引擎来提高实时应用程序的性能,无需更改现有代码,也无需切换数据库。该解决方案承诺高效且易于集成,因此对于希望加快应用程序速度的开发人员来说,它是一个引人注目的选择。
二、简介
Readyset(工具地址:https://github.com/readysettech/readyset)是一种可支持 MySQL 和 PostgreSQL 的轻量级缓存解决方案,利用内存来存储缓存数据,实现复杂 SQL 的闪电般快速查询。
Readyset 介于应用程序和数据库之间,是一个 SQL Cache 层。相当于 Redis 或 Memcached 的作用,但它不需要更改你的一行代码。
ReadySet 基于 Jon Gjengset 的麻省理工学院博士论文《基于数据流的物化视图中的部分状态》,首席执行官 Alana Marzoev 领导着公司的创新之旅。向大家介绍该工具的是马塞洛-阿尔特曼(Marcelo Altmann),他是一位因对 Percona XtraBackup 的贡献而闻名的开发人员,他现在是 ReadySet 开发团队的成员。
架构
Java/PHP 应用程序 -> Readyset -> MySQL 数据库
Readyset 缓存架构示意图
Readyset 的工作流程
1、对于读操作:
直接向 Readyset 发送 SQL 查询。如果结果已缓存,Readyset 会即时返回,实现毫秒级响应。若未缓存,Readyset 会将请求转发至后端数据库,获取结果后缓存并返回。2、对于写操作 (INSERT、UPDATE、DELETE):
Readyset 会直接将请求转发至后端数据库执行,并相应更新其缓存。Readyset 的优势
使用标准 SQL 即可访问,无需学习新的查询语言。无需修改应用程序代码,只需更改数据库连接字符串。支持复杂 SQL 查询的高速缓存。自动保持缓存与数据库的一致性。可选择性地缓存高频查询,优化资源利用。这种设计使 Readyset 特别适合读密集型应用,能显著提升查询性能,同时保持操作的简便性和数据的最终一致性。
三、安装与使用
1、下载 Readyset Docker 镜像
shell> docker pull readysettech/readyset2、运行 Readyset 服务
shell> docker run -d -p 3307:3307 -p 6034:6034 \--name readyset \-e UPSTREAM_DB_URL=mysql://admin:123456@192.168.137.131:6666/test \-e LISTEN_ADDRESS=0.0.0.0:3307 \readysettech/readyset:latest \注:UPSTREAM_DB_URL 参数值填写后端 MySQL 的用户名、密码、IP地址、端口号、数据库名,用户权限为ALL。
Readyset 暴露了两个端口:3307 和 6034。Readyset 进程将在 3307 端口监听查询流量,并通过 /metrics 端点在 6034 端口发送监控数据。
然后,Readyset 将连接到你的数据库,并复制指定的表(即所有表或明确定义的表)。根据这些表的大小以及 Readyset 和数据库之间的网络连接情况,这可能需要几秒到几小时的时间。
要检查表格是否已导入,请执行以下操作:
shell> docker logs readyset当你看到:INFO replicators::noria_adapter: MySQL connected 代表已准备好开始缓存查询。
或者,你用 MySQL 客户端访问 3307 端口,执行 SHOW READYSET STATUS 命令:
查看该 Snapshot Status 列。如果快照成功完成,它将报告 Completed。现在 Readyset 已准备好开始缓存查询。
3、在 Readyset 中缓存查询
用 MySQL 客户端连接上 3307 端口(Readyset 端口),将线上的慢 SQL 在 Readyset 里运行,并执行 SHOW PROXIED QUERIES 命令:
观察 readyset supported 列,如果为 Yes,代表该 SQL 支持缓存。如果值处于待定状态,请再次检查,直到看到是或否。如果数值等待超过 15 秒,则不支持查询。
4、创建 SQL 缓存
要缓存 SQL 语句,请使用:
CREATE CACHE FROM <query id>;这里以 q_4c1cf3b8080fe634 为例:
mysql> CREATE CACHE FROM q_4c1cf3b8080fe634;Query OK, 0 rows affected (0.68 sec)5、查看缓存查询
查询缓存的 SQL 语句:
SHOW CACHES6、测试
分别在 ReadySet 3307 端口上,和后端 MySQL 端口上 ,执行刚才缓存的慢 SQL,对比执行时间,你会发现缓存后的 SQL 秒级出结果。
初步测试表明,ReadySet 的有效性在第一次执行查询后,缓存机制可以充分发挥作用时就会变得非常明显。