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

如何以零停机时间升级到更新版本的Redis? Redis的奴隶是只读的,所以看起来好像你不得不取下主人,而你的网站在等待它重新加载数据库的时候只能读取45秒或更长时间。

有没有解决的办法?

使节点脱机时,使用SLAVEOF命令将从站提升为主站,然后当您恢复联机时,将其设置为从站,并将从联机节点复制所有数据。

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

如果你想变得很花哨,你可以设置你的客户端来提升一个从设备,如果它发现一个写给主设备的错误。

Redis团队对此有非常好的文档

核心步骤:

  • 将您的新Redis实例设置为当前Redis实例的从属设备。 为了做到这一点,你需要一个不同的服务器,或者有足够内存的服务器来同时运行两个Redis实例。
  • 如果使用单个服务器,请确保从属服务器的启动位置与主实例不同,否则从属服务器将无法启动。
  • 等待复制初始同步完成(检查从属日志文件)。
  • 确保使用INFO,在主站和从站中有相同数量的密钥。 用redis-cli检查一下,slave是否按你的意愿工作,并回复你的命令。
  • configuration所有客户端以使用新的实例(即从属)。
  • 一旦确定主设备不再接收任何查询(可以使用MONITOR命令进行检查),使用SLAVEOF NO ONE命令select主设备,并closures主设备。

完整文档:

无需停机即可升级或重新启动Redis实例

你可以使用Redis Sentinel来做这件事,这个哨兵会自动将一个奴隶作为新的主人。 你可以在这里find更多的信息http://redis.io/topics/sentinel

Sentinel是一个用于pipe理redis服务器的系统,它不断地监视redis主服务器和从服务器,每当主服务器出现故障时,都会自动提升从服务器到主服务器。 当老主人UP时,就成为新主人的奴隶。

这里不需要configuration文件的宕机或手动configuration。 您可以访问上面的链接,了解如何为您的redis服务器configurationsentinel。

请注意,您可能需要检查并设置以下configuration才能写入您的从站。 (“由于默认情况下,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"