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

了解更多

Devops 的 Redis 常见问题 – 复制超时


Lisa Bewster 拍摄

Redis 提供了多种工具,旨在改进和维护高效的内存数据库使用。虽然其独特的数据类型和命令可以微调数据库以服务于应用程序请求,而无需在应用程序级别进行任何额外处理,但配置错误,或者更确切地说,使用开箱即用的配置,可能会(并且确实)导致运营挑战和性能问题。尽管存在一些造成不少麻烦的挫折,但解决方案确实存在,甚至可能比预期的更简单。本系列文章将重点介绍使用 Redis 时出现的一些最令人恼火的问题,以及有关如何解决这些问题的技巧。它们基于我们运行数千个 Redis 数据库实例的实际经验。

继我们之前的系列文章复制缓冲区之后,我们列表中的下一个问题将继续讨论主从复制的主题。特别是,我们将更深入地了解完成该过程所需的时间以及可能导致重大不便的一些配置问题。

复制超时

正如我们之前在无限复制循环帖子中讨论的那样,Redis 的复制过程由两个同步阶段组成:初始阶段和持续阶段。虽然持续阶段相当稳定(只要保持主服务器和从服务器之间的链接),但初始阶段完成起来有点棘手。初始同步的成功完成不仅取决于为复制缓冲区分配的内存量(参见之前的问题),还取决于此步骤所花费的时间。

您可能还记得,初始同步步骤包括后台保存和将整个数据库从主服务器传输到从服务器。根据数据集的大小和网络连接的质量,这可能是一个漫长的过程。如果该阶段花费的时间过长,则可能会达到 Redis 的复制超时设置,从而导致初始阶段重复一次又一次,令人厌烦。在这种情况下,您会在从服务器的 Redis 日志中发现大量如下消息

[28618] 21 Jul 00:33:36.031 * Connecting to MASTER 10.60.228.106:25994
[28618] 21 Jul 00:33:36.032 * MASTER <-> SLAVE sync started
[28618] 21 Jul 00:33:36.032 * Non blocking connect for SYNC fired the event.
[28618] 21 Jul 00:33:36.032 * Master replied to PING, replication can continue...
[28618] 21 Jul 00:33:36.032 * Partial resynchronization not possible (no cached master)
[28618] 21 Jul 00:33:36.032 * Full resync from master: 549907b03661629665eb90846ea921f23de6c961:2537453

默认情况下,Redis 的复制超时设置为 60 秒(请参阅您的 redis.conf 文件中的 repl-timeout 指令,或者使用 redis-cli 执行 config get repl-timeout )。这段时间可能太短了,特别是当您有

  • 缓慢的存储:如果主服务器和/或从服务器连接到性能缓慢的存储,这将导致主服务器情况下的后台保存过程花费大量时间。在从服务器的情况下,从磁盘写入和加载数据可能会延长。

  • 大数据集:数据集越大,保存和传输所需的时间就越多。

  • 网络性能:当主服务器和从服务器之间的网络链路具有有限的带宽和/或高延迟时,它会直接影响数据传输速率。

您可以通过将复制超时设置为更合适的值来纠正此问题。首先,估算复制数据库所需的可接受时间。首先,通过执行 BGSAVE 命令并检查日志文件中相关行(即 * Background saving started by pid nnn * 表示该过程已启动,而 * Background saving terminated with success * 表示其终止)来检查 Redis 执行后台保存需要多长时间。接下来,计算将生成的 RDB 文件从主服务器复制到从服务器磁盘需要多长时间。最后,您需要计算实际从磁盘加载数据需要多长时间(例如,通过重新启动 Redis 并在日志文件中查找 * DB loaded from disk 行)。这些测量的总和可以作为您所需的复制超时值的粗略估计,但您可能希望为其增加 10-20% 以确保安全。

根据估算设置超时后,您可以通过让从服务器执行几次完全同步并检查日志文件来测试实际复制需要多长时间。如果可能,请尝试在一天中的不同时间重复此练习,以便更好地衡量系统在不同负载下的行为。最后,请记住,应根据数据库的增长情况定期审查超时设置的值。

我们对 Redis 复制问题的回顾到此结束。复制是使您的数据库保持可用性并扩展其读取吞吐量的一项强大工具,但请注意默认设置,并确保已将数据库配置为适合您的用例。

如果您已完成阅读本文并希望深入了解 Devops 常见问题的下一个常见原因,请继续阅读有关客户端缓冲区的文章。