介紹
redis叢集就是将多個redis服務放在一起,通過某種政策讓他們各司其職。當使用者通路redis時通過某種算法将請求發送到不同的redis服務。
主從複制減少了讀寫壓力的問題,那麼叢集有效緩解了記憶體壓力的問題。
redis叢集實作了對redis的水準擴容,即啟動N個redis節點,将整個資料庫分布存儲在這N個節點中,每個節點存儲總資料的1/N。
redis叢集通過分區(Partition)來提供一定程度的可用性(Availability),即使叢集中有一部分節點失效或者無法進行通訊,叢集也可以繼續處理指令請求。
強一緻性(Consistency)、高可用(Availability)和分區容錯性(Partition)的CAP理論,可以參考:1.redis前言
環境準備
- 2.redis安裝
- 12.ruby安裝
- 制作6個redis執行個體并修改叢集配置
從redis安裝目錄拷貝6份
redis.conf
到
/usr/local/redis-cluster
路徑,并使用啟動端口作為辨別重命名配置檔案。
cp 你的redis安裝目錄/redis.conf /usr/local/redis-cluster/redis6379.conf
cp 你的redis安裝目錄/redis.conf /usr/local/redis-cluster/redis6380.conf
cp 你的redis安裝目錄/redis.conf /usr/local/redis-cluster/redis6381.conf
cp 你的redis安裝目錄/redis.conf /usr/local/redis-cluster/redis6389.conf
cp 你的redis安裝目錄/redis.conf /usr/local/redis-cluster/redis6390.conf
cp 你的redis安裝目錄/redis.conf /usr/local/redis-cluster/redis6391.conf
使用vim編輯器依次修改這6個配置檔案,以
redis6379.conf
為例。
- 開啟daemonize
daemonize yes
- 修改pid檔案名稱
pidfile /var/run/redis_6379.pid
- 修改log檔案名稱
logfile "6379.log"
- 修改端口
port 6379
- 修改dbfilename檔案名稱
dbfilename dump6379.rdb
- 關閉AOF持久化
或者修改appendfilename檔案名稱appendonly no
appendfilename "appendonly6379.aof"
- 開啟叢集模式
cluster-enabled yes
- 設定節點配置檔案
cluster-config-file nodes-6379.conf
- 設定節點失聯時間,超過該時間(毫秒),叢集自動進行主從切換
cluster-node-timeout 15000
修改完redis6379.conf檔案,其他5個檔案依照此方式修改,隻是将上面出現6379改成各自啟動端口号即可。
啟動
分别啟動6個redis執行個體。
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
redis-server redis6389.conf
redis-server redis6390.conf
redis-server redis6391.conf
檢視
ps -ef|grep redis
是否啟動成功。

