Redis集羣是一個由多個主從節點組成的高可用集羣,它具備複製、高可用和分片等特性html
3臺主機分別是:node
192.168.160.146redis
192.168.160.152算法
192.168.160.153數據庫
每臺服務器1主1從,共3主3從vim
相關安裝包存儲路徑:/usr/local/redis-5.0.2緩存
① Redis安裝詳見Redis系列(一):Redis簡介ruby
② 進入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 root@192.168.160.152:/usr/local/ (2) scp -r /usr/local/redis-5.0.2 root@192.168.160.153:/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 Cluster沒有單機的那種16個數據庫(0-15)的概念,而是分紅了16384個slots(槽位),每一個節點負責其中一部分槽位,槽位的信息存儲於每一個節點中;當客戶端來鏈接集羣時,它先獲得一份集羣的槽位配置信息並將其緩存在客戶端本地。這樣當客戶端要查找某個key時,能夠直接定位到目標節點。同時由於槽位的信息可能會存在客戶端與服務器不一致的狀況,還須要糾正機制來實現槽位信息的校驗調整。
Redis Cluster默認會對key值使用CRC16算法進行hash獲得一個整數值,而後用這個整數值對16384進行取模來獲得具體槽位。HASH_SLOT = CRC16(key) mod 16384
當客戶端向一個錯誤的節點發出了指令,該節點會發現指令的key所在的槽位並不歸本身管理,這時它會向客戶端發送一個特殊的跳轉指令攜帶目標操做的節點地址,告訴客戶端去連這個節點去獲取數據。客戶端收到指令後除了跳轉到正確的節點上去操做,還會同步更新糾正本地的槽位映射表緩存,後續全部key將使用新的槽位映射表。