浅谈Redis Cluster集群的可用性

搭建集群

利用 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 集群的可用性

 

通过上文不难看出,Redis Cluster 模式下集群不可用有两种情形:

当集群中可用 Master 节点不足半数以上,会导致集群不可用

当 cluster-require-full-coverage 配置项为 yes 时,某个槽对应的主从节点全部下线,会导致集群不可用;

当 cluster-require-full-coverage 配置项为 no 时,某个槽对应的主从节点全部下线,集群中其他槽的数据可以正常访问

 

 

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...