(高併發探測)2、redis集羣部署整理.

1.節點規劃:

2種方式:1主+多從,多對主從,第二種分擔主節點、容易擴容縮減。php

容器名稱              容器IP地址         映射端口號                  服務運行模式
Redis-master1        172.1.50.11        6391->6379,16391->6379        master
Redis-master2        172.1.50.12        6392->6379,16392->6379        master
Redis-master3        172.1.50.13        6393->6379,16393->6379        master
redis-slave1         172.1.30.11        6394->6379,16394->6379        Slave
redis-slave2         172.1.30.12        6395->6379,16395->6379        Slave
redis-slave3         172.1.30.13        6396->6379,16396->6379        Slave

添加10000+ 的「bus-port」端口,能夠查看官方redis.conf的說明:html

# * cluster-announce-ip
# * cluster-announce-port
# * cluster-announce-bus-port 
# 解釋在上述段落下方,多餘端口用於集羣的自動檢測。

官方參考文檔node

a.建立自定義網絡

這裏爲了方便,把redis加入以前的mybridge網絡,方便php、lua的調用。高可用時經過主機網絡訪問,因此主從都要對主機開放端口。如上。redis

2.初步建立集羣

a.製做容器建立腳本

簡化名稱:
clmx 主服務器
clsx 從服務器docker

docker stop clm1 clm2 clm3 cls1 cls2 cls3
docker rm clm1 clm2 clm3 cls1 cls2 cls3

docker run --name clm1 \
    -p 6391:6379 -p 16391:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.50.11 \
    -v /root/tmp/dk/cluster_redis/6391/data:/data \
    -v /root/tmp/dk/cluster_redis/6391:/etc/redis \
    -d cffycls/redis5:1.7 

docker run --name clm2 \
    -p 6392:6379 -p 16392:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.50.12 \
    -v /root/tmp/dk/cluster_redis/6392/data:/data \
    -v /root/tmp/dk/cluster_redis/6392:/etc/redis \
    -d cffycls/redis5:1.7 

docker run --name clm3 \
    -p 6393:6379 -p 16393:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.50.13 \
    -v /root/tmp/dk/cluster_redis/6393/data:/data \
    -v /root/tmp/dk/cluster_redis/6393:/etc/redis \
    -d cffycls/redis5:1.7 

docker run --name cls1 \
    -p 6394:6379 -p 16394:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.30.11 \
    -v /root/tmp/dk/cluster_redis/6394/data:/data \
    -v /root/tmp/dk/cluster_redis/6394:/etc/redis \
    -d cffycls/redis5:1.7 

docker run --name cls2 \
    -p 6395:6379 -p 16395:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.30.12 \
    -v /root/tmp/dk/cluster_redis/6395/data:/data \
    -v /root/tmp/dk/cluster_redis/6395:/etc/redis \
    -d cffycls/redis5:1.7 

docker run --name cls3 \
    -p 6396:6379 -p 16396:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.30.13 \
    -v /root/tmp/dk/cluster_redis/6396/data:/data \
    -v /root/tmp/dk/cluster_redis/6396:/etc/redis \
    -d cffycls/redis5:1.7

b.測試配置文件,創建集羣

在以前主從配置基礎上,搜索修改bash

cluster-enabled yes

重啓全部容器。
-- 節點發現然,後須要在容器命令行設置:服務器

