MemTable 与 WAL 规范(实验性)
本文定义了 Lance 的 MemTable + WAL(MemWAL)实验性规范:在基表之上引入 region 化写入与异步合并,以支持高吞吐流式写入并维持可索引查询性能。 核心要点:MemWAL 以 region 为水平扩展单元,并要求主键稳定映射到单一区域以保证“最后写入生效”语义正确。规范细化了 MemTabl…
Reprint Notice(转载提示):本文转载自 https://lance.org/format/table/mem_wal/。 原文标题:MemTable & WAL Specification (Experimental)。 原文语言:English。本文为中文翻译版本,英文原文已作为 content_en 保留。MemTable 与 WAL 规范(实验性) Lance MemTable & WAL (MemWAL) 规范描述了 Lance 表的日志结构合并 (LSM) 树架构,可实现高性能流式写入工作负载,同时保持关键工作负载的索引读取性能,包括 扫描、点查找、矢量搜索和全文搜索。整体架构 MemWAL Overview 在 MemWAL 规范的上下文中,Lance 表被称为基表。 它必须在表架构中定义非强制主键。 在基表之上,MemWAL 规范定义了一组区域。 写入器写入区域,每个区域中的数据异步合并到基表中。 基表中保留索引,方便读取器快速发现某个时间点所有区域的状态。MemWAL 区域 MemWAL Region 是水平扩展写入的主要单元。 每个区域在任何时候都只有一位活跃写入器。 写入器声明一个区域,然后将数据写入该区域。 每个区域的数据预计会异步合并到基表中。 具有相同主键的行必须写入且只能写入一个区域。 如果两个区域包含具有相同主键的行,则以下情况可能会导致数据损坏:区域 A 在时间 T1 接收主键 pk=1 的写入区域 B 在时间 T2 (T2 > T1) 接收主键 pk=1 的写入区域B中的行首先合并到基表中区域A中的行第二次合并到基表中区域 A(较旧)中的行现在覆盖区域 B(较新)中的行 这违反了预期的“最后写入获胜”语义。 通过确保每个主键通过区域规范准确地分配给一个区域, 区域之间的合并顺序与正确性无关。 请参阅 MemWAL 区域架构 了解完整的区域架构。MemWAL 索引 MemWAL 索引 是基表之上所有 MemWAL 元数据的集中结构。 一张表最多有一个MemWAL索引。它存储:配置:定义行如何映射到区域以及要维护哪些索引的区域规范合并进度:最后一代合并到每个区域的基表索引追赶进度:每个基表索引已重建以覆盖哪个合并代区域快照:所有区域状态的快照以进行读取优化 索引是配置、合并进度和索引追赶进度的真实来源 写入器和合并器在写入之前读取 MemWAL 索引以获取这些配置。 每个区域的清单 对于自己的州来说是权威的。 读取器使用区域快照是一种只读优化,可以查看所有区域的时间点视图,而无需打开每个区域清单。 有关完整结构,请参阅MemWAL 索引详细信息。区域架构 Region Architecture 在一个区域内,写入存储在 内存表 (MemTable) 中。 它还会写入该区域的 预写日志 (WAL) 以保证持久性。 MemTable 会根据内存压力和其他条件定期刷新到存储。 然后,存储中的 刷新的 MemTable 会异步 合并 到基表中。MemTable MemTable 保存在刷新到存储之前插入到该区域的行。 它有两个目的:构建数据和相关索引,将其作为刷新的 MemTable 刷新到存储中允许读取器潜在地访问尚未刷新到存储的数据MemTable 格式 MemTable 的完整内存格式是特定于实现的,超出了本规范的范围。 Lance 核心 Rust SDK 维护一种默认实现,并且可通过其所有语言绑定 SDK 使用, 但集成可以根据具体用例自由构建自己的 MemTable 格式, 只要在刷新 MemTable 时遵循 MemWAL 存储布局、读取器和写入器要求即可。 从概念上讲,由于 Lance 使用 Arrow 作为其内存中数据交换格式, 为了便于在本规范中进行解释,我们将 MemTable 视为 Arrow 记录批次的列表, 每次写入 MemTable 都是一个新的 Arrow 记录批次。MemTable 代(Generation) 基于内存限制和耐久性要求等条件, MemTable 需要刷新到存储并丢弃。 当发生这种情况时,新的写入将写入新的 MemTable,并重复该循环。 每个 MemTable 都分配有一个从 1 开始单调递增的代号。 当第 N 代的 MemTable 被丢弃时,下一个 MemTable 将被分配到第 N+1 代。WAL WAL 充当一个区域中所有 MemTable 的持久存储。 它由 MemTables 中按代排序的数据组成。 每次我们写入 WAL 时,我们称之为 WAL Flush。WAL 耐用性 当写操作刷新到 WAL 时,特定的写操作将变得持久。 否则,如果MemTable丢失,数据也会丢失。 多个写入可以在单个 WAL 刷新中批量处理,以减少 WAL…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行