Redis在3.0版正式引入redis-cluster集群這個特性。Redis集群是一個提供在多個Redis間節(jié)點(diǎn)間共享數(shù)據(jù)的程序集。Redis集群是一個分布式(distributed)、容錯(fault-tolerant)的Redis內(nèi)存K/V服務(wù),集群可以使用的功能是普通單機(jī)Redis所能使用的功能的一個子集(subset),比如Redis集群并不支持處理多個keys的命令,因為這需要在不同的節(jié)點(diǎn)間移動數(shù)據(jù),從而達(dá)不到像Redis那樣的性能,在高負(fù)載的情況下可能會導(dǎo)致不可預(yù)料的錯誤。還有比如set里的并集(unions)和交集(intersections)操作,就沒有實(shí)現(xiàn)。通常來說,那些處理命令的節(jié)點(diǎn)獲取不到鍵值的所有操作都不會被實(shí)現(xiàn)。在將來,用戶或許可以通過使用MIGRATE COPY命令,在集群上用計算節(jié)點(diǎn)(Computation Nodes) 來執(zhí)行多鍵值的只讀操作, 但Redis集群本身不會執(zhí)行復(fù)雜的多鍵值操作來把鍵值在節(jié)點(diǎn)間移來移去。Redis集群不像單機(jī)版本的Redis那樣支持多個數(shù)據(jù)庫,集群只有數(shù)據(jù)庫0,而且也不支持SELECT命令。Redis集群通過分區(qū)來提供一定程度的可用性,在實(shí)際環(huán)境中當(dāng)某個節(jié)點(diǎn)宕機(jī)或者不可達(dá)的情況下繼續(xù)處理命令。
Redis集群的優(yōu)點(diǎn):
無中心架構(gòu),分布式提供服務(wù)。數(shù)據(jù)按照slot存儲分布在多個redis實(shí)例上。增加slave做standby數(shù)據(jù)副本,用于failover,使集群快速恢復(fù)。實(shí)現(xiàn)故障auto failover,節(jié)點(diǎn)之間通過gossip協(xié)議交換狀態(tài)信息;投票機(jī)制完成slave到master角色的提升。支持在線增加或減少節(jié)點(diǎn)。降低硬件成本和運(yùn)維成本,提高系統(tǒng)的擴(kuò)展性和可用性。
Redis集群的缺點(diǎn):
client實(shí)現(xiàn)復(fù)雜,驅(qū)動要求實(shí)現(xiàn)smart client,緩存slots mapping信息并及時更新。目前僅JedisCluster相對成熟,異常處理部分還不完善,比如常見的“max redirect exception”??蛻舳说牟怀墒?,影響應(yīng)用的穩(wěn)定性,提高開發(fā)難度。節(jié)點(diǎn)會因為某些原因發(fā)生阻塞(阻塞時間大于clutser-node-timeout),被判斷下線。這種failover是沒有必要,sentinel也存在這種切換場景。
#hosts文件配置
cat >> /etc/hosts << EOF 192.168.5.65 redis65 192.168.5.66 redis65 EOF
一、搭建redis5.0集群
從redis 3.0之后版本支持redis-cluster集群,redis-4.0.0開始支持module,redis-5.0.0開始支持類似于kafka那樣的消息隊列,Redis-Cluster采用無中心結(jié)構(gòu),每個節(jié)點(diǎn)保存數(shù)據(jù)和整個集群狀態(tài),每個節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接。這樣就可以很好的保證redis的高可用性,下面就來部署個Redis Cluster,在兩臺服務(wù)器上部署6個redis節(jié)點(diǎn)
IP和端口配置文件名