发布高性能嵌入式DBMS libmdbx 0.10.4和libfpta 0.3.9

libmdbx 0.10.4 (MDBX) 库随高性能紧凑型嵌入式键值数据库的实现而发布,相关的 libfpta 0.3.9 (FPTA) 库实现了具有二级索引和复合索引的数据表格表示在 MDBX 之上。这两个库均根据 OSI 批准的许可证进行分发。支持所有当前的操作系统和架构,以及俄罗斯 Elbrus 2000。

从历史上看,libmdbx 是 LMDB DBMS 的深度改造,在可靠性、功能集和性能方面优于其祖先。与 LMDB 相比,libmdbx 非常重视代码质量、API 稳定性、测试和自动化检查。提供了一个实用程序,用于检查数据库结构的完整性,并具有一些恢复功能。

在技​​术方面,libmdbx 提供 ACID、强大的更改序列化和跨 CPU 内核线性扩展的非阻塞读取。支持自动压缩、自动数据库大小管理和范围查询估计。自 2016 年以来,项目一直由 Positive Technologies 资助,并自 2017 年起已在其产品中使用。

libmdbx 提供 C++ API,以及爱好者支持的 Rust、Haskell、Python、NodeJS、Ruby、Go 和 Nim 语言绑定。对于 libfpta,只有 API 描述以 C/C++ 头文件的形式公开提供。

自 9 月 XNUMX 日发布消息以来新增的主要创新、改进和修正:

  • 启用可重复的构建。
  • 修复了一个错误,在极少数情况下,事务提交期间可能会发生循环/冻结。 Positive Tecnologies 专家在对其产品进行内部测试时发现了该问题。
  • 测试已得到改进,测试场景已扩展,以检查数据库内页面树和 GC 内容的所有可到达的非同构状态。
  • 在 C++ API 中,修复了额外的“noexcept”,为“cursor::erase()”方法添加了额外的重载,缓冲区的实现不再使用“std::string”来确保对齐(与 CLANG libstdc++ 相关)。
  • 脏页溢出算法(选择性弹出已更改的数据库页)中的回归已被消除,该算法表现为在大型事务中更改数据时出现罕见的意外 MDBX_PROBLEM 错误。
  • 进行了阶段性测试,并添加了多项检查,以确保在数据库遭到故意损坏时的稳定性。
  • 修复了次要警告 UndefinedBehaviorSanitizer 和 Coverity 扫描问题。
  • 修复了检查旧版本库创建的数据库映像内的嵌套页面中过时且不再使用的内部标志“P_DIRTY”的问题。
  • 在 CMake 脚本中,LTO(链接时优化)所需的编译器组件的搜索已得到改进。
  • 同时阅读的最大数量已增加至 32767。
  • 改进了使用 Valgrind 和 AddressSanitizer 时的性能。
  • 在 Windows 上,在 MDBX_NOTLS 模式(不使用线程本地存储)下工作时 SRW 锁的递归使用已被消除,如果系统时间已更改,则修复了 bootid 生成,WSL1 和 WSL2 检测已得到改进,并且能够添加了通过 DrvFS 安装的 Plan 9 上打开数据库的功能。
  • 总共对 160 个文件进行了 57 多项更改,添加了约 5000 行,删除了约 2500 行。

我要特别感谢 Erigon 项目团队(以太坊生态系统)在极端使用场景测试中提供的帮助。值得注意的是,自 libmdbx v0.10.0 发布以来的五个月内,每个 Erigon 安装的数据库量为 1-2 TB(在 7% 的以太坊节点上使用),仅收到 XNUMX 份数据库损坏报告,全部为这是由于外部原因而不是软件错误而发生的:在两种情况下,原因是 RAM 故障,在第三种情况下,是在使用 BTRFS 的存储子系统的特定配置中重置数据时出现错误。

来源: opennet.ru

添加评论