redis cluster 集群架构
创始人
2025-05-29 05:30:14

master-slave -sentinel集群master 写单点,无法扩容。

Redis cluster 解决 单个master-slave-sentinel集群 无法水平扩容的问题,由gossip(病毒传输协议实现无中心的集群状态维护);

gossip 集群节点发现

redis-cluster架构中,被设计成共有16384(2的14次方)个hash slot。每个master分得一部分slot,其算法为:hash_slot = crc16(key) mod 16384 ,这就找到对应slot。群集至少需要3主3从,且每个实例使用不同的配置文件。

在cluster架构下,默认的,一般redis-master用于接收读写,而redis-slave则用于备份,当有请求是在向slave发起时,会直接重定向到对应key所在的master来处理。但如果不介意读取的是redis-cluster中有可能过期的数据并且对写请求不感兴趣时,则亦可通过readonly命令,将slave设置成可读,然后通过slave获取相关的key,达到读写分离。

redis-cluster 不可用 的情况:

1 集群主库半数宕机(无论是否从库存活)

2 集群某一节点的主从全数宕机。

当某个master挂掉后,在cluster集群仍然可用的前提下,由于某个master可能有多个slave,某个salve将提升为master节点,那么就会存在竞争,那么此时它们的选举机制是怎样的呢?于是

要理解下面的过程我们需要了解一些概念:

currentEpoch:

这是一个集群状态相关的概念,可以当作记录集群状态变更的递增版本号。每个集群节点,都会通过 server.cluster->currentEpoch 记录当前的 currentEpoch。

集群节点创建时,不管是 master 还是 slave,都置 currentEpoch 为 0。当前节点接收到来自其他节点的包时,如果发送者的 currentEpoch(消息头部会包含发送者的 currentEpoch)大于当前节点的currentEpoch,那么当前节点会更新 currentEpoch 为发送者的 currentEpoch。因此,集群中所有节点的 currentEpoch 最终会达成一致,相当于对集群状态的认知达成了一致。

其过程如下:

1.slave发现自己的master变为FAIL

2.发起选举前,slave先给自己的epoch(即currentEpoch)增一,然后请求其它master给自己投票。slave是通过广播FAILOVER_AUTH_REQUEST包给集中的每一个masters。

3.slave发起投票后,会等待至少两倍NODE_TIMEOUT时长接收投票结果,不管NODE_TIMEOUT何值,也至少会等待2秒。

4.master接收投票后给slave响应FAILOVER_AUTH_ACK,并且在(NODE_TIMEOUT*2)时间内不会给同一master的其它slave投票。

5.如果slave收到FAILOVER_AUTH_ACK响应的epoch值小于自己的epoch,则会直接丢弃。一旦slave收到多数master的FAILOVER_AUTH_ACK,则声明自己赢得了选举。

6.如果slave在两倍的NODE_TIMEOUT时间内(至少2秒)未赢得选举,则放弃本次选举,然后在四倍NODE_TIMEOUT时间(至少4秒)后重新发起选举。

只所以强制延迟至少0.5秒选举,是为确保master的fail状态在整个集群内传开,否则可能只有小部分master知晓,而master只会给处于fail状态的master的slaves投票。如果一个slave的master状态不是fail,则其它master不会给它投票,Redis通过八卦协议(即Gossip协议,也叫谣言协议)传播fail。而在固定延迟上再加一个随机延迟,是为了避免多个slaves同时发起选举。

延迟计算公式:

DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。

相关内容

热门资讯

春节的英语作文(优秀6篇) 春节的英语作文 篇一The Spring FestivalThe Spring Festival, ...
英语损人的句子【最新3篇】 英语损人的句子 篇一英语是一门全球通用的语言,但有时候人们在使用英语时可能会不小心使用一些损人的句子...
蝇王英语读后感 蝇王英语读后感  当仔细品读一部作品后,想必你有不少可以分享的'东西,是时候静下心来好好写写读后感了...
写给某人的一封信英文 写给某人的一封信英文范文  在日常的学习、工作、生活中,大家都经常看到书信的身影吧,书信具有明确而特...
话题英语作文(通用6篇) 话题英语作文 篇一: The Importance of Learning a Second Lan...