1. 程式人生 > >Redis系列(二):Redis高可用叢集

Redis系列(二):Redis高可用叢集

一、叢集模式

  Redis叢集是一個由多個主從節點組成的高可用叢集,它具有複製、高可用和分片等特性

 二、叢集部署

1、環境

  3臺主機分別是:

  192.168.160.146

  192.168.160.152

  192.168.160.153

  每臺伺服器1主1從,共3主3從

  相關安裝包儲存路徑:/usr/local/redis-5.0.2

2、部署

  ① Redis安裝詳見Redis系列(一):Redis簡介

  ② 進入redis-5.0.2 cd /usr/local/redis-5.0.2

   ③ 建立叢集配置資料夾  mkdir redis-cluster

   ④  (1)cd redis-cluster (2) mkdir 7001 和 mkdir 7002

   ⑤ (1)cp /usr/local/redis-5.0.2/redis.conf 7001/ (2) cd 7001

   ⑥ 編輯redis配置檔案 vim redis.conf 修改內容如下:

daemonize yes
port 7001
dir /usr/local/redis-5.0.2/redis-cluster/7001/ 這裡只是demo,正式環境把資料跟redis安裝包分開
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
#bind 127.0.0.1
protected-mode no
appendonly yes

  修改完後,cp redis.conf ../7002/  然後 cd /usr/local/redis-5.0.2/redis-cluster/7002 並修改的配置把所有的7001改成7002

  ⑦ (1) scp -r /usr/local/redis-5.0.2 [email protected]:/usr/local/   (2) scp -r /usr/local/redis-5.0.2 [email protected]:/usr/local/ 將redis拷貝到其他2臺主機上去,(3)分別進到 192.168.160.152 cd /usr/local 和192.168.160.153 cd /usr/local 如下:

   ⑧ 分別啟動6個redis例項,然後檢查是否啟動成功 (1)/usr/local/redis-5.0.2/bin/redis-server /usr/local/redis-5.0.2/redis-cluster/700*/redis.conf (2)ps -ef | grep redis 檢視是否啟動成功

   ⑨ 用redis-cli建立整個redis叢集(redis5以前的版本叢集是依靠ruby指令碼redis-trib.rb實現)  /usr/local/redis-5.0.2/bin/redis-cli --cluster create --cluster-replicas 1 192.168.160.146:7001 192.168.160.152:7001 192.168.160.153:7001 192.168.160.146:7002 192.168.160.152:7002 192.168.160.153:7002 

   ⑩ 驗證叢集: (1)連線任意一個客戶端即可:./redis-cli -c -h -p (-a訪問服務端密碼,-c表示叢集模式,指定ip地址和埠號)如:/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* (2)進行驗證: cluster info(檢視叢集資訊)、cluster nodes(檢視節點列表) (3)進行資料操作驗證 (4)關閉叢集則需要逐個進行關閉,使用命令: /usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* shutdown

   其中cluster nodes資訊如下:

9f71f69f061d9e811161d6be8a93f81f53304aed 192.168.160.152:7001@17001 master - 0 1575046303552 2 connected 5461-10922
a5447a0de83b33c028a9374372aa5602a869602e 192.168.160.152:7002@17002 slave dd939a72e405bf1dbd6fd538bc4383642435298e 0 1575046301531 5 connected
e7f80ba80749904838b6d779a0646e7f22313624 192.168.160.146:7001@17001 myself,master - 0 1575046303000 1 connected 0-5460
35582c86fc41f67d0089da2e21e99d9c66164dd3 192.168.160.153:7002@17002 slave e7f80ba80749904838b6d779a0646e7f22313624 0 1575046302443 6 connected
dd939a72e405bf1dbd6fd538bc4383642435298e 192.168.160.153:7001@17001 master - 0 1575046303956 3 connected 10923-16383
eddc783d11a4b46cebf157b5a6488c4346aec541 192.168.160.146:7002@17002 slave 9f71f69f061d9e811161d6be8a93f81f53304aed 0 1575046303452 4 connected
#含義#
#節點ID
#IP:埠:叢集埠
#標誌: master, slave, myself, fail
#如果是從節點這裡是他對應的主節點ID
#叢集最近一次向節點發送PING 命令之後,過去了多長時間還沒接到回覆
#節點最近一次返回PONG回覆的時間
#本節點的網路連線情況
#節點目前包含的槽:例如 192.168.160.146:7001目前包含0-5460個雜湊槽(master)

  至此Redis叢集搭建完成!!!!!

 三、Redis叢集原理

  1、16384個slots(槽位)

  Redis Cluster沒有單機的那種16個數據庫(0-15)的概念,而是分成了16384個slots(槽位),每個節點負責其中一部分槽位,槽位的資訊儲存於每個節點中;當客戶端來連線叢集時,它先得到一份叢集的槽位配置資訊並將其快取在客戶端本地。這樣當客戶端要查詢某個key時,可以直接定位到目標節點。同時因為槽位的資訊可能會存在客戶端與伺服器不一致的情況,還需要糾正機制來實現槽位資訊的校驗調整。

  2、槽位定位演算法

  Redis Cluster預設會對key值使用CRC16演算法進行hash得到一個整數值,然後用這個整數值對16384進行取模來得到具體槽位。HASH_SLOT = CRC16(key) mod 16384

   3、跳轉重定位 

  當客戶端向一個錯誤的節點發出了指令,該節點會發現指令的key所在的槽位並不歸自己管理,這時它會向客戶端傳送一個特殊的跳轉指令攜帶目標操作的節點地址,告訴客戶端去連這個節點去獲取資料。客戶端收到指令後除了跳轉到正確的節點上去操作,還會同步更新糾正本地的槽位對映表快取,後續所有key將使用新的槽位對映表。