一、前言
说到Redis的部署模式,很多同学第一工夫想到的就是Redis Cluster集群模式,因为它可能是当初的支流模式。但其实这几种模式各有优劣,理论环境中咱们应该抉择适合的部署模式,否则事与愿违,接下来简略介绍一下这几种部署模式
二、部署模式
2.1 单机模式
单机模式就是只有单个redis提供服务,如下图
长处:
- 架构简略,易于保护
毛病:
- 单台服务器内存空间无限,无奈寄存太多的数据量
- 存在单点故障
- 读写压力较大
单机模式实用于内部测试、我的项目规模小
的场景
2.2 主从模式
因为单个redis节点的读写压力较大,所以引出了主从复制形式,可实现读写拆散,读操作能够由slave节点来反对,升高master节点的压力。如下图
主从复制是redis实现高可用的基石,后续的两种高可用计划 哨兵模式 或者 cluster集群模式 都须要有主从复制的撑持。
长处:
- 读写拆散。通过读写拆散来升高master节点的压力
- 领有多个数据正本
毛病:
- 单个master内存空间无限,无奈寄存太多的数据量
- 仍然只有master节点能够解决写申请,存在瓶颈
- 当master节点产生故障下线时,须要人工地将某个slave节点切换为新的master节点,并且客户端须要切换到连贯新的master节点
主从模式实用于外部性能测试、我的项目规模小
的场景
2.3 哨兵模式
哨兵模式是在主从复制的根底上,增加哨兵(实际上就是个redis的利用过程)来监控master节点和slave节点,当master节点产生故障下线时,哨兵主动地将某个slave节点切换为master节点,且客户端不须要去切换连贯新的master节点。(个别须要部署哨兵集群,避免哨兵的单点故障)
长处:
- 读写拆散。通过读写拆散来升高master节点的压力
- 领有多个数据正本
- 主动故障转移。当master节点产生故障下线时,哨兵主动地将某个slave节点切换为新的master节点,并且客户端不须要切换连贯新的master节点(因为客户端连贯哨兵集群,而不间接连贯master节点)
毛病:
- 单个master内存空间无限,无奈寄存太多的数据量
- 仍然只有master节点能够解决写申请,存在瓶颈
哨兵模式实用于生产环境、我的项目规模中等
的场景
2.3.1 故障转移 failover
当master节点下线之后,哨兵主动将slave节点切换为新的master节点,这一过程称为故障转移(failover)。故障转移的大抵步骤如下:
- 检测master是否主观下线
sentinel每隔1秒钟,向所有的master、slave、sentinel发送ping命令,通过其余服务器的回复来判断是否在线(当ping的实例在间断down-after-milliseconds配置的工夫内返回有效命令或无响应,则以后sentinel认为其主观下线
,对所有master、slave、sentinel都实用) - 检测master是否主观下线
以后sentinel要想判断master是否主观下线,须要询问其余sentinel,并且认为master主观下线的总数须要达到quorum配置的值,则以后sentinel将该master标记为主观下线
- 选举哨兵leader
以后sentinel将该master标记为主观下线后,会给其余sentinel再发送命令,其余sentinel收到申请后将其设置为leader(这个设置是先到先得的,sentinel先收到谁的设置申请,就将谁设置为leader)。发送命令的sentinel会依据其余sentinel回复的后果来判断本人是否被该sentinel设置为leader,如果以后sentinel被其余sentinel设置为leader的数量超过半数sentinel,那么以后sentinel会认为本人曾经成为leader,并开始后续故障转移工作
。如果没有任何一个sentinel达到成为leader的要求,将会从新选举直到产生leader为止 - 故障转移由哨兵leader全权负责
从slave列表中抉择最佳的slave作为新的master。让其余slave复制新的master,并且持续监听旧master,如果其上线,将其设置为新的master的slave
2.4 集群模式
既然哨兵模式曾经具备了高可用性,为什么还须要cluster模式?因为哨兵模式还是没有解决只有master节点能够解决写的问题,仍然存在写瓶颈。而cluster集群模式应用"分片"(每个master解决一部分slot)的模式来解决所有key,能够有多个master来解决写操作,从而来解决写瓶颈问题。如下图
长处:
- 主动故障转移。当某个master节点产生故障下线时,集群主动地将其对应的某个slave节点代替它
- 当现有redis集群不足以撑持整个零碎的压力时,能够横向拓展集群
毛病:
- 无奈执行批量操作,如mget
- 当redis节点很多的时候,因为每个节点都须要跟其余节点通信,整个集群的性能会升高
- 保护老本较高
redis cluster模式实用于生产环境、我的项目规模大型
的场景
2.4.1 故障转移 failover
与哨兵模式一样,从节点的故障并不会影响集群工作
,对应的主节点只会记住本人的哪个从节点下线了,当从节点重连后,会持续复制主节点的数据。
只有主节点故障才须要故障转移。cluster集群模式不须要哨兵,本身已具备了故障转移性能。因为集群内的每个节点都会相互进行通信,节点之间通过gossip协定进行通信,通过这种机制来发现故障并进行故障转移
。然而要达到故障转移,须要解决几个问题?
- 故障发现:如何判断某个master节点故障了?
redis采纳少数投票的计划
- 选取slave节点:master有多个slave节点的时候,应该抉择哪个slave节点成为新的master
故障发现
和哨兵模式相似,故障发现也经验两个阶段:PFAIL(主观下线)和FAIL(主观下线)
。
假如当初有3个master节点,别离为节点1,节点2,节点3。比方节点1判断节点3下线,那么它会标记节点3的状态为PFAIL,节点1会通过gossip协定把这个信息发送给其余节点,接管到信息的节点会进行对节点3主观下线的状态断定。当集群中有超过半数的节点认为节点3处于PFAIL,那么节点1就断定节点3为FAIL,并立刻向集群所有节点(包含节点3的子节点)播送这个信息。
故障转移
当节点3的slave发现自己的master变为fail状态时,便尝试进行故障转移failover,以成为新的master。因为一个master可能有多个slave,所以这些slave须要竞争成为master节点,过程如下:
- slave1、slave2都发现自己的master状态变为fail
- 它们将本人记录的集群currentEpoch(选举周期)加1,并应用gossip协定播送failover_auth_request信息
- 其余master节点收到slave1和slave2的音讯,会给slave1或slave2发送failover_auth_ack,
在一个选举周期中,一个master只会响应第一个给它发消息的slave
- slave们收集返回的failover_auth_ack,当收到超过半数的master的ack音讯后变成新的master
- 最初向整个集群播送当初本人是master,同时负责旧master所有slots的信息
- 其余节点接管到信息后,更新本人的保护状态
三、总结
redis的部署模式介绍到这里,总体看下来redis cluster集群模式的利大于弊,所以在较大规模的我的项目中个别应用该模式,但在中小规模的我的项目中,抉择主从模式 或 哨兵模式亦可。