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

nor*_*gon 37 high-availability redis

如何在没有停机时间的情况下升级到更新版本的Redis?Redis从站是只读的,因此您似乎必须取下主站,并且在您等待重新加载数据库时,您的站点将是只读45秒或更长时间.

有没有解决的办法?

kaj*_*aji 29

Redis团队有很好的文档

核心步骤:

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

完整文档:

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


Tom*_*son 22

使节点脱机时,使用SLAVEOF命令将从站升级为主站,然后在将其重新联机时将其设置为从站,它将从联机节点复制所有数据.

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

如果你想变得非常花哨,你可以设置你的客户端,如果它检测到写入主服务器时出错,则提升它.

  • 旧主人待处理的写作会发生什么?在旧主机脱机和所有从机都知道新主机的时间之间发生了什么? (4认同)
  • 这些从站将具有过时数据,直到它们能够从新主站加载数据.但是,您可以提前设置它 - 从站不必直接连接到主站.对于正在发生更改的写操作,将客户端设置为在旧主服务器发生故障之前写入新主服务器 - 从服务器实际上不是只读的,只是写入不会被发送到其他节点,这不会在这种情况下很重要. (2认同)

Abh*_*bhi 10

您可以使用Redis Sentinel执行此操作,Sentinel将自动将从属服务器提升为新主服务器.你可以在这里找到更多信息http://redis.io/topics/sentinel.

Sentinel是一个用于管理redis服务器的系统,它可以持续监控redis主站和从站,每当主站发生故障时,它会自动将从站升级为主站.当旧的主人是UP时,它将被作为新主人的奴隶.

这里不需要停机或配置文件的手动配置.您可以访问上面的链接,了解如何为您的redis服务器配置sentinel.

  • 以上问题的解决方案是使用"sentinel",这是在上面的链接中简要解释的,你需要了解sentinel以便为你的redis配置它.上面的链接为它提供了清晰的解释. (4认同)
  • 虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接.如果链接的页面发生更改,则仅链接的答案可能会无效. (2认同)

Ed *_*d J 6

注意,您可能必须检查并设置以下配置以写入从站.("因为Redis 2.6默认情况下奴隶是只读的")

redis-cli config set slave-read-only no
Run Code Online (Sandbox Code Playgroud)

- 例子

-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"
Run Code Online (Sandbox Code Playgroud)