溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于redis的集群模式詳解

發(fā)布時間:2020-05-09 10:17:16 來源:億速云 閱讀:229 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

今天小編給大家分享的是關(guān)于redis的集群模式詳解,相信很多人都不太了解,為了讓大家更加了解redis的集群模式,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會有所收獲的哦。

Redis集群一般有5種:

1,主從復(fù)制

2,哨兵模式

3,Redis官方提供的Cluster集群模式(服務(wù)端)

4,Jedis sharding集群(客戶端sharding)

5,利用中間件代理,比如豌豆莢的codis等

介紹完他們的模式,現(xiàn)在來分析一下他們的原理:

主從復(fù)制(Master-Slave Replication):

實現(xiàn)主從復(fù)制(Master-Slave Replication)的工作原理:Slave從節(jié)點服務(wù)啟動并連接到Master之后,它將主動發(fā)送一個SYNC命令。Master服務(wù)主節(jié)點收到同步命令后將啟動后臺存盤進程,同時收集所有接收到的用于修改數(shù)據(jù)集的命令,在后臺進程執(zhí)行完畢后,Master將傳送整個數(shù)據(jù)庫文件到Slave,以完成一次完全同步。而Slave從節(jié)點服務(wù)在接收到數(shù)據(jù)庫文件數(shù)據(jù)之后將其存盤并加載到內(nèi)存中。此后,Master主節(jié)點繼續(xù)將所有已經(jīng)收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執(zhí)行這些數(shù)據(jù)修改命令,從而達到最終的數(shù)據(jù)同步。

如果Master和Slave之間的鏈接出現(xiàn)斷連現(xiàn)象,Slave可以自動重連Master,但是在連接成功之后,一次完全同步將被自動執(zhí)行。

主從復(fù)制配置

修改從節(jié)點的配置文件:slaveof masterip masterport

如果設(shè)置了密碼,就要設(shè)置:masterauth master-password

哨兵模式:

該模式是從Redis的2.6版本開始提供的,但是當時這個版本的模式是不穩(wěn)定的,直到Redis的2.8版本以后,這個哨兵模式才穩(wěn)定下來,無論是主從模式,還是哨兵模式,這兩個模式都有一個問題,不能水平擴容,并且這兩個模式的高可用特性都會受到Master主節(jié)點內(nèi)存的限制。

Sentinel(哨兵)進程是用于監(jiān)控redis集群中Master主服務(wù)器工作的狀態(tài),在Master主服務(wù)器發(fā)生故障的時候,可以實現(xiàn)Master和Slave服務(wù)器的切換,保證系統(tǒng)的高可用。

Sentinel(哨兵)進程的作用

監(jiān)控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。

提醒(Notification):當被監(jiān)控的某個Redis節(jié)點出現(xiàn)問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應(yīng)用程序發(fā)送通知。

自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級為新的Master, 并讓失效Master的其他Slave改為復(fù)制新的Master;當客戶端試圖連接失效的Master時,集群也會向客戶端返回新Master的地址,使得集群可以使用現(xiàn)在的Master替換失效Master。Master和Slave服務(wù)器切換后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的內(nèi)容都會發(fā)生相應(yīng)的改變,即,Master主服務(wù)器的redis.conf配置文件中會多一行slaveof的配置,sentinel.conf的監(jiān)控目標會隨之調(diào)換。

Sentinel(哨兵)進程的工作方式

每個Sentinel(哨兵)進程以每秒鐘一次的頻率向整個集群中的Master主服務(wù)器,Slave從服務(wù)器以及其他Sentinel(哨兵)進程發(fā)送一個 PING 命令。

如果一個實例(instance)距離最后一次有效回復(fù) PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel(哨兵)進程標記為主觀下線(SDOWN)

如果一個Master主服務(wù)器被標記為主觀下線(SDOWN),則正在監(jiān)視這個Master主服務(wù)器的所有 Sentinel(哨兵)進程要以每秒一次的頻率確認Master主服務(wù)器的確進入了主觀下線狀態(tài)

當有足夠數(shù)量的 Sentinel(哨兵)進程(大于等于配置文件指定的值)在指定的時間范圍內(nèi)確認Master主服務(wù)器進入了主觀下線狀態(tài)(SDOWN), 則Master主服務(wù)器會被標記為客觀下線(ODOWN)

在一般情況下, 每個 Sentinel(哨兵)進程會以每 10 秒一次的頻率向集群中的所有Master主服務(wù)器、Slave從服務(wù)器發(fā)送 INFO 命令。

當Master主服務(wù)器被 Sentinel(哨兵)進程標記為客觀下線(ODOWN)時,Sentinel(哨兵)進程向下線的 Master主服務(wù)器的所有 Slave從服務(wù)器發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次。

若沒有足夠數(shù)量的 Sentinel(哨兵)進程同意 Master主服務(wù)器下線, Master主服務(wù)器的客觀下線狀態(tài)就會被移除。若 Master主服務(wù)器重新向 Sentinel(哨兵)進程發(fā)送 PING 命令返回有效回復(fù),Master主服務(wù)器的主觀下線狀態(tài)就會被移除。

關(guān)于redis的集群模式詳解

Redis官方 Cluster集群模式

Redis Cluster是一種服務(wù)器Sharding技術(shù),3.0版本開始正式提供。

在這個圖中,每一個藍色的圈都代表著一個redis的服務(wù)器節(jié)點。它們?nèi)魏蝺蓚€節(jié)點之間都是相互連通的??蛻舳丝梢耘c任何一個節(jié)點相連接,然后就可以訪問集群中的任何一個節(jié)點。對其進行存取和其他操作。

Redis集群數(shù)據(jù)分片

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

Jedis sharding集群

Redis Sharding可以說是在Redis cluster出來之前業(yè)界普遍的采用方式,其主要思想是采用hash算法將存儲數(shù)據(jù)的key進行hash散列,這樣特定的key會被定為到特定的節(jié)點上。

慶幸的是,Java Redis客戶端驅(qū)動Jedis已支持Redis Sharding功能,即ShardedJedis以及結(jié)合緩存池的ShardedJedisPool

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

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

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

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

利用中間件代理

中間件的作用是將我們需要存入redis中的數(shù)據(jù)的key通過一套算法計算得出一個值。然后根據(jù)這個值找到對應(yīng)的redis節(jié)點,將這些數(shù)據(jù)存在這個redis的節(jié)點中。

常用的中間件有這幾種

Twemproxy

Codis

nginx

以上就是關(guān)于redis的集群模式詳解的詳細內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來億速云行業(yè)資訊!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI