Docker Cluster

通过 Docker 搭建 Redis 集群

创建步骤

  1. 配置配置文件模板生成 6个 redis.conf 配置文件,用于 3主 3从 的集群
  2. 根据 6 个配置文件,启动 6 个 独立 的 Redis Docker 容器
  3. 根据生成的命令,通过 redis-cli --cluster 创建集群

redis-cluster.conf.tpl 配置文件模板

# Redis 端口
port ${PORT}

# 启用集群
cluster-enabled yes
#
cluster-node-timeout 5000
#
# 全部 slot 可用,集群才可用,默认是 yes,这里设置为 no,即允许部分 slot 缺失,集群仍然可以用
cluster-require-full-coverage no
#
# 关闭保护模式,外部网络可以直接访问; yes:需配置bind ip或者设置访问密码
protected-mode no
#
cluster-announce-ip ${LOCAL_IP}
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

redis-cluster-gen-conf.sh 配置文件生成

#!/usr/bin/env bash

# Shell 所在目录
SHELL_FOLDER=$(
  cd $(dirname $0)
  pwd
)

# 本地 IP,多个网卡的话获取最后一个
LOCAL_IP=$(ip addr | grep inet | grep en | tail -n1 | awk '{print $2}' | awk -F '/' '{print $1}')

# 配置文件,生成 6000 ~ 6005 六个配置
for port in $(seq 6000 6005); do
	# 配置文件目录
  mkdir -p ${SHELL_FOLDER}/conf
  # 根据模板生成配置文件
  PORT=${port} LOCAL_IP=${LOCAL_IP} envsubst < ${SHELL_FOLDER}/redis-cluster.conf.tpl > ${SHELL_FOLDER}/conf/redis-${port}.conf
done

redis-cluster-start.sh 启动 容器

#!/usr/bin/env bash

# Shell 所在目录
SHELL_FOLDER=$(
  cd $(dirname $0)
  pwd
)

# Docker 宿主机 IP
LOCAL_IP=$(ip addr | grep inet | grep en | tail -n1 | awk '{print $2}' | awk -F '/' '{print $1}')

# 生成配置
${SHELL_FOLDER}/redis-cluster-gen-conf.sh

# 创建 Docker 集群网络
docker network create redis-cluster-net

# 启动 Docker
for port in $(seq 6000 6005); do
  # 循环启动 6 个容器
  docker run -d \
    -p ${port}:${port} \
    -p 1${port}:1${port} \
    --privileged=true -v ${SHELL_FOLDER}/conf/redis-${port}.conf:/etc/redis/redis.conf \
    --restart always \
    --name redis-${port} \
    --net redis-cluster-net \
    redis:latest redis-server /etc/redis/redis.conf
done


# 集群列表
CLUSTER_IPS="redis-cli -p 6000  --cluster create --cluster-replicas 1 "
for port in $(seq 6000 6005); do
  CLUSTER_IPS="${CLUSTER_IPS} ${LOCAL_IP}:${port}"
done

# 随便进入一个实例
docker exec -it redis-6000 bash

# 手动指定以下命令,创建集群 redis-cli -p 6000 --cluster create --cluster-replicas 1 ip:port ...
ehco "请执行:${CLUSTER_IPS}"

redis-cluster-stop.sh 关闭容器

#!/usr/bin/env bash

for port in $(seq 6000 6005); do
  docker rm -f redis-${port}
done

Read More