#進入 172.1.50.1.11
docker exec -it clm1 bash
/ # redis-cli
127.0.0.1:6379> auth 123456
127.0.0.1:6379> info cluster
127.0.0.1:6379> cluster meet 172.1.50.12 6379
127.0.0.1:6379> cluster meet 172.1.50.13 6379
127.0.0.1:6379> cluster meet 172.1.30.11 6379
127.0.0.1:6379> cluster meet 172.1.30.12 6379
127.0.0.1:6379> cluster meet 172.1.30.13 6379
127.0.0.1:6379> cluster nodes
e6f4def93bb888c144c4db308b5a7846d95d257b 172.1.50.11:6379@16379 myself,master - 0 1562061736000 2 connected
a0a5d4e10d97ba63fbf4f6eba3f4cf1f73d53423 172.1.30.12:6379@16379 master - 0 1562061738000 4 connected
c9f17946ca2c22a6dd0269614293e1bf38ae869b 172.1.50.12:6379@16379 master - 0 1562061737000 1 connected
2c5395040cfb9611b515d0424f30c91eba1ec6e8 172.1.30.11:6379@16379 master - 0 1562061740000 3 connected
eff5996aa6d5d9ab048a778246fcc1663322fe7d 172.1.50.13:6379@16379 master - 0 1562061739802 0 connected
67cf166b61e7d892affa6d754a563b5993a9c5a3 172.1.30.13:6379@16379 master - 0 1562061740802 5 connected

這裏集羣發現一鼓作氣,感受很快。不行的話:
看下相應服務器是否能ping通;配置文件修改是否到位,這裏6個節點的配置文件是一致的。
[節點創建握手以後集羣還不能正常工做,這時集羣處於下線狀態,全部的數據讀寫都被禁止。]網絡

c.設置從節點

使用 cluster replicate {nodeId}命令讓一個節點成爲從節點。其中命令執行必須在對應的從節點上執行,將當前節點設置爲 node_id 指定的節點的從節點。函數

# cls1容器操做
127.0.0.1:6379> cluster nodes
a0a5d4e10d97ba63fbf4f6eba3f4cf1f73d53423 172.1.30.12:6379@16379 master - 0 1562063939000 4 connected
eff5996aa6d5d9ab048a778246fcc1663322fe7d 172.1.50.13:6379@16379 master - 0 1562063942507 0 connected
c9f17946ca2c22a6dd0269614293e1bf38ae869b 172.1.50.12:6379@16379 master - 0 1562063938000 1 connected
67cf166b61e7d892affa6d754a563b5993a9c5a3 172.1.30.13:6379@16379 master - 0 1562063941505 5 connected
2c5395040cfb9611b515d0424f30c91eba1ec6e8 172.1.30.11:6379@16379 myself,master - 0 1562063940000 3 connected
e6f4def93bb888c144c4db308b5a7846d95d257b 172.1.50.11:6379@16379 master - 0 1562063940503 2 connected

127.0.0.1:6379> cluster REPLICATE e6f4def93bb888c144c4db308b5a7846d95d257b
OK

127.0.0.1:6379> cluster nodes
a0a5d4e10d97ba63fbf4f6eba3f4cf1f73d53423 172.1.30.12:6379@16379 master - 0 1562063991000 4 connected
eff5996aa6d5d9ab048a778246fcc1663322fe7d 172.1.50.13:6379@16379 master - 0 1562063993000 0 connected
c9f17946ca2c22a6dd0269614293e1bf38ae869b 172.1.50.12:6379@16379 master - 0 1562063994634 1 connected
67cf166b61e7d892affa6d754a563b5993a9c5a3 172.1.30.13:6379@16379 master - 0 1562063992000 5 connected
2c5395040cfb9611b515d0424f30c91eba1ec6e8 172.1.30.11:6379@16379 myself,slave e6f4def93bb888c144c4db308b5a7846d95d257b 0 1562063993000 3 connected
e6f4def93bb888c144c4db308b5a7846d95d257b 172.1.50.11:6379@16379 master - 0 1562063993632 2 connected
127.0.0.1:6379> 

