
Quark Gateway 是连接客户端与 Quark 服务的一个中间件,可帮助均衡 Quark 服务的业务流量,便捷实现查询入口的高可用、自定义路由转发和负载均衡能力。本文将介绍如何通过其缓存功能,进一步提升查询性能。
前提条件
-
ArgoDB 和 Quark Gateway 升级到最新软件版本,并安装最新的补丁(Patch)。
-
已为 Quark Gateway 对接了一个或多个 Quark 服务,具体操作,见 Quark Gateway 使用手册。
背景介绍

为提升查询性能,Quark Gateway 引入了结果集缓存功能,通过缓存常用查询结果,显著减少重复查询对 Quark 服务的影响,加快相同查询的响应速度。此外,Quark Gateway 还提供了 TTL(缓存过期时间)、定时刷新等多种缓存更新策略,您可根据具体任务需求灵活选择最优方案。
-
提升查询效率
对重复或常规的查询请求进行缓存,显著减少数据处理时间,提升查询响应速率。
-
降低系统负担
有效减轻 Quark 服务的处理压力,减少对后端服务的重复查询,系统能够将更多资源集中用于处理更多更复杂的查询请求。
缓存对象说明
Quark Gateway 支持将 Holodesk 表和外部表(如 TEXT 表)的查询结果缓存,从而提升查询性能,适用于绝大多数 SQL 语句。但以下场景由于其 SQL 语义的特性,无法缓存查询结果:
-
非确定性函数:如序列函数、获取当前时间的函数,每次结果不同。
-
临时表:会话结束后自动删除,且其他用户无法访问。
-
系统表:数据变更频繁且规模较小。
-
dblink:连接外部数据源,难以监测数据变化,无法确保缓存结果的实时性。
缓存失效机制
为确保缓存数据的实时性与一致性,Quark Gateway 提供了多种策略来管理缓存的自动失效:
-
DML 操作感知:当通过 Quark Gateway 执行数据的增删改操作时,系统会自动感知受影响的表,并使与之关联的缓存立即失效。
-
DDL 操作感知:执行表结构变更(如创建、删除或修改表结构)时,Quark Gateway 会检测到表的元数据变化,自动使相关表的缓存失效。
-
数据版本监测:实时监测 TDDMS 存储服务的数据版本,一旦检测到数据更新,立即使相关缓存失效。
使用流程
-
登录 Transwarp Manger 平台。
-
在左侧导航栏,选择仪表盘 > 集群。
-
在 Transwarp ArgoDB 区域中,找到并单击 Quark Gateway。
-
单击配置页签,找到 EXTRA_GATEWAY_OPTS 参数并单击其编辑。
填写参数:
-Dinceptor.gateway.cache.result.enabled=true
,用于开启结果集缓存功能。若需设置多个参数,请用空格分隔。具体参数说明如下:图 65. Gateway 设置表 30. 参数说明 参数 默认值 说明 inceptor.gateway.cache.result.enabled
false
是否开启结果集缓存功能,默认为关闭状态
inceptor.gateway.cache.max.entry.size
100MB
一个查询的结果是否被缓存的阈值,如果超过该值,该查询的结果不再被缓存,如果值设置为纯数字(不含单位),则单位为字节
inceptor.gateway.cache.max.memory.usage
512MB
缓存结果使用的最大内存,如果值未包含单位,则单位为字节
inceptor.gateway.cache.result.expire.time
3600
缓存有效期,单位为秒
inceptor.gateway.cache.wait.time
5000
单位毫秒,如果多个客户端同时发起同一查询,其中一个会发送到Server 执行,其他的会等待,如果等待时间超过该值,则该查询也被发送到 Server 执行
inceptor.gateway.cache.keywords
空
只缓包含这些关键词的查询的结果
-
参考上一步的参数设置方法,开启 TDDMS 数据变化探测功能,保障缓存与原始数据的一致性。
设置案例:
-Dinceptor.gateway.cache.tddms.check=true -Dinceptor.gateway.cache.jdbc.url=jdbc:transwarp2://iqa15:8080/default
表 31. 参数说明 参数 默认值 说明 inceptor.gateway.cache.tddms.check
true
是否开启 Holodesk 表状态探测功能,默认为开启状态
inceptor.gateway.cache.jdbc.url
无
任一 Quark 服务的 JDBC 连接地址,通过该连接,Quark Gateway 可获取到表在 TDDMS 服务上的名称,格式例如
jdbc:transwarp2://<server_ip/hostname>:<port>/<database_name>
,更多介绍,见通过 Beeline 命令行连接。inceptor.gateway.cache.jdbc.username
无
用户名,开启 LDAP 认证时需填写
inceptor.gateway.cache.jdbc.password
无
用户密码,开启 LDAP 认证时需填写
inceptor.gateway.meta.cache.expire.time
30000
元数据信息的过期时间,单位为毫秒
为更好地匹配您的业务需求,您可以通过设置更多参数来控制缓存行为,例如缓存存储位置、黑名单等,更多介绍,见管理缓存。
-
保存设置后,单击页面右上角的配置服务来下发修改的配置。
-
在业务低峰期,单击页面右上角的重启,配置将正式生效。
-
(可选)连接 Quark Gateway 并执行 SQL 查询后,可通过调用下述接口来查看缓存命中情况。
# 执行时需要替换真实的 Quark Gateway 服务地址 curl -X GET http://{Quark Gateway 服务地址}:6066/v1/resultcache
复制执行示例:
curl -X GET http://iqa15:6066/v1/resultcache |jq % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 44 0 44 0 0 816 0 --:--:-- --:--:-- --:--:-- 830 { "cacheCout": 1, "hintCount": 1, "enabled": true }
复制
管理缓存
默认的参数值可满足绝大多数的业务场景,同时,Quark Gateway 还支持基于业务需求调整参数,例如设置缓存清理规则、管理黑名单等,从而更好匹配复杂的业务需求。
管理缓存生命周期
为避免闲置缓存占用内存,Quark Gateway 提供缓存清理功能,您可以通过下述参数控制缓存清理/更新策略,确保数据的有效性并节省内存空间。
参数 | 默认值 | 说明 |
---|---|---|
inceptor.gateway.cache.ttl.autocheck.enable |
true |
是否开启缓存自动清理功能,默认为开启状态 |
inceptor.gateway.cache.ttl.autocheck.time |
|
默认ttl即扫描时间间隔为1.5倍的缓存有效时间,单位秒。非特殊需求不必修改该值。 |
inceptor.gateway.cache.schedule.clean.enable |
false |
是否定期清空所有缓存数据 |
inceptor.gateway.cache.schedule.clean.cron |
|
缓存清理任务默认为每天凌晨 0 点执行,适用于源表定时更新的场景(如 T+1 场景),可通过 cron 表达式进行配置 |
管理黑名单
当查询的结果超出 inceptor.gateway.cache.max.entry.size
的值,Quark Gateway 会自动将其加入黑名单,黑名单中的 SQL 不会尝试建立缓存,您可以通过下述参数控制黑名单行为:
参数 | 默认值 | 说明 |
---|---|---|
inceptor.gateway.cache.black.list.enable |
true |
是否开启缓存黑名单功能 |
inceptor.gateway.cache.black.list.expire.time |
10800 |
黑名单过期时间,单位为秒,从最后一次加入黑名单时开始计算 |
inceptor.gateway.cache.black.list.size |
10000 |
黑名单数量上限 |
inceptor.gateway.cache.black.list.check.time |
86400 |
黑名单定时清理的时间间隔,单位秒 |
管理存储位置
默认情况下,Quark Gateway 生成的缓存信息存放在自身内存中,如您的集群安装了星环键值数据库 Transwarp KeyByte,您还可以选择将缓存数据对接至该服务,进一步提升管理便捷性和资源利用率。
参数 | 默认值 | 说明 |
---|---|---|
inceptor.gateway.cache.storage.use.keybyte |
false |
是否将缓存信息存储在 KeyByte 服务中 |
inceptor.gateway.cache.keybyte.ip |
0.0.0.0 |
KeyByte 服务的 IP 地址 |
inceptor.gateway.cache.keybyte.port |
6399 |
KeyByte 的服务端口 |
inceptor.gateway.cache.keybyte.password |
空 |
KeyByte 的连接密码 |
inceptor.gateway.cache.keybyte.max.total |
200 |
KeyByte 连接池的最大连接 |
inceptor.gateway.cache.keybyte.max.idle |
20 |
KeyByte 连接池的最大空闲连接 |
inceptor.gateway.cache.keybyte.min.idle |
1 |
KeyByte 连接池的最小空闲连接 |
inceptor.gateway.cache.storage.keybyte.time.threshold.enabled |
false |
当缓存超过时间阈值,是否将其从内存转为 Keybyte 存储 |
inceptor.gateway.cache.storage.keybyte.time.threshold |
60 |
缓存超时阈值,单位为秒 |
inceptor.gateway.cache.storage.keybyte.size.threshold.enabled |
false |
当缓存超过大小阈值,是否将其从内存存储转为 Keybyte 存储 |
inceptor.gateway.cache.storage.keybyte.size.threshold |
|
缓存大小阈值,如果值设置为纯数字(不含单位),则单位为字节 |