Redis主/从复制-单点故障?

40

如何在零停机时间的情况下升级到新版本的Redis?Redis从属节点是只读的,因此似乎您必须关闭主节点,而您的站点将在等待它重新加载数据库时只能进行读取操作45秒或更长时间。

这个问题是否有解决方法?


4
FYI:奴隶不是只读的,你可以向奴隶写入数据。但通常情况下这么做没有意义,因为此时奴隶和主节点会失去同步。 - NathanD
2
这条之前的评论现在已经过时。从Redis文档默认配置:https://raw.github.com/antirez/redis/2.6/redis.conf "自Redis 2.6起,从节点默认情况下为只读模式。"请参见下面的帖子以更改您的从节点为读写模式。 - Ed J
4个回答

31

Redis团队在此方面有非常好的文档。

核心步骤:

  • 将新的Redis实例设置为当前Redis实例的从节点。为此,您需要一个不同的服务器或具有足够RAM使两个Redis实例同时运行的服务器。
  • 如果使用单个服务器,请确保从节点在与主实例不同的端口上启动,否则从节点将无法启动。
  • 等待复制初始同步完成(检查从节点日志文件)。
  • 使用INFO确保主节点和从节点中有相同数量的键。 使用redis-cli检查从节点是否按预期工作并回复您的命令。
  • 配置所有客户端以使用新实例(即从节点)。
  • 一旦确定主节点不再接收任何查询(可以使用MONITOR命令检查此内容),请使用SLAVEOF NO ONE命令选择从节点为主节点,并关闭主节点。

完整文档:

升级或重启Redis实例而无需停机时间


1
很好的想法在这里进行总结:只需在客户端重新配置之前添加缺失的步骤“使用CONFIG SET slave-read-only no允许从节点写入”。在最近的Redis版本中,默认情况下从节点是只读的。 - Enrico Marchesin

23

在将节点下线时,使用SLAVEOF命令将从服务器升级为主服务器,然后将其上线时设置为从服务器,并将复制来自在线节点的所有数据。

您可能还需要确保客户端可以适当地处理更改/丢失的主节点。

如果您想变得非常高级,则可以设置客户端,在检测到写入主服务器时出错时将从服务器升级为主服务器。


4
旧主节点上未完成的写操作会如何处理?当旧主节点下线后,直到所有从节点都知道新主节点的情况之间会发生什么? - nornagon
3
直到这些从属节点能够从新主节点加载数据之前,它们将拥有过时的数据。但是,您可以提前设置 - 从属节点不必直接连接到主节点。对于正在发生更改的写操作,请在旧主节点关闭之前设置客户端将数据写入新主节点 - 从属节点实际上并非只读,只是这种情况下写操作不会被发送到其他节点,这在此情况下并不重要。 - Tom Clarkson
“非常花哨”的这个想法在某种程度上早于VAXcluster。” - Florian Heigl

10
您可以使用Redis Sentinel来完成此项任务,Sentinel会自动将从服务器升级为新的主服务器。您可以在http://redis.io/topics/sentinel找到更多信息。
Sentinel是用于管理Redis服务器的系统,它持续监视Redis主服务器和从服务器,每当主服务器宕机时,它会自动将从服务器提升为主服务器。当旧主服务器恢复时,它将成为新主服务器的从服务器。
这样做无需停机或手动配置配置文件。您可以访问上面的链接了解如何为Redis服务器配置Sentinel。

2
虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅有链接的答案如果链接页面发生变化,就会失效。 - talonmies
4
以上问题的解决方案是利用“哨兵”,这在上面的链接中有简要说明,您需要了解哨兵并将其配置到您的Redis中。上面的链接提供了清晰的解释。 - Abhi

9

请注意,您可能需要检查并设置以下配置才能写入从节点。("自Redis 2.6起,默认情况下从节点是只读的")

redis-cli config set slave-read-only no

-- 示例

-bash-4.1$ redis-cli info
 Server
redis_version:2.6.9

-bash-4.1$ redis-cli slaveof admin2.mypersonalsite.com 6379
OK

-bash-4.1$ redis-cli set temp 42
(error) READONLY You can't write against a read only slave.

-bash-4.1$ redis-cli slaveof no one
OK

-bash-4.1$ redis-cli set temp 42
OK

-bash-4.1$ redis-cli get temp
"42"


-bash-4.1$ redis-cli config set slave-read-only no
OK

-bash-4.1$ redis-cli slaveof admin2.mypersonalsite.com 6379
OK

-bash-4.1$ redis-cli set temp 42
OK

-bash-4.1$ redis-cli get temp
"42"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接