高性能嵌入式DBMS libmdbx 0.10发布

经过三个月的开发,libmdbx 0.10.0(MDBX)发布,实现了高性能、紧凑的嵌入式键值数据库。 libmdbx 代码已获得 OpenLDAP 公共许可证的许可。 libmdbx 是 LMDB DBMS 的深度改造,据开发人员称,它在可靠性、功能范围和性能方面优于其祖先。 据称,在 CRUD 场景下,libmdbx 比 LMDB 快 20%,如果在将 libmdbx 构建到与 LMDB 相当的水平时禁用内部控制,则快 30%。

Libmdbx 提供 ACID、强大的更改序列化和跨 CPU 内核线性扩展的非阻塞读取。 libmdbx非常注重代码质量、稳定的API运行、测试和自动检查。 支持自动压缩、自动数据库大小管理、32 位和 64 位程序集的单一数据库格式以及范围查询估计。 提供了一个实用程序,用于检查数据库结构的完整性,并具有一些恢复功能。 自2016年起,该项目由Positive Technologies资助,并自2017年开始在其产品中使用,美国政府对Positive Technologies实施的制裁并未产生任何明显影响。

自上一版本以来添加的主要创新、改进和修复:

  • Mahlon E. Smith 提供的 Ruby 绑定和 Noel Kuntze 提供的 Python 绑定试用版现已推出,Alexey Sharov 提供的 GoLang 绑定已更新。
  • 对于“MDBX_WRITEMAP”模式,当直接在 RAM 中更改数据库数据时,会实现将更改的数据库页“透明溢出”到磁盘。 现在,在完成每个操作后,这些页面立即完全准备好写入磁盘,并且操作系统内核可以独立地将更改的页面刷新到磁盘,并且提交事务将不需要它们的修改。 因此,在RAM不足的繁忙场景下,磁盘操作量最多可减少2倍。
  • 实现了对已修改页面的长期未使用的卷影副本的逐出,并优先逐出具有大/长值的页面,在绝大多数情况下,每个事务仅修改一次。 其结果是在事务量非常大的情况下减少了磁盘流量并提高了性能。
  • 实现了插入键时拆分页面的“智能”模式。 现在,当插入有序序列时,页面会自动完全填充,并且在其他情况下,树会更加优化平衡。 因此,平均而言,数据库页面的填充更加优化,B 树更加平衡,这对性能产生积极影响。
  • 添加了页面操作的统计信息,可以让您准确估算修改数据库操作的成本。
  • 修复了十多个 bug 和 bug,包括:使用 MinGW 构建的问题、在 iOS <= 13.0 中使用 `std::filesystem::path` 的问题、针对旧版本 Windows 的构建等。
  • 总共对 200 个文件进行了 66 多项更改,添加了约 6500 行,删除了约 4500 行。

另外,我想指出选择 Turbo-Geth 项目(Go-Ethereum 的涡轮分叉)libmdbx 作为新的存储后端,并感谢项目团队(特别是 Alexey Sharov、Artyom Vorotnikov 和 Alexey Akhunov)对极端用例场景的测试有很大帮助。 特别是,发现并消除了预读/缓存控制中的缺陷,该缺陷导致大型数据库难以重现的场景中的性能下降。

来源: opennet.ru

添加评论