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
這裏爲了方便,把redis加入以前的mybridge網絡,方便php、lua的調用。高可用時經過主機網絡訪問,因此主從都要對主機開放端口。如上。redis
簡化名稱:
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
在以前主從配置基礎上,搜索修改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個節點的配置文件是一致的。
[節點創建握手以後集羣還不能正常工做,這時集羣處於下線狀態,全部的數據讀寫都被禁止。]網絡
使用 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
[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 ... ...
其餘操做能夠看命令幫助或官網。
容器名稱 容器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 到本節點。]