贺春旸,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/readyset
2、运行 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 CACHES
6、测试
分别在 ReadySet 3307 端口上,和后端 MySQL 端口上 ,实行刚才缓存的慢 SQL,比拟实行韶光,你会创造缓存后的 SQL 秒级出结果。
初步测试表明,ReadySet 的有效性在第一次实行查询后,缓存机制可以充分发挥浸染时就会变得非常明显。