使用 docker-compose 安装 Redis 集群步骤

创建项目目录

创建一个新的目录来存放 docker-compose.yml 文件:

mkdir redis-cluster-docker && cd redis-cluster-docker

创建配置文件

在 redis-cluster-docker 目录下创建 conf 目录,并在其目录下添加 redis.conf 文件

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

创建 docker-compose 配置文件

在 redis-cluster-docker 目录创建一个名为 docker-compose.yml 的文件

version: '3.8'

services:
  redis-cluster-creator:
    command:
      - redis-cli
      - --cluster
      - create
      - localhost:7001
      - localhost:7002
      - localhost:7003
      - localhost:7004
      - localhost:7005
      - localhost:7006
      - --cluster-yes
      - --cluster-replicas
      - '1'
    depends_on:
      redis-node-1:
        condition: service_healthy
      redis-node-2:
        condition: service_healthy
      redis-node-3:
        condition: service_healthy
      redis-node-4:
        condition: service_healthy
      redis-node-5:
        condition: service_healthy
      redis-node-6:
        condition: service_healthy
    image: docker.io/redis:latest
    network_mode: host
  redis-node-1:
    command:
      - redis-server
      - /conf/redis.conf
      - --port
      - '7001'
    healthcheck:
      interval: 10s
      retries: '3'
      test:
        - CMD
        - redis-cli
        - -p
        - '7001'
        - -c
        - ping
      timeout: 5s
    image: docker.io/redis:latest
    network_mode: host
    ports:
      - 7001:7000
    volumes:
      - redis-data-1:/data
      - ./conf:/conf
  redis-node-2:
    command:
      - redis-server
      - /conf/redis.conf
      - --port
      - '7002'
    healthcheck:
      interval: 10s
      retries: '3'
      test:
        - CMD
        - redis-cli
        - -p
        - '7002'
        - -c
        - ping
      timeout: 5s
    image: docker.io/redis:latest
    network_mode: host
    ports:
      - 7002:7000
    volumes:
      - redis-data-2:/data
      - ./conf:/conf
  redis-node-3:
    command:
      - redis-server
      - /conf/redis.conf
      - --port
      - '7003'
    healthcheck:
      interval: 10s
      retries: '3'
      test:
        - CMD
        - redis-cli
        - -p
        - '7003'
        - -c
        - ping
      timeout: 5s
    image: docker.io/redis:latest
    network_mode: host
    ports:
      - 7003:7000
    volumes:
      - redis-data-3:/data
      - ./conf:/conf
  redis-node-4:
    command:
      - redis-server
      - /conf/redis.conf
      - --port
      - '7004'
    healthcheck:
      interval: 10s
      retries: '3'
      test:
        - CMD
        - redis-cli
        - -p
        - '7004'
        - -c
        - ping
      timeout: 5s
    image: docker.io/redis:latest
    network_mode: host
    ports:
      - 7004:7000
    volumes:
      - redis-data-4:/data
      - ./conf:/conf
  redis-node-5:
    command:
      - redis-server
      - /conf/redis.conf
      - --port
      - '7005'
    healthcheck:
      interval: 10s
      retries: '3'
      test:
        - CMD
        - redis-cli
        - -p
        - '7005'
        - -c
        - ping
      timeout: 5s
    image: docker.io/redis:latest
    network_mode: host
    ports:
      - 7005:7000
    volumes:
      - redis-data-5:/data
      - ./conf:/conf
  redis-node-6:
    command:
      - redis-server
      - /conf/redis.conf
      - --port
      - '7006'
    healthcheck:
      interval: 10s
      retries: '3'
      test:
        - CMD
        - redis-cli
        - -p
        - '7006'
        - -c
        - ping
      timeout: 5s
    image: docker.io/redis:latest
    network_mode: host
    ports:
      - 7006:7000
    volumes:
      - redis-data-6:/data
      - ./conf:/conf
volumes:
  redis-data-1: {}
  redis-data-2: {}
  redis-data-3: {}
  redis-data-4: {}
  redis-data-5: {}
  redis-data-6: {}
  • redis-cluster-creator 主要的作用是将 redis-data-1 到 redis-data-6 实例组合成 Redis 集群。

