簡述
redis cluster是Redis的分布式解決方案,在3.0版本推出后有效地解決了redis分布式方面的需求.
自動(dòng)將數(shù)據(jù)進(jìn)行分片还最,每個(gè)master上放一部分?jǐn)?shù)據(jù)事富,提供內(nèi)置的高可用支持,部分master不可用時(shí),還是可以繼續(xù)工作的哮内。
支撐N個(gè)redis master node,每個(gè)master node都可以掛載多個(gè)slave node壮韭。
高可用北发,因?yàn)槊總€(gè)master都有salve節(jié)點(diǎn),那么如果mater掛掉喷屋,redis cluster這套機(jī)制琳拨,就會(huì)自動(dòng)將某個(gè)slave切換成master。
redis-cluster的hash slot算法
redis cluster有固定的16384個(gè)hash slot逼蒙,對(duì)每個(gè)key計(jì)算CRC16值从绘,然后對(duì)16384取模,可以獲取key對(duì)應(yīng)的hash slot是牢。
redis cluster中每個(gè)master都會(huì)持有部分slot僵井,比如有3個(gè)master,那么可能每個(gè)master持有5000多個(gè)hash slot驳棱。
hash slot讓node的增加和移除很簡單批什,增加一個(gè)master,就將其他master的hash slot移動(dòng)部分過去社搅,減少一個(gè)master驻债,就將它的hash slot移動(dòng)到其他master上去。
為什么是16384個(gè)hash slot形葬?
各個(gè)節(jié)點(diǎn)間會(huì)通過心跳包來交換信息合呐,正常的心跳包攜帶一個(gè)節(jié)點(diǎn)的全部配置。
slot信息使用bitmap來存放笙以。
如果slot槽過多淌实,會(huì)導(dǎo)致package過大,導(dǎo)致傳輸數(shù)據(jù)過大。16k個(gè)槽剛好是2k的bitmap可以存放拆祈。這是一個(gè)設(shè)計(jì)的平衡恨闪。
16384÷8÷1024=2kb
集群是如何判斷是否有某個(gè)節(jié)點(diǎn)掛掉
首先要說的是,每一個(gè)節(jié)點(diǎn)都存有這個(gè)集群所有主節(jié)點(diǎn)以及從節(jié)點(diǎn)的信息放坏。它們之間通過互相的ping-pong判斷是否節(jié)點(diǎn)可以連接上咙咽。如果有一半以上的節(jié)點(diǎn)去ping一個(gè)節(jié)點(diǎn)的時(shí)候沒有回應(yīng),集群就認(rèn)為這個(gè)節(jié)點(diǎn)宕機(jī)了淤年,然后去連接它的備用節(jié)點(diǎn)钧敞。
集群進(jìn)入fail狀態(tài)的必要條件
A、某個(gè)主節(jié)點(diǎn)和所有從節(jié)點(diǎn)全部掛掉互亮,我們集群就進(jìn)入faill狀態(tài)犁享。
B余素、如果集群超過半數(shù)以上master掛掉豹休,無論是否有slave,集群進(jìn)入fail狀態(tài).
C桨吊、如果集群任意master掛掉,且當(dāng)前master沒有slave.集群進(jìn)入fail狀態(tài)