#同理,在cls3上最終結果
/ # redis-cli -h 172.1.30.13
172.1.30.13:6379> cluster nodes
c9f17946ca2c22a6dd0269614293e1bf38ae869b 172.1.50.12:6379@16379 master - 0 1562064342897 1 connected
a0a5d4e10d97ba63fbf4f6eba3f4cf1f73d53423 172.1.30.12:6379@16379 slave c9f17946ca2c22a6dd0269614293e1bf38ae869b 0 1562064345000 4 connected
67cf166b61e7d892affa6d754a563b5993a9c5a3 172.1.30.13:6379@16379 myself,slave eff5996aa6d5d9ab048a778246fcc1663322fe7d 0 1562064343000 5 connected
e6f4def93bb888c144c4db308b5a7846d95d257b 172.1.50.11:6379@16379 master - 0 1562064344000 2 connected
eff5996aa6d5d9ab048a778246fcc1663322fe7d 172.1.50.13:6379@16379 master - 0 1562064345000 0 connected
2c5395040cfb9611b515d0424f30c91eba1ec6e8 172.1.30.11:6379@16379 slave e6f4def93bb888c144c4db308b5a7846d95d257b 0 1562064345904 3 connected

d.分配槽

[Redis 集羣把全部的數據映射到16384個槽中。每一個 key 會映射爲一個固定的槽,只有當節點分配了槽,才能響應和這些槽關聯的鍵命令。]
手動是須要批量分配的,Invalid or out of range slot,百度:
redis-cli -h 服務器IP -p 端口號 cluster addslots {0..5460} 許多這種沒用的,後來找到一位大神的 redis ADDSLOTS支持區間輸入實現,把ifelse{}裏面的所有替換、加上函數,從新打包編譯鏡像OK了。效果:測試

172.1.50.13:6379> cluster slots
1) 1) (integer) 0
   2) (integer) 5461
   3) 1) "172.1.50.11"
      2) (integer) 6379
      3) "e6f4def93bb888c144c4db308b5a7846d95d257b"
   4) 1) "172.1.30.11"
      2) (integer) 6379
      3) "2c5395040cfb9611b515d0424f30c91eba1ec6e8"
2) 1) (integer) 5462
   2) (integer) 10922
   3) 1) "172.1.50.12"
      2) (integer) 6379
      3) "c9f17946ca2c22a6dd0269614293e1bf38ae869b"
   4) 1) "172.1.30.12"
      2) (integer) 6379
      3) "a0a5d4e10d97ba63fbf4f6eba3f4cf1f73d53423"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "172.1.50.13"
      2) (integer) 6379
      3) "eff5996aa6d5d9ab048a778246fcc1663322fe7d"
   4) 1) "172.1.30.13"
      2) (integer) 6379
      3) "67cf166b61e7d892affa6d754a563b5993a9c5a3"
172.1.50.13:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
... ...

其餘操做能夠看命令幫助或官網

e.測試增長節點,刪除節點

容器名稱             容器IP地址         映射端口號                    服務運行模式
redis-master4       172.1.50.21        6381->6379,16381->6379        master
redis-slave4        172.1.30.21        6382->6379,16382->6379        slave
docker stop clm4 cls4
docker rm clm4 cls4

docker run --name clm4 \
    -p 6381:6379 -p 16381:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.50.21 \
    -v /root/tmp/dk/cluster_redis/6381/data:/data \
    -v /root/tmp/dk/cluster_redis/6381:/etc/redis \
    -d cffycls/redis5:cluster2 

docker run --name cls4 \
    -p 6382:6379 -p 16382:16379 \
    --restart=always \
    --network=mybridge --ip=172.1.30.21 \
    -v /root/tmp/dk/cluster_redis/6382/data:/data \
    -v /root/tmp/dk/cluster_redis/6382:/etc/redis \
    -d cffycls/redis5:cluster2

同理,meet、replicate後查看cluster info:cluster_state:ok。但cluster slots依然是上面的,槽分配並無變化,須要繼續操做[CLUSTER setslot <slot> node <node_id> 將槽指派給指定的節點,若是槽已經指派給另外一個節點,那麼先讓另外一個節點刪除該槽,而後再進行指派。 CLUSTER setslot <slot> migrating <node_id> 將本節點的槽遷移到指定的節點中。 CLUSTER setslot <slot> importing <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。]

相關文章
相關標籤/搜索