前言
如何保证Redis的高并发和高可用?Redis的哨兵原理能介绍一下么?Redis Cluster如何通信?客户端怎么知道数据位于哪个节点?MOVED具体是怎么实现的?
一、Sentinel(哨兵)模式
Sentinel本质上只是一个运行在特殊模式下的Redis服务器
Sentinel(哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
Sentinel模式其实就是主从的技术方案(可以实现读写分离)的基础上,加入了Sentinel系统来监视整个主从集群的健康情况,如果发现有主服务器宕机,Sentinel系统就会对宕机服务器执行故障转移操作:
- Sentinel系统会挑选主服务属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器
- Sentinel系统会向主服务属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
- Sentinel系统还会继续监视已下线的服务,并在它重新上线时,将它设置为新的主服务器的从服务器。
启动一个Sentinel都做了哪些事情:
- 初始化服务器。
- 将普通Redis服务器使用的代码替换成Sentinel专用代码。
- 初始化Sentinel状态。
- 根据给定的配置文件,初始化Sentinel的监视主服务器列表。
- 创建连向主服务器的网络连接。
创建连向被监视主服务器的网络连接后,Sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关的信息。
对于每个被Sentinel监视的主服务器来说,Sentinel会创建两个连向主服务器的异步网络连接:
- 一个是命令连接,这个连接专门用于向主从服务器发送命令,并接收命令回复。
- 另一个是订阅连接,这个连接专门用于订阅主从服务器的__sentinel__:hello频道。
启动完成之后,Sentinel默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的信息:
# Server 主服务器本身的信息
...
run_id:7611c59dc3a29aa6fa0609f841bb6a1019008a9c
...
# Replication 主服务器属下所有从服务器的信息
role:master
...
slave0:ip=127.0.0.1,port=11111,state=online,offset=43,lag=0
slave1:ip=127.0.0.1,port