不同版本之间的RocksDB兼容性

RocksDB通常用于大型分布式存储系统。在这样的系统中,许多单独的RocksDB实例存储在跨不同数据中心的数千台主机中。 在以下场景中存在RocksDB 代码/配置/数据兼容性 问题:

  • 将RocksDB代码升级到新版本并重新打开数据库。
  • 将RocksDB代码降级到较低的版本并重新打开该DB。这种情况也经常发生,主要是因为与RocksDB无关的原因。
  • 将一个数据库的数据复制到另一个主机,该主机可能运行不同版本的RocksDB and/or 获得不同的RocksDB配置。

我们不认为这仅仅是RocksDB用户的问题,当我们在RocksDB中开发新特性时,我们总是考虑潜在的兼容性场景。

格式兼容性

这是我们处理格式兼容性的目标。如果用户不改变DB的选项,RocksDB在打开不同版本生成的DB时的兼容性保证如下:

  1. * 向后兼容: 最新版本的RocksDB应该能够打开所有以前版本生成的用于正常配置的DBs
  2. * 向前兼容: 如果用户没有显式启用在旧版本中不支持的新特性,则RocksDB的旧版本应该能够打开由至少几个较小版本生成的更高版本的数据库。
  3. 我们的目标是尽可能长地保持这种正向兼容性,而且我们通常可以保持一年以上。

例如,release 5.6可以打开至少2.2(4岁)版本生成的DB,如果没有使用新特性,version 3.10(2岁)可以打开使用5.6生成的DB。我们有连续的测试来验证这一点。

选项验证

当用户从未在他们的配置中引入对RocksDB的破坏性更改时,格式兼容性可以解决这个问题。但是,如果使用不同的配置打开数据库,即使使用相同的代码,RocksDB也可能无法打开数据库。考虑更改比较器或压缩样式。

为了解决这个问题,RocksDB可以在DB目录下的RocksDB options文件中实现当前的DB选项。在打开数据库之前,用户可以选择从数据库中读取选项并使用该选项打开数据库,这将是兼容的。 或者,用户可以验证他们想要使用的新选项是否与当前DB兼容。

这个特性有已知的限制,我们正在解决它。一个主要问题是,上一节提到的向后和向前兼容性保证不适用于选项验证工具。 例如,如果新版本的RocksDB具有对元数据块进行分区的新特性,则会有一条新的记录”元数据块大小=…”在选项文件中。即使用户使用默认值(即打开特性), 该记录也不能被以前的RocksDB版本所理解,这让用户别无选择,只能认为它是不兼容的。因此,降级RocksDB版本可能无法使用此功能。

为了解决这个问题,我们在版本5.6中添加了一个新的选项验证工具参数来跳过未识别的选项。 有了这个特性,用户至少可以打开使用高级版本生成的选项文件。我们正在努力解决其他限制。

迁移工具

检测选项的不兼容性是向前迈出的一大步。然而,用户有时需要更多。他们并不总是满足于RocksDB告诉他们不。 他们想让RocksDB成为yes——如果他们想支付成本,就自动迁移数据。

我们构建了一个压缩设置迁移工具,以帮助用户将DB迁移到不同的压缩设置。 看到工具的定义。如果用户需要,我们可以改进这个工具,使其包含更多的场景。 欢迎您发送pull request for that,或者告诉我们您的请求。