天天看点

docker-compose搭建redis集群--Cluster模式

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
           

重点关注这三个属性:

  1. --cluster-announce-ip 10.24.99.61
  2. --cluster-announce-port 6381
  3. --cluster-announce-bus-port 16381

在没有加之前,通过 cluster nodes 看到的是这样的:

docker-compose搭建redis集群--Cluster模式

加了这三个属性后,结果是这样的:

docker-compose搭建redis集群--Cluster模式
这个 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
           

如图所示:

docker-compose搭建redis集群--Cluster模式

执行后,在 cluster-redis-1 容器内的 Redis 客户端使用 cluster nodes:

docker-compose搭建redis集群--Cluster模式

登入 cluster-redis-2 容器,执行类似的操作,也能得到差不多的结果:

docker-compose搭建redis集群--Cluster模式
如果登入其他容器,只看到一条记录而不是 6 条记录,那么它们之间的连通性可能就有问题了。

删除操作:

cluster forget :从集群中移除指定的节点,这样就无法完成握手,过期时间为60s,60s后两节点又会继续完成握手。

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 检查一下集群信息槽是否都已经分配了:

docker-compose搭建redis集群--Cluster模式

cluster:fail,可能是你还没有分配槽,或者 16384 个槽位没有全部分配出去。

cluster delslots slot [slot...] 删除一个或者多个槽(仅对当前节点有效)

查询操作:

cluster slots 列出槽位、节点信息。

继续阅读