LMDB 是一个高性能、基于 B 树的事务型键值存储。它利用内存映射文件提供零拷贝数据访问,无需内部页面缓存,从而具备极高的内存效率。 其主要特性包括完全符合 ACID 标准,以及支持多版本并发控制架构,允许读写操作同时进行且互不阻塞。它采用写时复制策略,既防止了数据库损坏,也免除了崩溃后的恢复流程。与仅能追加的数据库不同,LMDB 会复用空闲页面,从而防止文件无限增长。 尽管 LMDB 功能强大,但需要谨慎管理。用户必须避免长事务导致数据库膨胀,并确保进程在持有活跃事务时不会异常中止。LMDB 具有线程感知能力,且支持跨进程并发访问,前提是开发者须遵循关于锁文件维护和线程局部事务的特定规则。值得注意的是,LMDB 不适用于远程文件系统。默认情况下,它提供只读内存映射以确保数据完整性,但也提供读写模式以获得更高性能,但这会带来应用程序级指针错误的风险。总之,LMDB 为嵌入式数据库需求提供了一种简单、可靠且无需维护的解决方案。
VictoriaLogs 旨在通过优化磁盘使用效率和实现极速查询,来处理海量的日志数据。其运作基于三大核心支柱:
**1. 数据摄入与流 (Streams)**
日志被摄入并标准化为统一格式。最关键的配置是**流标识 (stream identity)**(由诸如 `pod` 或 `container` 等稳定且基数较低的字段定义)。VictoriaLogs 在磁盘上按这些流对日志进行分组,从而优化压缩效果,并允许查询时忽略无关数据。
**2. 存储架构**
数据被组织为**按日分区**,使得数据留存(删除整天的数据)和有时间范围的查询变得非常高效。在每个分区内,数据被打包成**部件 (parts)**。这些部件经历一个生命周期:从内存缓冲区移动到小型部件,最终合并为磁盘上更大的、不可变的文件。
**3. 高效查询**
为了保持查询速度,VictoriaLogs 通过分层索引系统避免扫描不必要的数据:
* **列式存储:** 仅读取查询中请求的字段。
* **布隆过滤器 (Bloom Filters):** 快速排除不包含特定关键词的数据块。
* **元数据层级:** `index.bin` 和 `metaindex.bin` 等文件将搜索范围从日期缩小到具体的字节偏移量,确保仅从磁盘读取必要的数据。