4 種 Redis 集群方案介紹 + 優(yōu)缺點(diǎn)對(duì)比
1、主從模式

主從模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 主從結(jié)構(gòu)具有讀寫(xiě)分離,提高效率、數(shù)據(jù)備份,提供多個(gè)副本等優(yōu)點(diǎn)。
不足: 最大的不足就是主從模式不具備自動(dòng)容錯(cuò)和恢復(fù)功能,主節(jié)點(diǎn)故障,集群則無(wú)法進(jìn)行工作,可用性比較低,從節(jié)點(diǎn)升主節(jié)點(diǎn)需要人工手動(dòng)干預(yù)。
在從數(shù)據(jù)庫(kù)中使用
SLAVE NO ONE命令將從數(shù)據(jù)庫(kù)提升成主數(shù)據(jù)繼續(xù)服務(wù)。啟動(dòng)之前崩潰的主數(shù)據(jù)庫(kù),然后使用SLAVEOF命令將其設(shè)置成新的主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù),即可同步數(shù)據(jù)。
2、哨兵模式


(1)哨兵模式的作用:
(2)哨兵實(shí)現(xiàn)原理
sentinel monitor master-name ip port quorum
#master-name是主數(shù)據(jù)庫(kù)的名字
#ip和port 是當(dāng)前主數(shù)據(jù)庫(kù)地址和端口號(hào)
#quorum表示在執(zhí)行故障切換操作前,需要多少哨兵節(jié)點(diǎn)同意。
訂閱主數(shù)據(jù)庫(kù)
_sentinel_:hello頻道以獲取同樣監(jiān)控該數(shù)據(jù)庫(kù)的哨兵節(jié)點(diǎn)信息定期向主數(shù)據(jù)庫(kù)發(fā)送info命令,獲取主數(shù)據(jù)庫(kù)本身的信息。
_sentinel_:hello頻道發(fā)送自己的信息。作用是將自己的監(jiān)控?cái)?shù)據(jù)和哨兵分享。每個(gè)哨兵會(huì)訂閱數(shù)據(jù)庫(kù)的_sentinel:hello頻道,當(dāng)其他哨兵收到消息后,會(huì)判斷該哨兵是不是新的哨兵,如果是則將其加入哨兵列表,并建立連接。(3)主觀(guān)下線(xiàn)和客觀(guān)下線(xiàn)
down-after-millisecond)后,如果節(jié)點(diǎn)未回復(fù),則哨兵認(rèn)為主觀(guān)下線(xiàn)。主觀(guān)下線(xiàn)表示當(dāng)前哨兵認(rèn)為該節(jié)點(diǎn)已經(jīng)下面,如果該節(jié)點(diǎn)為主數(shù)據(jù)庫(kù),哨兵會(huì)進(jìn)一步判斷是夠需要對(duì)其進(jìn)行故障切換,這時(shí)候就要發(fā)送命令(SENTINEL is-master-down-by-addr)詢(xún)問(wèn)其他哨兵節(jié)點(diǎn)是否認(rèn)為該主節(jié)點(diǎn)是主觀(guān)下線(xiàn),當(dāng)達(dá)到指定數(shù)量(quorum)時(shí),哨兵就會(huì)認(rèn)為是客觀(guān)下線(xiàn)。選出領(lǐng)頭哨兵。
領(lǐng)頭哨兵所有的slave選出優(yōu)先級(jí)最高的從數(shù)據(jù)庫(kù)。優(yōu)先級(jí)可以通過(guò)
slave-priority選項(xiàng)設(shè)置。如果優(yōu)先級(jí)相同,則從復(fù)制的命令偏移量越大(即復(fù)制同步數(shù)據(jù)越多,數(shù)據(jù)越新),越優(yōu)先。
如果以上條件都一樣,則選擇run ID較小的從數(shù)據(jù)庫(kù)。
slave no one命令升級(jí)為主數(shù)據(jù)庫(kù),并發(fā)送slaveof命令將其他從節(jié)點(diǎn)的主數(shù)據(jù)庫(kù)設(shè)置為新的主數(shù)據(jù)庫(kù)。(4)哨兵模式優(yōu)缺點(diǎn)
哨兵模式是基于主從模式的,解決可主從模式中master故障不可以自動(dòng)切換故障的問(wèn)題。
是一種中心化的集群實(shí)現(xiàn)方案:始終只有一個(gè)Redis主機(jī)來(lái)接收和處理寫(xiě)請(qǐng)求,寫(xiě)操作受單機(jī)瓶頸影響。
集群里所有節(jié)點(diǎn)保存的都是全量數(shù)據(jù),浪費(fèi)內(nèi)存空間,沒(méi)有真正實(shí)現(xiàn)分布式存儲(chǔ)。數(shù)據(jù)量過(guò)大時(shí),主從同步嚴(yán)重影響master的性能。
Redis主機(jī)宕機(jī)后,哨兵模式正在投票選舉的情況之外,因?yàn)橥镀边x舉結(jié)束之前,誰(shuí)也不知道主機(jī)和從機(jī)是誰(shuí),此時(shí)Redis也會(huì)開(kāi)啟保護(hù)機(jī)制,禁止寫(xiě)操作,直到選舉出了新的Redis主機(jī)。
3、各大廠(chǎng)的Redis集群方案
(1)客戶(hù)端分片

