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 列出槽位、节点信息。