啟動成功後将生成
nodes-xxxx.conf
檔案。
合體
将多個redis執行個體放在一個叢集中就叫合體。
在redis安裝路徑的src目錄下執行合體指令:
refdis5.0之前的版本執行:
./redis-trib.rb create --replicas 1 your ip:6379 your ip:6380 your ip:6381 your ip:6389 your ip:6390 your ip:6391
redis5.0之後的版本執行:
redis-cli --cluster create your ip:6379 your ip:6380 your ip:6381 your ip:6389 your ip:6390 127.0.0.1:6391 --cluster-replicas 1
your ip可以用
ifconfig
檢視,或者用
127.0.0.1
替代。
詢問can I set the above configuration? (type ‘yes’ to accept):表示對于叢集配置設定的主從伺服器配置設定和插槽配置設定是否滿意,鍵入yes表示滿意即可。
參數
--replicas 1
或者
-cluster-replicas 1
表示為每個主節點建立一個從節點。
一個叢集至少要有三個主節點。配置設定原則盡量保證每個主資料庫運作在不同的ip位址,每個從庫和主庫不在一個ip位址上。
由啟動資訊可知:
主機6379插槽值:c1a9f0179ab1737ce167f0c14f0129f3ba9d2f9a,插槽索引範圍:[0-5460],6389從屬于6379。
主機6380插槽值:58e4ac4f4299b79e9cb9a24c018bc566885cff76,插槽索引範圍:[5461-10922],6390從屬于6380。
主機6381插槽值:4cdaa7eb6dcc18865b0726147d6be72a4d2fe374,插槽索引範圍:[10923-16383],6391從屬于6381。
什麼是插槽(slots):一個redis叢集包含16384個插槽(hash slot),每個庫中的每個鍵多屬于這16384個插槽的其中一個,公式:CRC16(key)%16384 來計算鍵key屬于哪個插槽,其中 CRC16(key) 用于計算鍵key的 CRC16 校驗和。
用用戶端以叢集方式連接配接6379端口redis服務。
redis-cli -c -p 6379
-c表示實作資料自動重定向。并執行
set k1 v1
儲存資料。
通過算法計算鍵k1應該送往12706号插槽,在主機6381插槽索引範圍内,然後自動重定向切換到6381,k1儲存了6381資料庫中。
可以通過{組名}來定義組的概念,進而使同一組的所有key都在同一個資料庫服務中。
鍵name、age和sex都屬于user組,都在6380服務中。
問題1:如果主節點當機後,對應的從節點能否自動升為主節點?
以6379服務為例,關閉6379服務。
redis-cli -p 6379 shutdown
6379當機後,使用用戶端連接配接6380服務,檢視叢集資訊。
redis-cli -c -p 6380
檢視叢集資訊
cluster nodes
結論:原本6389為6379的從庫,6379當機後,6389自動更新為主庫。
問題2:主機恢複後,主從關系會如何?
重新啟動6379服務
redis-server redis6379.conf
配置項:cluster-require-full-coverage yes表示隻有全部插槽(16379)都正常的時候才能對外提供服務,預設yes。如果某台主機當機後,則對應的插槽就使用不了了,也就不能對外提供服務了
叢集指令
CLUSTER INFO
列印叢集的資訊 。
CLUSTER NODES
列出叢集目前已知的所有節點(node),以及這些節點的相關資訊。
//節點(node)
CLUSTER MEET
将 ip 和 port 所指定的節點添加到叢集當中,讓它成為叢集的一份子。
CLUSTER FORGET
從叢集中移除 node_id 指定的節點。
CLUSTER REPLICATE
将目前節點設定為 node_id 指定的節點的從節點。
CLUSTER SAVECONFIG
将節點的配置檔案儲存到硬碟裡面。
//槽(slot)
CLUSTER ADDSLOTS [slot ...]
将一個或多個槽(slot)指派(assign)給目前節點。
CLUSTER DELSLOTS [slot ...]
移除一個或多個槽對目前節點的指派。
CLUSTER FLUSHSLOTS
移除指派給目前節點的所有槽,讓目前節點變成一個沒有指派任何槽的節點。
CLUSTER SETSLOT NODE
将槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點删除該槽,然後再進行指派。
CLUSTER SETSLOT MIGRATING
将本節點的槽 slot 遷移到 node_id 指定的節點中。
CLUSTER SETSLOT IMPORTING
從 node_id 指定的節點中導入槽 slot 到本節點。
CLUSTER SETSLOT
STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。
//鍵 (key)
CLUSTER KEYSLOT
計算鍵 key 應該被放置在哪個槽上。
CLUSTER COUNTKEYSINSLOT
傳回槽 slot 目前包含的鍵值對數量。
CLUSTER GETKEYSINSLOT
傳回 count 個 slot 槽中的鍵。
此處參考:https://codekiller.top/2020/03/30/redis2/#toc-heading-65
叢集優點
- 實作擴容
- 分攤壓力
- 無中心配置相對簡單
叢集缺點
- 類似mset、mget等多鍵操作不被支援。
- 多鍵的redis事務是不被支援的。