Redis之Cluster(集羣)

上文書說到了sentinel,本次來介紹下cluster,這是個分佈式的方案,通過分片(sharding)來共享數據,並且支持故障轉移,放在當前是流弊的。

節點:

       通常是指一臺服務器,也有可能一臺機器上部署多個redis,就叫多個節點或多個實例。多個節點如:127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002,三個節點要相互通信可以線登陸到7000上,通過cluster meet 127.0.0.1:7001 來進行握手,加入到大家庭中。在握手的過程中,雙方都會相互把對方的信息保存在自己的clusterNode裏。然後彼此返回一個PONG表示已經完成了MEET

在啓動節點的時候,通過cluster_enabled =yes來開啓集羣模式。

槽指派

集羣目前支持16384個槽,所謂的指派就是瓜分槽,再通俗點就是把1-5000給了7000,5001-10000給了7001,剩下的給7002,有一點需要注意。槽全部處理或者分配,那麼集羣處於上線狀態,否則處於下線狀態。

在clusterNode結構的slots裏記錄了分配到的槽ID,numslots中記錄了分配到的數量。

當前的節點還會把自己持有的槽及數量發送給其他的節點,讓他們找到存有自己信息的結構中,把槽信息更新。方便之後查找時的定位、故障轉移及槽的重新分配(新加節點時使用),加槽可以使用cluster addslots 10086

數據查找

在完成分槽後,集羣上線,客戶端向節點發送請求的時候,接收命令的節點會查詢是否屬於自己負責的槽,如果不在向客戶端返回一個MOVE命令,並且把自己查到應該定位到那個節點的信息返回。

槽定位是根據

crc16(key) & 16383來計算槽號

MOVED錯誤:

當節點發現鍵所在當槽不是自己處理當時候,向客戶端返回一個MOVED,指引客戶端轉向正確當槽節點。

格式:MOVED<slot><ip>:<port>

重新分片的實現原理:

ASK錯誤

在源節點向目標節點遷移的過程中,客戶端發來請求命令,會出現2中情況,如果要是數據還沒遷移直接返回,如果已經遷移走,返回ASK,並且引導客戶端找到正確的槽

複製與故障轉移

集羣中每個節點都會定期的向集羣中其他的節點發送ping消息來檢測對方是否存活,如果其他節點沒有在時間範圍內返回,就標記爲疑似下線。其實就是在這個節點的clusterState.nodes字典中找到節點,打開redis_node_pfail標記爲下線。

接着把消息同步給其他節點。其他節點收到後,也修改狀態。

選舉新的主節點

1、集羣中個節點把自己的配置紀元設置爲0.

2、每個節點只有一次投票的機會

3、當從節點發現自己正在複製的主節點已經進入下線狀態,會向集羣廣播一條消息。要求所有能收到這條消息,並且具有投票權的主節點投自己一票。

4、如果一個主節點發現自己沒有投。就把這寶貴的一票給他

5、當一個節點的票數大於等於n/2+1時就會被認爲是新的節點

選出來的新節點會執行slaveof no one成爲新的節點,並且撤銷所有對已下線的主節點槽指派給自己。同時向集羣廣播一條消息,告訴大家由從節點變爲來主節點並完成故障轉移。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章