Skip to main content

缓存

概要

为 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 OperatorTemporary Operator

对于最终用户

用户可以指定不同的缓存服务来缓存或存储临时数据。例如,他们可以将数据缓存到本地 fs 中(与当前行为相同):

[cache]
type = "fs"

[cache.fs]
data_path = "/var/cache/databend/"

或者他们可以将数据缓存到像 opencache 这样的分布式缓存服务中:

[cache]
type = "opencache"

[cache.opencache]
endpoints = ["192.168.1.2"]

临时数据可以在整个集群中共享,因此用户必须使用像 rediss3 这样的共享存储服务,而不是本地 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 存储。