经过五年开发后的第二个 libmdbx v1.0 候选版本。

图书馆 库数据库 是 LMDB 的经过重大重新设计的后代 - LMDB 是一种性能极高、紧凑的嵌入式键值数据库。
当前版本 v0.5 是一个技术版本,标志着所有改进的完成以及向公共最终测试和稳定阶段的过渡,随后形成了该库的第一个完整版本。

LM数据库 是一个相当著名的基于事务的嵌入式键值 DBMS 树B+主动记录,它允许大量多线程进程与本地共享(非网络)数据库竞争性且极其高效地工作。 反过来,MDBX 比 LMDB 更快、更可靠,而 libmdbx 保留了其祖先的所有关键功能,例如 以及跨 CPU 内核线性扩展的非阻塞读取,并且还添加了几个新的。

关于 libmdbx 相对于 LMDB 的差异和改进的描述值得单独撰写一篇文章(计划发布在 Habré 和 Medium 上)。 这里有必要提及最重要和最引人注目的:

  • 从根本上来说,更加关注代码质量、测试和自动检查。
  • 从检查参数到数据库结构的内部审计,操作过程中的控制能力显着增强。
  • 自动压缩和自动数据库大小管理。
  • 适用于 32 位和 64 位程序集的单一数据库格式。
  • 按范围估计样本大小(范围查询估计)。
  • 支持两倍于煎饼大小的键和用户可选择的数据库页面大小。

libmdbx 候选版本是 2019 年 2 月决定分离 MDBX 和 MithrilDB 项目的结果(见下文)。同时,libmdbx 决定消除(合理的)最大技术债务并稳定库。 事实上,在指定方向上所做的工作比最初估计和计划的多了 3-XNUMX 倍:

  • 已实现对 Mac OS 和第二层平台的支持:FreeBSD、Solaris、DragonFly BSD、OpenBSD、NetBSD。 可以根据需要添加 AIX 和 HP-UX 支持。
  • 使用 Undefined Behaviour Sanitizer 和 Address Sanitizer 对代码进行了清理,使用 -Wpedantic 构建时的所有警告、所有 Coverity 静态分析器警告等均被消除。
  • 更新 接口说明.
  • 合并源代码以便于嵌入。
  • CMake 支持。
  • 支持嵌套事务。
  • 使用 bootid 确定操作系统是否已重新启动(脏数据库停止)。
  • 更新/旧页面和扩展交易信息的端到端计数。
  • 选项 MDBX_ACCEDE 用于以兼容模式连接到已打开的数据库。
  • 使用 OFD阻塞 有空的时候。
  • 管道热备份。
  • 专门优化的内部排序算法(比 qsort() 快 2-3 倍,比 std::sort() 快 30%)。
  • 最大密钥长度已增加。
  • 自动控制预读(数据库文件在内存中的缓存策略)。
  • 更积极、更快的自动压缩。
  • 一种更优化的B+树页面合并策略。
  • 控制非本地文件系统(NFS、Samba 等),以防止使用不当导致数据库损坏。
  • 测试集已扩大。

libmdbx 的“下一个”版本的开发将作为一个单独的项目继续进行 秘银数据库,而MDBX“当前”版本的开发向量旨在冻结功能集并使其稳定。 做出这个决定是出于三个原因:

  • 完全不兼容:MithrilDB 需要不同的(不兼容的)数据库文件格式和不同的(不兼容的)API 来实现所有计划的功能。
  • 新源代码:MithrilDB 源代码已获得独立于 LMDB 的许可,并且项目本身计划在不同的许可下发布(由 OSI 执照 阿帕奇2.0而且不 OpenLDAP 基金会).
  • 这种分离避免了潜在的混乱,提供了更多的确定性,并确保项目有独立的前进道路。

MithrilDB 与 MDBX 一样,也基于 树B+ 并且还将具有极高的性能,同时消除 MDBX 和 LMDB 的许多基本缺点。 特别是“长读”问题,即由于垃圾处理被长读事务阻塞而表现为数据库“膨胀”的问题将被消除。 MithrilDB 的新功能包括:

  • 支持将数据库放置在多种异构介质上:HDD、SSD 和非易失性内存。
  • 针对“有价值”和“低价值”、“热”、“暖”和“冷”数据的最佳策略。
  • 使用 Merkle 树来监控数据库完整性。
  • 可选使用 WAL,在写入密集型场景中显着提高性能并保证数据完整性。
  • 磁盘上数据的惰性追赶固定。

来源: linux.org.ru

添加评论