缓存
- RFC PR: datafuselabs/databend#6799
- Tracking Issue: datafuselabs/databend#6786
概要
为 Databend Query 添加缓存支持,以便我们的用户可以从缓存服务加载热数据,而无需再次从后端存储服务读取。
动机
Databend 的设计基于存储和计算分离:
因此,databend 将支持不同的云存储服务作为其后端,如 AWS s3、azure blob 和 google cloud storage。这样做的好处是我们可以获得非常高的吞吐量带宽,但缺点是我们的单个请求的延迟会增加。
添加缓存层将提高整体延迟并减少不必要的请求数量,从而降低成本。
Databend 过去在 common-cache 中有一个基于本地磁盘的缓存。此实现使用 databend-query 的本地路径来缓存块。
指导性解释
引入缓存后,databend 存储层将如下所示:
该查询将维护三个 OpenDAL 操作器:
Persist Operator
:直接从/向存储服务读取和写入持久数据。Cache Operator
:通过透明缓存读取和写入数据。Temporary Operator
:从/向仅存储具有 TTL 的数据的临时存储读取和写入临时数据。
我们在此处提到的存储、缓存和临时服务都是 OpenDAL 支持的服务。区别在于:
Persist Services
:所有数据都将持久保存,直到用户删除它们。Cache Services
:后端可能具有其 GC 或后台自动驱逐逻辑,这意味着缓存服务是非持久性的,也就是易失性的。Temporary Services
:后端将配置 TTL 并及时删除旧数据。
查询不应尝试将持久数据写入 Cache Operator
或 Temporary Operator
。
对于最终用户
用户可以指定不同的缓存服务来缓存或存储临时数据。例如,他们可以将数据缓存到本地 fs 中(与当前行为相同):
[cache]
type = "fs"
[cache.fs]
data_path = "/var/cache/databend/"
或者他们可以将数据缓存到像 opencache
这样的分布式缓存服务中:
[cache]
type = "opencache"
[cache.opencache]
endpoints = ["192.168.1.2"]
临时数据可以在整个集群中共享,因此用户必须使用像 redis
或 s3
这样的共享存储服务,而不是本地 fs 或内存:
[temporary]
type = "s3"
[temporary.s3]
bucket = "temporary-data"
endpoint = "http://127.0.0.1:9900"
对于开发者
如前所述,开发者现在有三种 Operator
来处理不同的工作负载:
Persist
:直接读取和写入数据,没有缓存逻辑,类似于O_DIRECT
。Cache
:通过透明缓存读取和写入,类似于内核的页面缓存。Temporary
:将临时数据读取和写入到缓存服务,类似于 Linux 的tmpfs
,旧数据可以及时删除。
参考级解释
Cache Operator
Cache Operator
将被实现为 Apache OpenDAL Layer:
#[derive(Clone, Default, Debug)]
pub struct CacheLayer {
// Operator for persist data (via `storage` config)
persist: Operator,
// Operator for caching data (via `cache` config)
cache: Operator,
// Client for KVApi
kv: Arc<dyn KVApi>,
}
impl Layer for CacheLayer {}
impl Accessor for CacheLayer {}
databend-query 将初始化缓存层以及持久操作器:
pub fn get_cache_operator(&self) -> Operator {
self.get_storage_operator().layer(CacheLayer::new())
}
CacheLayer
的详细实现将不在本 RFC 中讨论。
Temporary Operator
临时 Operator 将连接到共享存储服务,该服务为整个集群共享相同的视图。查询可以将临时中间结果写入此处,以便与其他节点共享。
大部分工作应该在服务侧完成。我们不会在本 RFC 中讨论这一点。
缺点
没有。
基本原理和替代方案
没有。
先有技术
没有。
未解决的问题
没有。
未来的可能性
OpenCache
OpenCache 是 databend 社区正在进行的一项工作,旨在构建分布式缓存服务。Apache OpenDAL 将在其 API 稳定后实现对 OpenCache
的原生支持。之后,用户可以部署和使用 OpenCache 作为 cache
存储。