redis集群優(yōu)缺點

[toc]

集群方案

  • 主從復(fù)制
  • 哨兵模
  • Redis-Cluster
  • ShardedJedisPool
  • 中間件
方案 優(yōu)點 缺點
主從復(fù)制,keepalive 簡單 不能橫向擴(kuò)展
哨兵模 簡單,需要配置所有節(jié)點 不能橫向擴(kuò)展
Redis-Cluster 可以橫向擴(kuò)展, 只需連接集中某幾個節(jié)點即可
ShardedJedisPool 可以橫向擴(kuò)展 需要對節(jié)點做keepalive,不然斷掉一個節(jié)點集群不可用
中間件 可以橫向擴(kuò)展 有性能損失

1.主從復(fù)制

主從復(fù)制原理:

image.png

從服務(wù)器連接主服務(wù)器,發(fā)送SYNC命令;
主服務(wù)器接收到SYNC命名后,開始執(zhí)行BGSAVE命令生成RDB文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫命令;
主服務(wù)器BGSAVE執(zhí)行完后,向所有從服務(wù)器發(fā)送快照文件,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫命令;
從服務(wù)器收到快照文件后丟棄所有舊數(shù)據(jù),載入收到的快照;
主服務(wù)器快照發(fā)送完畢后開始向從服務(wù)器發(fā)送緩沖區(qū)中的寫命令;
從服務(wù)器完成對快照的載入,開始接收命令請求,并執(zhí)行來自主服務(wù)器緩沖區(qū)的寫命令;(從服務(wù)器初始化完成)
主服務(wù)器每執(zhí)行一個寫命令就會向從服務(wù)器發(fā)送相同的寫命令,從服務(wù)器接收并執(zhí)行收到的寫命令(從服務(wù)器初始化完成后的操作)
主從復(fù)制優(yōu)缺點:

優(yōu)點:

支持主從復(fù)制,主機(jī)會自動將數(shù)據(jù)同步到從機(jī),可以進(jìn)行讀寫分離
為了分載Master的讀操作壓力,Slave服務(wù)器可以為客戶端提供只讀操作的服務(wù),寫服務(wù)仍然必須由Master來完成
Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。
Master Server是以非阻塞的方式為Slaves提供服務(wù)。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。
Slave Server同樣是以非阻塞的方式完成數(shù)據(jù)同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數(shù)據(jù)

缺點:

Redis不具備自動容錯和恢復(fù)功能,主機(jī)從機(jī)的宕機(jī)都會導(dǎo)致前端部分讀寫請求失敗,需要等待機(jī)器重啟或者手動切換前端的IP才能恢復(fù)。
主機(jī)宕機(jī),宕機(jī)前有部分?jǐn)?shù)據(jù)未能及時同步到從機(jī),切換IP后還會引入數(shù)據(jù)不一致的問題,降低了系統(tǒng)的可用性。
Redis較難支持在線擴(kuò)容,在集群容量達(dá)到上限時在線擴(kuò)容會變得很復(fù)雜。

2.哨兵模式

image.png
image.png
image.png

當(dāng)主服務(wù)器中斷服務(wù)后,可以將一個從服務(wù)器升級為主服務(wù)器,以便繼續(xù)提供服務(wù),但是這個過程需要人工手動來操作。 為此,Redis 2.8中提供了哨兵工具來實現(xiàn)自動化的系統(tǒng)監(jiān)控和故障恢復(fù)功能。

哨兵的作用就是監(jiān)控Redis系統(tǒng)的運行狀況。它的功能包括以下兩個。

  • (1)監(jiān)控主服務(wù)器和從服務(wù)器是否正常運行。
  • (2)主服務(wù)器出現(xiàn)故障時自動將從服務(wù)器轉(zhuǎn)換為主服務(wù)器。

哨兵的工作方式:

