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

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


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

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

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

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

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

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

