Redis 集羣之Cluster模式

1. Redis 集羣模式

2. Cluster 模式

2.1 Cluster 模式介紹

  • sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一臺服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中。cluster模式的出現就是爲了解決單機Redis容量有限的問題,將Redis的數據根據一定的規則分配到多臺機器。
    另外,哨兵模式中,只有一個master,而Cluster中,可以有多個master,可以提高系統的吞吐量。
  • cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例(三主三從)。因爲Redis的數據是根據一定規則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容。
  • 使用集羣,只需要將redis配置文件中的cluster-enable配置打開即可。每個集羣中至少需要三個主數據庫才能正常運行,新增節點非常方便。
    在這裏插入圖片描述

2.2 數據存儲設計

  • Redis Cluster集羣使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現: 一個 Redis 集羣包含 16384 個哈希槽(hash slot,分佈在主節點上), 數據庫中的每個鍵值對都存在這 16384 個哈希槽的其中一個, 集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽, 其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和 。
  • 集羣中的每個節點負責處理一部分哈希槽。 舉個例子, 一個集羣可以有三個主節點, 其中:
    節點 A 負責處理 0 號至 5500 號哈希槽。
    節點 B 負責處理 5501 號至 11000 號哈希槽。
    節點 C 負責處理 11001 號至 16384 號哈希槽。
  • 這種將哈希槽分佈到不同節點的做法使得用戶可以很容易地向集羣中添加或者刪除節點。 比如說:
    如果用戶將新節點 D 添加到集羣中, 那麼集羣只需要將節點 A 、B 、 C 中的某些槽移動到節點 D 就可以了。
    與此類似, 如果用戶要從集羣中移除節點 A , 那麼集羣只需要將節點 A 中的所有哈希槽移動到節點 B 和節點 C , 然後再移除空白(不包含任何哈希槽)的節點 A 就可以了。
    因爲將一個哈希槽從一個節點移動到另一個節點不會造成節點阻塞, 所以無論是添加新節點還是移除已存在節點, 又或者改變某個節點包含的哈希槽數量, 都不會造成集羣下線。

2.3 內部通訊設計

在這裏插入圖片描述

2.4 cluster 集羣結構搭建

  • 原生安裝(單條命令)
    • 配置服務器(3主3從)
    • 建立通信(Meet)
    • 分槽(Slot)
    • 搭建主從(master-slave)
  • 工具安裝(批處理)
  • Cluster 配置
  • 開啓Cluster(配置這個屬性,表示服務器是集羣中的節點)
    cluster-enabled yes | no
  • cluster配置文件名,該文件屬於自動生成,它不是用戶可編輯的配置文件,而是Redis Cluster節點每次發生更改時都會自動持久保存集羣配置的文件(狀態,基本上是狀態),爲了能夠在啓動時重新閱讀它,給它指定一個名字。
    cluster-config-file <filename>
  • 節點服務響應超時時間,用於判定該節點是否下線或切換爲從節點
    cluster-node-timeout <milliseconds>
  • master連接的slave最小數量
    cluster-migration-barrier <count>
    在這裏插入圖片描述
  • 配置好之後,啓動這六臺服務器即可
  • 創建集羣(包括建立通信、分槽和搭建主從)
  • 單單啓動cluster後還沒有正式組成集羣,還需要用到redis-trib.rb(redis-trib是個集羣軟件,用於管理槽)命令來創建集羣,由於redis-trib.rb命令是一個ruby腳本,會對ruby環境有一些依賴,在執行前需要安裝以下軟件包(Redis 5開始可以使用redis-cli --cluster來創建集羣,命令語法和redis-trib.rb腳本一樣,省去了配置ruby環境的步驟)
    yum install ruby rubygems
    gem source -l #安裝完成後可以查看當前ruby源
    gem sources --remove https://rubygems.org/ #去掉官方源
    gem sources --remove http://rubygems.org/ #去掉官方源
    gem sources -a https://ruby.taobao.org/ #新增國內源
    gem install redis --version 3.2.0 #安裝redis與ruby連接接口
  • 創建集羣,–replicas 1 ,指定一個master有幾個slave,並且後面按順序寫上master和slave的ip和端口號
    ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
    注意要在redis安裝目錄下的src下執行該命令
    在這裏插入圖片描述

2.5 設置與獲取數據

  • 設置數據

當使用redis-cli啓動master客戶端存數據時,會報錯,提示你key所對應的槽在哪,不讓你放數據
在這裏插入圖片描述
可以使用redis -cli -c來啓動客戶端,這條指令是專門操作Cluster集羣的,不用指定端口號,存數據時會重定向到含有key所對應的槽的master的客戶端下
在這裏插入圖片描述
如果直接在端口號爲6380的客戶端下存數據的話,就不會報錯

  • 獲取數據

同設置數據一樣,如果按普通方式啓動客戶端,獲取數據時,如果數據剛好在master的槽中,可以獲取到數據,如果不在的話,會報錯,提示數據在哪個master的槽中
在這裏插入圖片描述
使用redis-cli -c啓動客戶端,來獲取數據
在這裏插入圖片描述

2.6 主從下線與切換

集羣中,當一個master下線時,會和哨兵模式中一樣,會選一個slave當做master,當下線的master上線時,就變成slave了

Cluster 結點操作命令

  • cluster info 打印集羣的信息
  • cluster nodes 列出集羣當前已知的所有節點(node),以及這些節點的相關信息。
  • cluster meet 將 ip 和 port 所指定的節點添加到集羣當中,讓它成爲集羣的一份子。
  • cluster forget<node_id> 從集羣中移除 node_id 指定的節點。

參考
Redis 集羣詳解
Redis教程(九)cluster集羣的配置

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