搭建集群
利用 Docker Compose 搭建一个 3 主 3 从的 Redis Cluster 集群,docker-compose.yml 文件如下
# 构建一个 3 主 3 从的 Redis 集群
# Compose 版本
version: '3.8'
# 定义服务
services:
Redis-Service-1:
image: redis:7.0
container_name: node-1
command: [ "redis-server", "/etc/redis/redis.conf" ]
ports:
- "6371:6379"
- "16371:16379"
volumes:
- /Users/zgh/Docker/RedisCluster_3M3S/RedisConf/redis.conf:/etc/redis/redis.conf
networks:
# 使用名为 redis_cluster_3m3s_net 的网络并设置容器 IP
redis_cluster_3m3s_net:
ipv4_address: 120.120.120.11
Redis-Service-2:
image: redis:7.0
container_name: node-2
command: [ "redis-server", "/etc/redis/redis.conf" ]
ports:
- "6372:6379"
- "16372:16379"
volumes:
- /Users/zgh/Docker/RedisCluster_3M3S/RedisConf/redis.conf:/etc/redis/redis.conf
networks:
# 使用名为 redis_cluster_3m3s_net 的网络并设置容器 IP
redis_cluster_3m3s_net:
ipv4_address: 120.120.120.12
Redis-Service-3:
image: redis:7.0
container_name: node-3
command: [ "redis-server", "/etc/redis/redis.conf" ]
ports:
- "6373:6379"
- "16373:16379"
volumes:
- /Users/zgh/Docker/RedisCluster_3M3S/RedisConf/redis.conf:/etc/redis/redis.conf
networks:
# 使用名为 redis_cluster_3m3s_net 的网络并设置容器 IP
redis_cluster_3m3s_net:
ipv4_address: 120.120.120.13
Redis-Service-4:
image: redis:7.0
container_name: node-4
command: [ "redis-server", "/etc/redis/redis.conf" ]
ports:
- "6374:6379"
- "16374:16379"
volumes:
- /Users/zgh/Docker/RedisCluster_3M3S/RedisConf/redis.conf:/etc/redis/redis.conf
networks:
# 使用名为 redis_cluster_3m3s_net 的网络并设置容器 IP
redis_cluster_3m3s_net:
ipv4_address: 120.120.120.14
Redis-Service-5:
image: redis:7.0
container_name: node-5
command: [ "redis-server", "/etc/redis/redis.conf" ]
ports:
- "6375:6379"
- "16375:16379"
volumes:
- /Users/zgh/Docker/RedisCluster_3M3S/RedisConf/redis.conf:/etc/redis/redis.conf
networks:
# 使用名为 redis_cluster_3m3s_net 的网络并设置容器 IP
redis_cluster_3m3s_net:
ipv4_address: 120.120.120.15
Redis-Service-6:
image: redis:7.0
container_name: node-6
command: [ "redis-server", "/etc/redis/redis.conf" ]
ports:
- "6376:6379"
- "16376:16379"
volumes:
- /Users/zgh/Docker/RedisCluster_3M3S/RedisConf/redis.conf:/etc/redis/redis.conf
networks:
# 使用名为 redis_cluster_3m3s_net 的网络并设置容器 IP
redis_cluster_3m3s_net:
ipv4_address: 120.120.120.16
# 定义网络
networks:
# 定义一个名为 redis_cluster_3m3s_net 的网络
redis_cluster_3m3s_net:
ipam:
config:
# 设置网段
- subnet: 120.120.120.0/24
Redis 指定版本的配置文件 redis.conf 可通过下述链接下载对应版本的安装包后解压后获取
http://download.redis.io/releases/
修改 Redis 配置文件 redis.conf
...
# 注释 bind 配置项
# bind 127.0.0.1 -::1
# 设为 no, 关闭保护模式
protected-mode no
# 端口设为 6379
port 6379
# 设为 no, 因为 docker 启动时会通过-d 参数来让其实现后台运行
daemonize no
# 修改数据库数量, 用于验证配置文件是否生效
databases 5
# 设置访问主库时的密码
masterauth "52996"
# 设置 Redis 密码
requirepass 52996
# 使能集群模式
cluster-enabled yes
# 集群是否要求槽全覆盖
# yes:当负责某个槽的主库下线且没有相应的从库进行故障恢复时,集群整体不可用。即其他槽的节点在线也无法访问
# no:当负责某个槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用。即可访问其他槽的数据
cluster-require-full-coverage yes
...
这里对于集群中的 6 个节点,均使用上述同一个配置文件。目录结构如下所示
现在,进行 docker-compose.yml 文件所在目录,利用 Docker Compose 命令创建容器
docker-compose up -d
执行下述命令组建集群
docker exec -it node-1 \
redis-cli -p 6379 -a 52996 --cluster create \
120.120.120.11:6379 120.120.120.12:6379 \
120.120.120.13:6379 120.120.120.14:6379 \
120.120.120.15:6379 120.120.120.16:6379 \
--cluster-replicas 1
命令输出结果如下所示,其中在分配好每个节点的槽范围后,需要输入 yes进行确认,以便完成集群构建
此时我们即可在任意一个节点容器中执行 redis-cli 命令来访问集群了
# 以集群方式启动 redis-cli(使用-c 选项),可以自动进行重定向;反之,不行
docker exec -it node-1 redis-cli -c -p 6379 -a 52996
# redis 命令:查看集群信息
cluster info
# redis 命令:查看集群节点信息
cluster nodes
现在向集群中添加 key 分别为 age、name、country 的数据。不难看出其分别存储到 Master 节点 node1、node2、node3 当中
如果期望从某 Slave 节点中访问其所存储的相应数据,需先发送 readonly 命令。如下所示
下文将会利用该集群对 Redis Cluster 的可用性进行探索。至此我们不难得出该集群的拓扑结构关系及部分 key 的分布,如下所示
通过上文不难看出,Redis Cluster 模式下集群不可用有两种情形:
当集群中可用 Master 节点不足半数以上,会导致集群不可用
当 cluster-require-full-coverage 配置项为 yes 时,某个槽对应的主从节点全部下线,会导致集群不可用;
当 cluster-require-full-coverage 配置项为 no 时,某个槽对应的主从节点全部下线,集群中其他槽的数据可以正常访问