1. 程式人生 > 實用技巧 >Redis學習之:Redis的叢集

Redis學習之:Redis的叢集

1.為什麼需要Redis叢集

隨著我們系統業務量的增長,單機Redis已經不能滿足需求了。假設我們的系統要快取的資料已經遠遠超出伺服器的記憶體,就需要將這些資料以分片的形式儲存到不同的伺服器上。

2.解決的問題

資料冗餘備份、故障自動轉移、核心解決了單節點併發壓力問題

3.Redis叢集的原理

  • redis-cluster會均分16384個slot(從0-16383),每個節點負責一部分槽
  • 客戶端可以連線任意一個redis-cluster伺服器
  • 每次set或get都會通過crc16演算法計算出對應的slot
  • 對同一個key,多次進行crc16計算時結果一致樣的
  • 同一個key在經過crc16計算時,結果一定會出現相同的情況
  • 各個節點之間相互通訊

4.Redis叢集搭建

  • Redis叢集至少需要3個節點,因為投票容錯機制要求超過半數節點認為某個節點掛了該節點才是掛了,所以2個節點無法構成叢集
  • 要保證叢集的高可用,需要每個節點都有從節點,也就是備份節點,所以Redis叢集至少需要6臺伺服器。因為我沒有那麼多伺服器,也啟動不了那麼多虛擬機器,所在這裡搭建的是偽分散式叢集,即一臺伺服器虛擬執行6個redis例項,修改埠號為(7001-7006),當然實際生產環境的Redis叢集搭建和這裡是一樣的

每個配置檔案做如下配置

port ${port}                                   #埠 
cluster-enabled yes                            #開啟叢集模式
cluster-config-file nodes-${port}.conf         #修改叢集配置檔案
cluster-node-timeout 15000                     #設定節點超時時間
appendonly yes                                 #設定持久化為aof模式
appendfilename appendonly-${port}.aof          #設定每個持久化檔名
dbfilename dump-${port}.rdb                    #快照檔名
pidfile /var/run/redis_${port}.pid             #程序檔名
cluster-require-full-coverage yes              #
bind 0.0.0.0

啟動每個redis服務

.redis-server ./redis-${port}.conf 

  • 6個節點啟動完成後,我們開始建立叢集
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1  #引數1表示1主1從
# 7001為7004的主節點
# 7002為7005的主節點
# 7003為7006的主節點

輸入yes後,成功完成叢集配置

檢視叢集狀態

redis-cli --cluster info 192.168.3.200:7001   # 這裡連線任意一個節點都可以

操作叢集

連線任意一個節點都可以操作

此時我們發現,Redis會根據key去進行計算,不管是查詢還是新增都會分配到對應的槽中

注意

  • 當某一個主節點宕機後,其對應的從節點會成為主節點
  • 之前的主節點如果重新啟動後,則只能成為從節點,不能成為主節點了

向已存在的叢集中新增節點

啟動一個新的Redis例項 7007

redis-server ./redis-7007.conf

將7007節點加入叢集中

redis-cli --cluster add-node 127.0.0.7:7007 127.0.0.1:7001     # 前面的引數表示新增的節點ip:port 後面的引數表示已經存在的叢集節點的ip:port

此時我們檢視節點資訊

雖然7007節點已經加入了叢集,但是沒有分配任何的資料槽

給叢集節點重新分片

redis-cli --cluster reshard 192.168.3.200:7001   

這裡它會首先提示我們需要轉移多少個槽,我們輸入3000

然後會提示我們需要哪個id接收,我們輸入使用 info 命令看到的7007節點的id 7e37f7ecde1a7bdc434ddc564662e47f3d3875e6

然後提示我們從哪些節點分配出這些槽,我們輸入all

然後輸入 yes 就可以完成節點槽的重新分配