Redis 叢集,redis叢集
叢集的理解
其實很多地方都有可能接觸到叢集的概念。為什麼會有叢集呢?簡單的講就是人多好辦事,本來是一個人需要很費勁才能完成的事,現在分給十個人做,十個人都可以很輕鬆的完成,在海量資料,資訊爆炸的今天,如果想要處理儲存更多的資料,但是卻沒有強大到爆的大型電腦支援的話,叢集是個不錯的選擇。
Redis中也支援叢集,Redis中的叢集是通過【分區】來進行資料共用的(其實資料庫中凡是涉及到叢集的,一般都會有分區或者是分區這個概念伴隨著出現)。
我們簡要來說一下,學習Redis叢集,需要學習什麼東西,就像是大學上課時的課前概要。 第一,既然是叢集,那麼肯定是要涉及到叢集中的組成部分——【節點】,我們需要瞭解節點是什嗎?和普通的Redis伺服器有什麼區別? 第二,前面說過的分區,什麼是分區?把什麼給分了,分給誰,既然分了,那麼取的時候怎麼辦? 第三,叢集是很多台電腦伺服器構成的,如果其中的一台宕掉了,怎麼辦?難道整個叢集就癱瘓了嗎?如何預防和處理這種叢集中節點宕機的情況?這裡就涉及到了複製和容錯移轉
需要說明的幾個概念節點
說叢集肯定是要說節點的,節點構成的叢集嘛,沒有節點哪裡有什麼叢集,很清楚的就可以理解到什麼是節點了,【節點就是在叢集模式下啟動並執行Redis伺服器】 ,叢集中的節點和普通的Redis伺服器相比,差別在哪裡,其實也不難推測出,普通Redis伺服器只是單機的伺服器,老老實實的處理用戶端發過來的命令,然後老老實實的返回處理結果,節點不同,除了這些之外,節點還是叢集中的一部分,需要顧及到叢集中用到的資料,比如,叢集中其他節點的資訊,和其他節點握手,判斷其他節點是否下線,等等。
叢集模式
叢集模式其實在節點中已經引出來,說的直白點,就是伺服器運行一種狀態,更直白點其實就是一個設定檔中的一個標誌位,redis.conf中有個配置項,【cluster-enabled yes】在啟動Redis伺服器的時候,判斷這個配置項的值是否是yes,如果是yes那麼就開啟伺服器的叢集模式,使伺服器成為叢集模式中的一個節點,【這裡需要說明一下,成為叢集模式中的一個節點,並不能成為一個叢集,一個一個點,最後還是點,沒法成為一個網的,需要串連,這裡需要用到一個redis命令,cluster meet ip port,將兩個節點串連起來,構成叢集】
分區和槽
分區的概念其實不難理解,可以想象一個芝麻燒餅,太大了,不好處理,將它切開,上面的芝麻就會被分布到不同的部分上,分區是一個動詞,是分開燒餅的那個動作,【分區(sharding)是指將資料拆分,將其分散到不同的機器上的過程,有時也用分區這個概念】,以上的概念是在一本MongoDb的書中找的,覺得在Redis這裡也能適用,不過,有點不同,【需要注意,Redis分區其實是將一個大燒餅分成了很多小燒餅,然後往燒餅上撒芝麻,至於那個芝麻該到哪塊小燒餅上去,這個是需要計算的,通過芝麻的特性】專業點就是,叢集中的整個資料庫看成一個大燒餅,被分成了16384塊小燒餅【槽】,資料庫中的鍵(也就是例子中的芝麻)都屬於這些槽,至於這一塊一塊的小燒餅【槽】該歸哪個小饞貓【節點】呢?我們可以通過命令分配【這裡叫槽指派,cluster addslots slots】slots是從0到16383,但所有的槽全部分配給節點之後,這個叢集資料庫才算是真正上線,可以接受用戶端發來的處理鍵的命令了。這裡有一步,是各個節點傳播各自的槽指派資訊,也就是說哪個節點處理哪些槽,大家都是心知肚明的。
叢集中命令是怎麼被執行的槽分好了,叢集資料庫上線了,那麼怎麼處理用戶端發來的命令呢?這麼多節點,發來的操作鍵的命令由哪個節點來做呢?比如,我想節點A發送了一個[ set data “zhangsan” ]命令通過計算,data這個鍵是由368號槽來存,節點A就會查看自己是否管理368號槽,如果不歸節點A管,那麼歸哪個節點管,然後在將這條命令Redirected給管理368號槽的節點。[ get data]命令也是一樣,先計算data鍵是哪個槽,然後把命令redirected到那個節點執行。
重新分區重新分區就是改變槽的指派,把已經指派給某個節點的槽改為指派給另一個節點,Redis叢集的重新分區操作由redis-trib管理軟體負責執行,在重新分區的過程中,不需要叢集下線,並且源節點和目標節點可以繼續處理命令請求。具體實現原理,請查閱Redis協助文檔。複製和容錯移轉必不可少的部分,也是最重要的部分Redis叢集中的節點分為主節點和從節點(這個是不是有點熟悉,Redis哨兵系統中也是主伺服器和從伺服器,這裡可以參照Redis哨兵一起加深理解) 在正常的時候,主節點負責處理命令請求,從節點只是複製主節點的內容,但是如果主節點進入下線狀態,那麼其他的正在啟動並執行主節點會從下線了節點的從節點中選出一個作為新的主節點,(這個和哨兵是一樣的)那麼怎麼判斷一個節點是否是下線呢?(哨兵是通過Sentinel系統監視每個伺服器,如果下線超過了設定的時間長度,就會採取容錯移轉操作),這裡檢測一個節點是否下線,是採取了節點間的互相檢測,每個節點會週期性向其他節點發送ping命令,如果在規定的時間內收了pong,那麼就是正常線上,否則就會被發送ping命令的這個節點標為疑似下線,如果半數的節點將一個節點標為了疑似下線,那麼就將這個疑似下線節點標為下線,採取容錯移轉操作。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。