Redis叢集介紹
Redis 叢集是提供在多個Redis間節點間共用資料的組件。
Redis叢集並不支援處理多個keys的命令,因為這需要在不同的節點間移動資料,從而達不到像Redis那樣的效能,在高負載的情況下可能會導致不可預料的錯誤.
Redis 叢集透過分區來提供一定程度的可用性,在實際環境中當某個節點宕機或不可達的情況下繼續處理命令. Redis 叢集的優勢:
自動分割資料到不同的節點上。
整個叢集的部分節點失敗或在不可達的情況下能夠繼續處理命令。
Redis 集群的資料分片
Redis 集群沒有使用一致性hash, 而是引入了哈希槽的概念.
Redis 集群有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.集群的每個節點負責一部分hash槽,舉個例子,比如當前集群有3個節點,那麼:
節點A 包含0 到5500號哈希槽.
節點B 包含5501 到11000 號哈希槽.
節點C 包含11001 到16384號哈希槽.
這種結構很容易新增或刪除節點. 例如如果我想新新增個節點D, 我需要從節點A, B, C中得部分槽到D上. 如果我想移除節點A ,需要將A中的槽移到B和C節點上,然後將沒有任何槽的A節點從集群中移除即可. 由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論新增刪除或改變某個節點的雜湊槽的數量都不會造成叢集不可用的狀態.
##Redis 叢集的主從複製模型
為了使在部分節點失敗或大部分節點無法通訊的情況下叢集仍然可用,所以叢集使用了主從複製模型,每個節點都會有N-1個複製品.在我們範例中具有A,B,C三個節點的集群,在沒有複製模型的情況下,如果節點B失敗了,那麼整個集群就會以為缺少5501-11000這個範圍的槽而不可用.然而如果在叢集創建的時候(或過一段時間)我們為每個節點添加一個從節點A1,B1,C1,那麼整個集群便有三個master節點和三個slave節點組成,這樣在節點B失敗後,集群便會選舉B1為新的主節點繼續服務,整個集群便不會因為槽找不到而不可用了#不過當B和B1 都失敗後,集群是不可用的.Redis 一致性保證
Redis 並不能保證資料的強一致性. 這意義在實際中叢集在特定的條件下可能會遺失寫入操作.第一個原因是因為叢集是用了非同步複製. 寫入操作流程:客戶端向主節點B寫入一條指令.主節點B向客戶端回覆指令狀態.主節點將寫入作業複製給他得從節點B1, B2 和B3.主節點對指令的複製工作發生在回傳指令回覆之後, 因為如果每次處理指令請求都需要等待複製作業完成的話, 那麼主節點處理指令請求的速度將會大幅降低- 我們必須在效能和一致性之間做出權衡。注意:Redis 叢集可能會在未來提供同步寫入的方法。 Redis 叢集另外一種可能會遺失指令的情況是叢集出現了網路分區, 並且一個客戶端與至少包括一個主節點在內的少數實例被孤立。 舉例假設群集包含A 、 B 、 C 、 A1 、 B1 、 C1 六個節點, 其中A 、B 、C 為主節點, A1 、B1 、C1 為A,B,C的從節點, 還有一個客戶端Z1 假設叢集中發生網路分區,那麼叢集可能會分為兩方,大部分的一方包含節點A 、C 、A1 、B1 和C1 ,小部分的一方則包含節點B 和客戶端Z1 .Z1仍然能夠向主節點B中寫入, 如果網絡分區發生時間較短,那麼集群將會繼續正常運作,如果分區的時間足夠讓大部分的一方將B1選舉為新的master,那麼Z1寫入B中得資料便遺失了.以上是什麼是redis集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!