启动 Redis 容器

运行以下命令来启动所有 Redis 实例:

docker-compose up -d

验证集群

使用以下命令查看集群的状态:

docker exec -it <container_id> redis-cli -p <port>
> CLUSTER INFO
> CLUSTER NODES

例如,使用以下命令进入容器,查看集群详情

docker exec -it redis-cluster-docker-redis-node-2-1 redis-cli -p 7002
> CLUSTER INFO
cluster_state:ok                        # 集群状态为 OK,表示集群正常运行
cluster_slots_assigned:16384           # 总共分配的槽位数为 16384
cluster_slots_ok:16384                  # 正常的槽位数为 16384
cluster_slots_pfail:0                   # 潜在故障的槽位数为 0
cluster_slots_fail:0                     # 故障的槽位数为 0
cluster_known_nodes:6                    # 集群中已知的节点数为 6
cluster_size:3                           # 集群的主节点数量为 3
cluster_current_epoch:6                  # 当前的集群纪元为 6
cluster_my_epoch:2                       # 本节点的纪元为 2
cluster_stats_messages_ping_sent:430     # 已发送的 PING 消息数量为 430
cluster_stats_messages_pong_sent:416     # 已发送的 PONG 消息数量为 416
cluster_stats_messages_meet_sent:1       # 已发送的 MEET 消息数量为 1
cluster_stats_messages_sent:847           # 总发送的消息数量为 847
cluster_stats_messages_ping_received:416  # 已接收的 PING 消息数量为 416
cluster_stats_messages_pong_received:431  # 已接收的 PONG 消息数量为 431
cluster_stats_messages_received:847        # 总接收的消息数量为 847
total_cluster_links_buffer_limit_exceeded:0 # 超过集群链接缓冲区限制的次数为 0
> CLUSTER NODES
d00ec055eb181999722c936072f20bc5d05c8557 ::1:7006@17006 slave 79192a91b73234b56ab7b9579878700046298926 0 1730913702000 3 connected
42e7656087a948ffb29ebea9594bc6dbaf36f409 127.0.0.1:7002@17002 myself,master - 0 0 2 connected 5461-10922
265a9e53f29b90e5d2eef0acd7ae6ed54a70e60f ::1:7005@17005 slave 42e7656087a948ffb29ebea9594bc6dbaf36f409 0 1730913701346 2 connected
79192a91b73234b56ab7b9579878700046298926 ::1:7003@17003 master - 0 1730913702351 3 connected 10923-16383
a1bba3ab668a1f0d5017c1aa44491090ae464bce ::1:7001@17001 master - 0 1730913701000 1 connected 0-5460
98abac595337ff78f0fc12574c089e3119395e24 ::1:7004@17004 slave a1bba3ab668a1f0d5017c1aa44491090ae464bce 0 1730913701849 1 connected

CLUSTER NODES 字段解析:

  1. d00ec055eb181999722c936072f20bc5d05c8557: 这是节点的唯一标识符(Node ID)。
  2. **::1: 7006@17006 **: 这是节点的地址信息。::1 是 IPv6 的环回地址,相当于 IPv4 的 127.0.0.17006 是用于客户端连接的端口,17006 是用于集群总线通信的端口。
  3. slave: 这表示该节点的角色是从节点(也就是复制其他节点的数据)。
  4. 79192a91b73234b56ab7b9579878700046298926: 这是该从节点正在复制的主节点的 ID。
  5. 0: 这个字段通常是代表 ping-sent 的时间戳(以毫秒为单位),即本节点最后一次 PING 这个节点的时间。在这里是 0,通常意味着没有延迟或还没有发送 PING。
  6. 1730913702000: 这是 pong-recv 的时间戳(以毫秒为单位),标识最近一次从这个节点接收到 PONG 回复的时间。
  7. 3: 这是节点的槽位(slots)分配情况。对于从节点,这个值通常表示主节点的槽位分配情况,因为从节点不负责槽位。
  8. connected: 这个字段表示这个节点的连接状态,connected 意味着该节点目前正常连接并正在工作。
posted @ 2024-11-07 01:31  Jacob-Chen  阅读(127)  评论(0)    收藏  举报