1.一致性哈希算法:
2.實(shí)現(xiàn)方式:一致性hash算法,比如MURMUR_HASH散列算法、ketamahash算法
這是一種靜態(tài)的分片方案,需要增加或者減少Redis實(shí)例的數(shù)量,需要手工調(diào)整分片的程序。
運(yùn)維成本比較高,集群的數(shù)據(jù)出了任何問(wèn)題都需要運(yùn)維人員和開(kāi)發(fā)人員一起合作,減緩了解決問(wèn)題的速度,增加了跨部門(mén)溝通的成本。
在不同的客戶(hù)端程序中,維護(hù)相同的路由分片邏輯成本巨大。比如:java項(xiàng)目、PHP項(xiàng)目里共用一套R(shí)edis集群,路由分片邏輯分別需要寫(xiě)兩套一樣的邏輯,以后維護(hù)也是兩套。
(2)代理分片

Twemproxy的優(yōu)點(diǎn):
客戶(hù)端像連接Redis實(shí)例一樣連接Twemproxy,不需要改任何的代碼邏輯。
支持無(wú)效Redis實(shí)例的自動(dòng)刪除。
Twemproxy與Redis實(shí)例保持連接,減少了客戶(hù)端與Redis實(shí)例的連接數(shù)。
Twemproxy的不足:
由于Redis客戶(hù)端的每個(gè)請(qǐng)求都經(jīng)過(guò)Twemproxy代理才能到達(dá)Redis服務(wù)器,這個(gè)過(guò)程中會(huì)產(chǎn)生性能損失。
沒(méi)有友好的監(jiān)控管理后臺(tái)界面,不利于運(yùn)維監(jiān)控。
Twemproxy最大的痛點(diǎn)在于,無(wú)法平滑地?cái)U(kuò)容/縮容。對(duì)于運(yùn)維人員來(lái)說(shuō),當(dāng)因?yàn)闃I(yè)務(wù)需要增加Redis實(shí)例時(shí)工作量非常大。
(3)Codis

Redis Server Group,其通過(guò)指定一個(gè)主CodisRedis和一個(gè)或多個(gè)從CodisRedis,實(shí)現(xiàn)了Redis集群的高可用。當(dāng)一個(gè)主CodisRedis掛掉時(shí),Codis不會(huì)自動(dòng)把一個(gè)從CodisRedis提升為主CodisRedis,這涉及數(shù)據(jù)的一致性問(wèn)題(Redis本身的數(shù)據(jù)同步是采用主從異步復(fù)制,當(dāng)數(shù)據(jù)在主CodisRedis寫(xiě)入成功時(shí),從CodisRedis是否已讀入這個(gè)數(shù)據(jù)是沒(méi)法保證的),需要管理員在管理界面上手動(dòng)把從CodisRedis提升為主CodisRedis。Codis-ha,這個(gè)工具會(huì)在檢測(cè)到主CodisRedis掛掉的時(shí)候?qū)⑵湎戮€(xiàn)并提升一個(gè)從CodisRedis為主CodisRedis。crc32(key)%1024”獲得一個(gè)數(shù)字,這個(gè)數(shù)字的范圍一定是1~1024之間,Key就放到這個(gè)數(shù)字對(duì)應(yīng)的slot。crc32(key)%1024”得到的數(shù)字是5,就放到編碼為5的slot(箱子)。1個(gè)slot只能放1個(gè)Redis Server Group,不能把1個(gè)slot放到多個(gè)Redis Server Group中。1個(gè)Redis Server Group最少可以存放1個(gè)slot,最大可以存放1024個(gè)slot。因此,Codis中最多可以指定1024個(gè)Redis Server Group。Redis Server Group(Redis實(shí)例),能安全、透明地遷移數(shù)據(jù),這也是Codis 有別于Twemproxy等靜態(tài)分布式 Redis 解決方案的地方。Codis增加了Redis Server Group后,就牽涉到slot的遷移問(wèn)題。Redis Server Group,Redis Server Group和slot的對(duì)應(yīng)關(guān)系如下。

4、Redis Cluster
哨兵模式下每臺(tái) Redis 服務(wù)器都存儲(chǔ)相同的數(shù)據(jù),很浪費(fèi)內(nèi)存空間;數(shù)據(jù)量太大,主從同步時(shí)嚴(yán)重影響了master性能。
哨兵模式是中心化的集群實(shí)現(xiàn)方案,每個(gè)從機(jī)和主機(jī)的耦合度很高,master宕機(jī)到salve選舉master恢復(fù)期間服務(wù)不可用。
哨兵模式始終只有一個(gè)Redis主機(jī)來(lái)接收和處理寫(xiě)請(qǐng)求,寫(xiě)操作還是受單機(jī)瓶頸影響,沒(méi)有實(shí)現(xiàn)真正的分布式架構(gòu)。

集群完全去中心化,采用多主多從;所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。
客戶(hù)端與 Redis 節(jié)點(diǎn)直連,不需要中間代理層。客戶(hù)端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可。
每一個(gè)分區(qū)都是由一個(gè)Redis主機(jī)和多個(gè)從機(jī)組成,分片和分片之間是相互平行的。
每一個(gè)master節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽,以及槽所映射的鍵值數(shù)據(jù);集群中每個(gè)節(jié)點(diǎn)都有全量的槽信息,通過(guò)槽每個(gè)node都知道具體數(shù)據(jù)存儲(chǔ)到哪個(gè)node上。
來(lái)自:掘金,作者:有鹽先生
鏈接:https://blog.csdn.net/Seky_fei/article/details/107239765
