dot Redis 8 来了——而且是开源的

了解更多

快速高效的 Redis 数据库并行化比较

比较数据库的两个版本是一个相当常见的做法,通常用于测试和开发目的,以及支持应用程序更新和新版本。比较数据库具有许多优点。首先确保两个数据库完全同步,然后使用户能够评估备份设置和各种流程的功能,包括验证备份恢复或主从复制。 对于使用 Redis 数据库的任何人来说,此过程都非常有用。 因此,在 Redis,我们会将旧版本的数据库与我们自己新开发的数据库进行比较,以确保不同版本之间的复制机制令人满意。 此外,我们不断验证不同云区域和区域之间的数据库同步,以此来支持客户使用完全托管且高度可用的 Redis 数据库。 以下信息详细介绍了开发 Redis 比较工具的过程。

Redis RDB 工具

最初,我们使用 Redis RDB 工具,这是一个开源项目,提供用于有效解析 Redis 转储文件 (RDB) 的库。Redis RDB 工具库还提供用于比较两个 RDB 文件的工具,分析其操作所需的内存量,以及其他有用的功能。 通过给定数据库的转储文件,Redis RDB 工具会打印一个文本文件,其中包含按字母顺序排序的所有现有键名和相应值。 为每个数据库创建一个文件后,可以使用简单的文本比较工具轻松比较这两个文件(例如 diffmeld)。

缺点

过去,Redis RDB 工具已被证明非常灵活和有用,但随着时间的推移,发现了一些缺点。

  1. Redis 包括几种数据类型:字符串、哈希、排序集和列表。 遗憾的是,Redis RDB 工具无法充分转储排序集,并且经常混淆集的顺序,从而可能损害比较。 好的一面是,这是一个小障碍,可以轻松解决
  2. Redis RDB 工具比较过程需要创建转储文件。 如果仅存在对数据库的远程访问,这可能会带来挑战。 此外,由于我们经常处理大型数据集,因此生成转储文件可能很麻烦、成本高昂且耗时。
  3. RDB 工具方法需要对文本文件进行排序,这意味着文本文件保存在 RAM 中。 这使得处理大型数据集时变得困难。 例如,为了在 RAM 中保存 60 GB 数据的 Redis 服务器上运行该过程,必须为开发机器提供足够的内存来保存相应的转储文件。 使用具有这些 RAM 数量的实例进行测试和开发成本很高,因此可能会使整个比较过程变得不可能。

我们的解决方案

Redis 最近的 2.8 版本引入了一系列命令(SCAN、HSCAN、SSCAN 和 ZSCAN),这些命令用于增量迭代键的集合。 使用 SCAN 函数,可以迭代一个数据库中的所有键,并将每个键与第二个数据库中相应的键类型进行比较(如果确实存在这样的键)。 这可以提供一个简单高效的比较解决方案,该解决方案在现有数据库上运行,因此不需要任何额外的计算资源或创建本地转储文件。

即使采用这种相当简单的方法,我们在处理大型数据集时仍然遇到性能问题。 使用单个 Redis 连接一次比较数百万个键(一次一个键类型)仍然是一个非常缓慢的过程。 为了克服这个问题,我编写了一个脚本,该脚本由使用 Python 的多处理库的进程池组成。 通过此方法,主进程迭代源数据库中的所有键,然后将多个键发送到池中的进程。 然后,每个进程将其收到的键与第二个数据库进行比较。 由于比较是并行进行的,因此整个过程完成得更快。

进一步改进

当发现两个数据库之间存在差异时,该脚本当前会打印“键 X 与键 Y 不同”。 可以通过更详细的输出(例如,指示列表类型键中不同的特定元素)来改进该工具。

Redis 键可以选择设置过期值。 在比较期间,从源数据库读取的键可能已在目标数据库中过期(反之亦然),但是,我们的工具仍会指示存在差异。 由于该键即将过期,因此这种差异可能与整体数据库比较无关,但我们当前的版本没有考虑此因素。 为最小过期值设置阈值并在不同的过期值之间进行比较是另一项有用的改进,可以增强该工具。

应该注意的是,如果在比较过程中数据发生更改,则此解决方案可能会失败。 该工具应用于数据恒定的情况,或者如果可以容忍实时数据更改。

我欢迎您下载此 Python 脚本,该脚本将帮助您对 Redis 数据库进行简单快速的比较。