1. 程式人生 > >Redis 集群

Redis 集群

edi 了解 trac bsp 概念 -c one 所有 特性

集群的理解

事實上非常多地方都有可能接觸到集群的概念。為什麽會有集群呢?簡單的講就是人多好辦事,本來是一個人須要非常費勁才幹完畢的事,如今分給十個人做,十個人都能夠非常輕松的完畢,在海量數據,信息爆炸的今天,假設想要處理存儲很多其它的數據,可是卻沒有強大到爆的大型計算機支持的話。集群是個不錯的選擇。
Redis中也支持集群,Redis中的集群是通過【分片】來進行數據共享的(事實上數據庫中凡是涉及到集群的。一般都會有分片或者是分區這個概念伴隨著出現)。

我們簡要來說一下。學習Redis集群,須要學習什麽東西,就像是大學上課時的課前概要。
第一。既然是集群。那麽肯定是要涉及到集群中的組成部分——【節點】,我們須要了解節點是什麽?和普通的Redisserver有什麽差別? 第二。前面說過的分片,什麽是分片?把什麽給分了,分給誰,既然分了,那麽取的時候怎麽辦? 第三,集群是非常多臺計算機server構成的,假設當中的一臺宕掉了,怎麽辦?難道整個集群就癱瘓了嗎?怎樣預防和處理這樣的集群中節點宕機的情況?這裏就涉及到了復制和故障轉移

須要說明的幾個概念

節點

說集群肯定是要說節點的,節點構成的集群嘛,沒有節點哪裏有什麽集群。非常清楚的就能夠理解到什麽是節點了,【節點就是在集群模式下執行的Redisserver】 。集群中的節點和普
通的Redisserver相比,區別在哪裏,事實上也不難猜測出。普通Redisserver僅僅是單機的server,老老實實的處理client發過來的命令,然後老老實實的返回處理結果。節點不同,除了這些之外,節點還是集群中的一部分。須要顧及到集群中用到的數據,比方,集群中其它節點的信息,和其它節點握手,推斷其它節點是否下線,等等。

集群模式

集群模式事實上在節點中已經引出來,說的直白點,就是server執行一種狀態,更直白點事實上就是一個配置文件裏的一個標誌位,redis.conf中有個配置項。【cluster-enabled yes】在啟動Redisserver的時候。推斷這個配置項的值是否是yes,假設是yes那麽就開啟server的集群模式。使server成為集群模式中的一個節點,【這裏須要說明一下。成為集群模式中的一個節點,並不能成為一個集群。一個一個點,最後還是點,沒法成為一個網的,須要連接。這裏須要用到一個redis命令。cluster meet ip port,將兩個節點連接起來。構成集群】

分片和槽

分片的概念事實上不難理解,能夠想象一個芝麻燒餅。太大了。不優點理,將它切開,上面的芝麻就會被分布到不同的部分上,分片是一個動詞,是分開燒餅的那個動作,【分片(sharding)是指將數據拆分,將其分散到不同的機器上的過程,有時也用分區這個概念】,以上的概念是在一本MongoDb的書中找的,認為在Redis這裏也能適用。只是,有點不同,【須要註意,Redis分片事實上是將一個大燒餅分成了非常多小燒餅,然後往燒餅上撒芝麻。至於那個芝麻該到哪塊小燒餅上去。這個是須要計算的,通過芝麻的特性】專業點就是,集群中的整個數據庫看成一個大燒餅,被分成了16384塊小燒餅【槽】,數據庫中的鍵(也就是樣例中的芝麻)都屬於這些槽,至於這一塊一塊的小燒餅【槽】該歸哪個小饞貓【節點】呢?我們能夠通過命令分配【這裏叫槽指派。cluster addslots slots】slots是從0到16383,但所有的槽所有分配給節點之後。這個集群數據庫才算是真正上線。能夠接受client發來的處理鍵的命令了。這裏有一步。是各個節點傳播各自的槽指派信息。也就是說哪個節點處理哪些槽,大家都是心知肚明的。

集群中命令是怎麽被運行的

槽分好了,集群數據庫上線了,那麽怎麽處理client發來的命令呢?這麽多節點。發來的操作鍵的命令由哪個節點來做呢? 比方。我想節點A發送了一個[ set data “zhangsan” ]命令通過計算,data這個鍵是由368號槽來存,節點A就會查看自己是否管理368號槽,假設不歸節點A管,那麽歸哪個節點管,然後在將這條命令Redirected給管理368號槽的節點。

[ get data]命令也是一樣。先計算data鍵是哪個槽,然後把命令redirected到那個節點運行。

又一次分片

又一次分片就是改變槽的分派,把已經分派給某個節點的槽改為分派給還有一個節點。Redis集群的又一次分片操作由redis-trib管理軟件負責運行。在又一次分片的過程中。不須要集群下線。而且源節點和目標節點能夠繼續處理命令請求。

詳細實現原理,請查閱Redis幫助文檔。

復制和故障轉移

不可缺少的部分。也是最重要的部分 Redis集群中的節點分為主節點和從節點(這個是不是有點熟悉。Redis哨兵系統中也是主server和從server。這裏能夠參照Redis哨兵一起加深理解) 在正常的時候。主節點負責處理命令請求,從節點僅僅是復制主節點的內容,可是假設主節點進入下線狀態,那麽其它的正在執行的主節點會從下線了節點的從節點中選出一個作為新的主節點,(這個和哨兵是一樣的) 那麽怎麽推斷一個節點是否是下線呢?(哨兵是通過Sentinel系統監視每一個server。假設下線超過了設置的時長,就會採取故障轉移操作),這裏檢測一個節點是否下線。是採取了節點間的互相檢測,每一個節點會定期的向其它節點發送ping命令。假設在規定的時間內收了pong。那麽就是正常在線,否則就會被發送ping命令的這個節點標為疑似下線,假設半數的節點將一個節點標為了疑似下線,那麽就將這個疑似下線節點標為下線,採取故障轉移操作。

Redis 集群