每個Sentinel(哨兵)進(jìn)程以每秒鐘一次的頻率向整個集群中的Master主服務(wù)器,Slave從服務(wù)器以及其他Sentinel(哨兵)進(jìn)程發(fā)送一個 PING 命令。
如果一個實例(instance)距離最后一次有效回復(fù) PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel(哨兵)進(jìn)程標(biāo)記為主觀下線(SDOWN)
如果一個Master主服務(wù)器被標(biāo)記為主觀下線(SDOWN),則正在監(jiān)視這個Master主服務(wù)器的所有 Sentinel(哨兵)進(jìn)程要以每秒一次的頻率確認(rèn)Master主服務(wù)器的確進(jìn)入了主觀下線狀態(tài)
當(dāng)有足夠數(shù)量的 Sentinel(哨兵)進(jìn)程(大于等于配置文件指定的值)在指定的時間范圍內(nèi)確認(rèn)Master主服務(wù)器進(jìn)入了主觀下線狀態(tài)(SDOWN), 則Master主服務(wù)器會被標(biāo)記為客觀下線(ODOWN)
在一般情況下, 每個 Sentinel(哨兵)進(jìn)程會以每 10 秒一次的頻率向集群中的所有Master主服務(wù)器、Slave從服務(wù)器發(fā)送 INFO 命令。
當(dāng)Master主服務(wù)器被 Sentinel(哨兵)進(jìn)程標(biāo)記為客觀下線(ODOWN)時,Sentinel(哨兵)進(jìn)程向下線的 Master主服務(wù)器的所有 Slave從服務(wù)器發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
若沒有足夠數(shù)量的 Sentinel(哨兵)進(jìn)程同意 Master主服務(wù)器下線, Master主服務(wù)器的客觀下線狀態(tài)就會被移除。若 Master主服務(wù)器重新向 Sentinel(哨兵)進(jìn)程發(fā)送 PING 命令返回有效回復(fù),Master主服務(wù)器的主觀下線狀態(tài)就會被移除。
哨兵模式的優(yōu)缺點

優(yōu)點:

哨兵模式是基于主從模式的,所有主從的優(yōu)點,哨兵模式都具有。
主從可以自動切換,系統(tǒng)更健壯,可用性更高。

缺點:

Redis較難支持在線擴(kuò)容,在集群容量達(dá)到上限時在線擴(kuò)容會變得很復(fù)雜。

3.Redis-Cluster集群

image.png

redis的哨兵模式基本已經(jīng)可以實現(xiàn)高可用,讀寫分離 ,但是在這種模式下每臺redis服務(wù)器都存儲相同的數(shù)據(jù),很浪費內(nèi)存,所以在redis3.0上加入了cluster模式,實現(xiàn)的redis的分布式存儲,也就是說每臺redis節(jié)點上存儲不同的內(nèi)容。

Redis-Cluster采用無中心結(jié)構(gòu),它的特點如下:

所有的redis節(jié)點彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。

節(jié)點的fail是通過集群中超過半數(shù)的節(jié)點檢測失效時才生效。

客戶端與redis節(jié)點直連,不需要中間代理層.客戶端不需要連接集群所有節(jié)點,連接集群中任何一個可用節(jié)點即可。

工作方式:

在redis的每一個節(jié)點上,都有這么兩個東西,一個是插槽(slot),它的的取值范圍是:0-16383。還有一個就是cluster,可以理解為是一個集群管理的插件。當(dāng)我們的存取的key到達(dá)的時候,redis會根據(jù)crc16的算法得出一個結(jié)果,然后把結(jié)果對 16384 求余數(shù),這樣每個 key 都會對應(yīng)一個編號在 0-16383 之間的哈希槽,通過這個值,去找到對應(yīng)的插槽所對應(yīng)的節(jié)點,然后直接自動跳轉(zhuǎn)到這個對應(yīng)的節(jié)點上進(jìn)行存取操作。

為了保證高可用,redis-cluster集群引入了主從模式,一個主節(jié)點對應(yīng)一個或者多個從節(jié)點,當(dāng)主節(jié)點宕機(jī)的時候,就會啟用從節(jié)點。當(dāng)其它主節(jié)點ping一個主節(jié)點A時,如果半數(shù)以上的主節(jié)點與A通信超時,那么認(rèn)為主節(jié)點A宕機(jī)了。如果主節(jié)點A和它的從節(jié)點A1都宕機(jī)了,那么該集群就無法再提供服務(wù)了。

Redis client Sharding

java redis客戶端驅(qū)動jedis,已支持Redis Sharding功能,即ShardedJedis以及結(jié)合緩存池的ShardedJedisPool。

Jedis的Redis Sharding實現(xiàn)具有如下特點:

