10.7 预览功能:压缩提供程序插件

MariaDB 长期以来一直采用可插拔的存储引擎架构,这带来了在针对特定用例选择和管理适当存储引擎方面的巨大灵活性,同时也意味着它们更容易开发,因此人们期望会创建更多引擎。

更多存储引擎意味着 MariaDB Server 本身需要尽可能灵活,以适应存储引擎可能需要的所有各种功能。但 MariaDB Server 在提供存储引擎所需的所有压缩库方面曾表现得不太友好。

随着 MariaDB 拥有更多存储引擎以及新旧引擎都获得了更多功能,MariaDB 可能会出于各种目的使用越来越多的压缩库。

InnoDB、RocksDB、Mroonga – 它们都可以使用不同的压缩库集。从 MariaDB Server 的角度来看,这有点像一个“左右为难”的局面。将所有这些库编译进去会带来大量的运行时/rpm/deb 依赖项,其中大多数对于大多数用户来说永远不会用到。如果不编译进去,则会导致用户请求将其编译进去(从而使其在某些存储引擎功能中可用)。

大多数用户不会使用所有压缩库,但许多用户会使用其中一些库。

这个项目在 Jira 事务 MDEV-12933 中进行追踪,并在 2020 年夏天被接受为 Google Summer of Code 项目的一部分。Kartik Soneji 在 Robert Bindar 的指导下,实现了一种在运行时按需加载压缩库而无需创建打包依赖项的解决方案。

Kartik Soneji 最初实现的解决方案被 Sergei Golubchik 接手,他对其进行了微调并集成到 MariaDB Server 中。本 MariaDB 10.7 预览版本中提供的“压缩提供程序插件”就是这项工作的成果。

新架构

之前MDEV-12933 之前,为了使某个压缩算法工作,MariaDB 必须与相应的压缩库进行链接。例如,如果 InnoDB 用户想使用 LZO 压缩,用户必须使用我们针对 openSUSE 的 .rpm 包或从源代码编译 MariaDB。因为我们的二进制 tarball、.deb 包以及其他 .rpm 包都没有编译 LZO 支持。如果有人想要 LZ4 支持 — 那意味着使用 .deb 包或在 Fedora 上使用 .rpm。而来自 mariadb.org 的包没有提供 LZO 和 LZ4 两者。

但现在,有了MDEV-12933 的引入,无需再做选择。MariaDB 内置了对所有压缩算法的支持(已编译进去),但没有任何依赖项。压缩算法在相应的插件加载之前是禁用的。它们的安装也不会影响 MariaDB Server 对其他用户的正常工作,所以大家都满意。

Server 包也没有依赖项,.rpm 和 .deb server 包都不需要安装任何压缩库。如果您想使用压缩功能,则需要安装相应的提供程序插件包。这非常重要,请务必理解 — 如果您之前使用过 InnoDB 压缩功能,升级到 10.7 后,您必须安装您需要的压缩提供程序插件,否则您的表将无法读取。

安装/卸载压缩提供程序插件与安装/卸载任何其他 MariaDB 插件完全相同。以下是 LZ4 算法的一个示例,请注意此预览版本随附了多个提供程序插件(bzip2、lzma、lz4、lzo 和 snappy),您也可以随意尝试这些。

set global innodb_compression_algorithm = lz4; # Throws error when plugin isn't loaded
ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'lz4'

install soname 'provider_lz4';

select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4'; # Check plugin status or use SHOW PLUGINS
plugin_name	plugin_status
provider_lz4	ACTIVE

set global innodb_compression_algorithm = lz4; # Now it works

而且,与任何其他插件一样,如果您安装一个包含插件的 .rpm 或 .deb 包,它将通过 .cnf 文件自动安装。

一旦您安装了提供程序插件,创建一个启用 InnoDB 压缩功能的表应该很容易

set global innodb_compression_algorithm = lz4;

create table t (a int, b text) engine=InnoDB page_compressed=1;

insert t1 (a, b) values (0, "abc");

请注意,提供程序插件不能被卸载。InnoDB 不会期望在表访问过程中,压缩库会在其“眼皮底下”消失,因此虽然您可以随时加载提供程序插件,但唯一移除它的方法是重启服务器。

请注意,目前只有 InnoDB 和 Mroonga 使用压缩提供程序插件。RocksDB 仍然直接链接到压缩库,因为 RocksDB 包包含单独的实用程序可执行文件(sst_dumpmariadb-lld),而它们无法加载服务器插件。

如何亲自尝试 10.7 提供程序插件预览?

Tarball

前往 tarball 下载页面

容器

为了以尽可能少的精力测试此预览版本,您可以运行名为 quay.io/mariadb-foundation/mariadb-devel:10.7-mdev-12933-provider-plugins 的容器,该容器具有与 Docker Library mariadb 镜像相同的接口。

欢迎提供反馈

如果您在此功能预览中遇到任何问题,包括设计方面的问题,或未按预期工作的边缘情况,请在 MDEV 项目中通过 JIRA 提交 bug 或功能请求告知我们。欢迎在 Zulip 上讨论相关事宜。

另请参阅 知识库页面 以获取更多详细信息。