docker-compose搭建Redis高可用架構,在這篇文章中,我搭建了一套redis集群。
但是有個問題就是,我的宿主機無法正常訪問該集群,
所以,我對原來的方案進行了調整。
docker-compose.yml
version: '3.8'
services:
redis-node-master-1:
image: redis:5.0.14
container_name: cluster-redis-1
ports:
- 6381:6379
- 16381:16379
command: "redis-server --requirepass abc123 --masterauth abc123 --appendonly yes \
--cluster-enabled yes \
--cluster-config-file nodes.conf \
--cluster-node-timeout 15000 \
--cluster-announce-ip 10.24.99.61 \
--cluster-announce-port 6381 \
--cluster-announce-bus-port 16381"
volumes:
- F:\DockerCluster\redis\cluster\data\redis1:/data
redis-node-master-2:
image: redis:5.0.14
container_name: cluster-redis-2
ports:
- 6382:6379
- 16382:16379
command: "redis-server --requirepass abc123 --masterauth abc123 --appendonly yes \
--cluster-enabled yes \
--cluster-config-file nodes.conf \
--cluster-node-timeout 15000 \
--cluster-announce-ip 10.24.99.61 \
--cluster-announce-port 6382 \
--cluster-announce-bus-port 16382"
volumes:
- F:\DockerCluster\redis\cluster\data\redis2:/data
redis-node-master-3:
image: redis:5.0.14
container_name: cluster-redis-3
ports:
- 6383:6379
- 16383:16379
command: "redis-server --requirepass abc123 --masterauth abc123 --appendonly yes \
--cluster-enabled yes \
--cluster-config-file nodes.conf \
--cluster-node-timeout 15000 \
--cluster-announce-ip 10.24.99.61 \
--cluster-announce-port 6383 \
--cluster-announce-bus-port 16383"
volumes:
- F:\DockerCluster\redis\cluster\data\redis3:/data
redis-node-slave-1:
image: redis:5.0.14
container_name: cluster-redis-1-slave
ports:
- 6384:6379
- 16384:16379
command: "redis-server --requirepass abc123 --masterauth abc123 --appendonly yes \
--cluster-enabled yes \
--cluster-config-file nodes.conf \
--cluster-node-timeout 15000 \
--cluster-announce-ip 10.24.99.61 \
--cluster-announce-port 6384 \
--cluster-announce-bus-port 16384"
volumes:
- F:\DockerCluster\redis\cluster\data\redis1-slave:/data
redis-node-slave-2:
image: redis:5.0.14
container_name: cluster-redis-2-slave
ports:
- 6385:6379
- 16385:16379
command: "redis-server --requirepass abc123 --masterauth abc123 --appendonly yes \
--cluster-enabled yes \
--cluster-config-file nodes.conf \
--cluster-node-timeout 15000 \
--cluster-announce-ip 10.24.99.61 \
--cluster-announce-port 6385 \
--cluster-announce-bus-port 16385"
volumes:
- F:\DockerCluster\redis\cluster\data\redis2-slave:/data
redis-node-slave-3:
image: redis:5.0.14
container_name: cluster-redis-3-slave
ports:
- 6386:6379
- 16386:16379
command: "redis-server --requirepass abc123 --masterauth abc123 --appendonly yes \
--cluster-enabled yes \
--cluster-config-file nodes.conf \
--cluster-node-timeout 15000 \
--cluster-announce-ip 10.24.99.61 \
--cluster-announce-port 6386 \
--cluster-announce-bus-port 16386"
volumes:
- F:\DockerCluster\redis\cluster\data\redis3-slave:/data
重點關注這三個屬性:
- --cluster-announce-ip 10.24.99.61
- --cluster-announce-port 6381
- --cluster-announce-bus-port 16381
在沒有加之前,通過 cluster nodes 看到的是這樣的:
加了這三個屬性后,結果是這樣的:
這個 ip 填什么?我是在 CMD 中使用 ipconfig 打印出網卡信息,然后選擇一個 IPv4 地址。
cluster meet
登入 cluster-redis-1 容器:
docker exec -it cluster-redis-1 /bin/bash
接着,使用 redis-cli 命令進入 Redis客戶端,再執行以下命令:
cluster meet 10.24.99.61 6382
cluster meet 10.24.99.61 6383
cluster meet 10.24.99.61 6384
cluster meet 10.24.99.61 6385
cluster meet 10.24.99.61 6386
如圖所示:
執行后,在 cluster-redis-1 容器內的 Redis 客戶端使用 cluster nodes:
登入 cluster-redis-2 容器,執行類似的操作,也能得到差不多的結果:
如果登入其他容器,只看到一條記錄而不是 6 條記錄,那么它們之間的連通性可能就有問題了。
刪除操作:
cluster forget
cluster replicate
接着就是設置主從關系了,這個命令要進入 cluster-redis-1 容器,在打開的 Bash 中執行:
redis-cli -h 10.24.99.61 -p 6384 -a abc123 cluster replicate 511fd258afa09ee6070a2145f3083876a5fc852d
redis-cli -h 10.24.99.61 -p 6385 -a abc123 cluster replicate 6673e34cf2ed0b687236339e2c7d92b8057a8749
redis-cli -h 10.24.99.61 -p 6386 -a abc123 cluster replicate 762ba770812f5f6ef0995717dd4b47eec3080558
cluster addslots
最后,就是分配槽位了,這個命令要進入 cluster-redis-1 容器,在打開的 Bash 中執行,:
redis-cli -h 10.24.99.61 -p 6381 -a abc123 cluster addslots {0..5500}
redis-cli -h 10.24.99.61 -p 6382 -a abc123 cluster addslots {5501..11000}
redis-cli -h 10.24.99.61 -p 6383 -a abc123 cluster addslots {11001..16383}
使用 cluster info 檢查一下集群信息槽是否都已經分配了:
cluster:fail,可能是你還沒有分配槽,或者 16384 個槽位沒有全部分配出去。
刪除操作:
cluster delslots slot [slot...] 刪除一個或者多個槽(僅對當前節點有效)
查詢操作:
cluster slots 列出槽位、節點信息。