采用一致性哈希算法(consistent hashing),將key和節(jié)點name同時hashing,然后進(jìn)行映射匹配,采用的算法是MURMUR_HASH。采用一致性哈希而不是采用簡單類似哈希求模映射的主要原因是當(dāng)增加或減少節(jié)點時,不會產(chǎn)生由于重新匹配造成的rehashing。一致性哈希只影響相鄰節(jié)點key分配,影響量小。

2.為了避免一致性哈希只影響相鄰節(jié)點造成節(jié)點分配壓力,ShardedJedis會對每個Redis節(jié)點根據(jù)名字(沒有,Jedis會賦予缺省名字)會虛擬化出160個虛擬節(jié)點進(jìn)行散列。根據(jù)權(quán)重weight,也可虛擬化出160倍數(shù)的虛擬節(jié)點。用虛擬節(jié)點做映射匹配,可以在增加或減少Redis節(jié)點時,key在各Redis節(jié)點移動再分配更均勻,而不是只有相鄰節(jié)點受影響。

3.ShardedJedis支持keyTagPattern模式,即抽取key的一部分keyTag做sharding,這樣通過合理命名key,可以將一組相關(guān)聯(lián)的key放入同一個Redis節(jié)點,這在避免跨節(jié)點訪問相關(guān)數(shù)據(jù)時很重要。

中間件

twemproxy處于客戶端和服務(wù)器的中間,將客戶端發(fā)來的請求,進(jìn)行一定的處理后(如sharding),再轉(zhuǎn)發(fā)給后端真正的Redis服務(wù)器。也就是說,客戶端不直接訪問Redis服務(wù)器,而是通過twemproxy代理中間件間接訪問。

參照Redis Sharding架構(gòu),增加代理中間件的Redis集群架構(gòu)如下:

twemproxy中間件的內(nèi)部處理是無狀態(tài)的,它本身可以很輕松地集群,這樣可避免單點壓力或故障。

twemproxy又叫nutcracker,起源于twitter系統(tǒng)中redis/memcached集群開發(fā)實踐,運行效果良好,后代碼奉獻(xiàn)給開源社區(qū)。其輕量高效,采用C語言開發(fā),工程網(wǎng)址是:GitHub - twitter/twemproxy: A fast, light-weight proxy for memcached and redis

twemproxy后端不僅支持redis,同時也支持memcached,這是twitter系統(tǒng)具體環(huán)境造成的。

由于使用了中間件,twemproxy可以通過共享與后端系統(tǒng)的連接,降低客戶端直接連接后端服務(wù)器的連接數(shù)量。同時,它也提供sharding功能,支持后端服務(wù)器集群水平擴(kuò)展。統(tǒng)一運維管理也帶來了方便。

當(dāng)然,也是由于使用了中間件代理,相比客戶端直連服務(wù)器方式,性能上會有所損耗,實測結(jié)果大約降低了20%左右

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單機(jī)/單點 單點故障/瓶頸:多個節(jié)點負(fù)載:面向數(shù)據(jù):一變多(一致性<弱一致,最終一致性>)》可用性最終一致性:一部...
    壹點零閱讀 860評論 0 3
  • redis redis是單線程的,但是一般的作為緩存使用的話,redis足夠了,因為它的讀寫速度太快了。官方的一個...
    普度眾生的面癱青年閱讀 5,315評論 0 4
  • 本文是對Redis的集群部署模式一個學(xué)習(xí)總結(jié),共包括如下章節(jié)內(nèi)容: 概述 主從集群模式 “哨兵”集群模式 Clus...
    我是老薛閱讀 1,078評論 0 4
  • 本文將要介紹的哨兵,它基于 Redis 主從復(fù)制,主要作用便是解決主節(jié)點故障恢復(fù)的自動化問題,進(jìn)一步提高系統(tǒng)的高可...
    java成功之路閱讀 2,262評論 0 4
  • 小A在進(jìn)入大學(xué)這個戀愛雷區(qū)之前,曾廣泛涉獵各款韓劇。這也許是好奇心作祟,但更不如說是無聊而冗長的中學(xué)寒暑假讓他實在...
    框框之上閱讀 314評論 0 1

友情鏈接更多精彩內(nèi)容