跳到主要内容

缓存

概述

为 Databend 查询添加缓存支持,以便我们的用户可以从我们的缓存服务中加载热数据,而不是再次从后端存储服务中读取。

动机

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 将实现为 Apache OpenDAL Layer

#[derive(Clone, Default, Debug)]
pub struct CacheLayer {
// 用于持久数据的 Operator(通过 `storage` 配置)
persist: Operator,
// 用于缓存数据的 Operator(通过 `cache` 配置)
cache: Operator,
// 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 中讨论。

临时操作符

临时操作符将连接到一个共享存储服务,该服务为整个集群提供相同的视图。查询可以在这里写入临时中间结果以与其他节点共享。

大部分工作应在服务端完成。我们不会在本 RFC 中讨论这一点。

缺点

无。

基本原理和替代方案

无。

先前技术

无。

未解决的问题

无。

未来的可能性

OpenCache

OpenCache 是 Databend 社区正在进行的工作,旨在构建分布式缓存服务。一旦其 API 稳定,Apache OpenDAL 将实现对 OpenCache 的原生支持。之后,用户可以部署和使用 OpenCache 作为 cache 存储。