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"