Redis是一個(gè)高性能的In-memory key-value存儲(chǔ)系統(tǒng),廣泛用于緩存、消息隊(duì)列、排行榜等場(chǎng)景。隨著數(shù)據(jù)量的增長(zhǎng),單機(jī)Redis的容量限制也逐漸變得不足以滿足需求。因此,Redis集群逐漸成為解決方案之一。但是,為什么Redis集群至少需要6個(gè)節(jié)點(diǎn)呢?
集群架構(gòu)與數(shù)據(jù)分片
Redis集群的核心思想是將數(shù)據(jù)分片到多個(gè)節(jié)點(diǎn),提高整個(gè)系統(tǒng)的容量與性能。這需要多個(gè)節(jié)點(diǎn)協(xié)同工作,并保證數(shù)據(jù)高可用。一個(gè)Redis集群通常包含6個(gè)節(jié)點(diǎn)以上,其中3個(gè)為主節(jié)點(diǎn),3個(gè)為從節(jié)點(diǎn)。主節(jié)點(diǎn)接收讀寫請(qǐng)求,從節(jié)點(diǎn)則負(fù)責(zé)備份。
數(shù)據(jù)分片是Redis集群中的核心機(jī)制之一。Redis集群采用哈希槽(hash slot)的方式將數(shù)據(jù)分片到不同的節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)負(fù)責(zé)多個(gè)哈希槽。一個(gè)Redis集群有16384個(gè)哈希槽可以用于數(shù)據(jù)分片。因此,至少需要6個(gè)節(jié)點(diǎn)來(lái)保證集群的高可用性,是因?yàn)樾枰WC至少有3個(gè)節(jié)點(diǎn)對(duì)應(yīng)的哈希槽數(shù)據(jù)備份。
集群Quorum與Failover
Redis集群中Quorum的概念指的是節(jié)點(diǎn)的“活躍程度”,例如在一個(gè)6個(gè)節(jié)點(diǎn)的集群中,活躍節(jié)點(diǎn)數(shù)為4,則Quorum的值為4。Quorum的大小是一個(gè)關(guān)鍵參數(shù),用于保證Redis集群的健壯性,防止出現(xiàn)腦裂問(wèn)題。腦裂問(wèn)題指的是集群出現(xiàn)分裂導(dǎo)致有多個(gè)主節(jié)點(diǎn)出現(xiàn)的情況。
Redis集群中Failover(故障轉(zhuǎn)移)是一個(gè)非常重要的機(jī)制。當(dāng)主節(jié)點(diǎn)失效時(shí),Redis需要自動(dòng)選擇一個(gè)新的主節(jié)點(diǎn)和從節(jié)點(diǎn)。在6個(gè)節(jié)點(diǎn)的Redis集群中,有3個(gè)主節(jié)點(diǎn)和3個(gè)從節(jié)點(diǎn)。當(dāng)某個(gè)主節(jié)點(diǎn)失效時(shí),需要選出一個(gè)新的主節(jié)點(diǎn),讓其余從節(jié)點(diǎn)和新的主節(jié)點(diǎn)進(jìn)行同步。Redis集群采用了Raft算法來(lái)實(shí)現(xiàn)Failover的涉及。同樣,F(xiàn)ailover也需要在Quorum的基礎(chǔ)上實(shí)現(xiàn),因此,Redis集群至少需要6個(gè)節(jié)點(diǎn)。