Docker搭建Redis集群

前沿

redis是最常用的缓存服务,下面我就使用docker来搭建一套redis的集群。

创建redis容器
  1. 首先我们需要新建一个redis配置模板,用于批量生成redis配置文件redis-cluster.tmpl

    1
    2
    3
    mkdir -p ~/docker/redis-cluster;
    cd ~/docker/redis-cluster;
    touch redis-cluster.tmpl;
  2. 将一下内容写入到redis-cluster.tmpl文件中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    port ${PORT}
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    cluster-announce-ip 192.168.3.60
    cluster-announce-port ${PORT}
    cluster-announce-bus-port 1${PORT}
    appendonly yes

    注意: cluster-announce-ip 是本机ip,而不是127.0.0.1

  1. 在docker中创建一个自定义网络,可以使用docker network create命令来创建,docker network ls命令来查看是否创建成功。

    1
    2
    3
    4
    5
    6
    7
    docker network create redis-net
    [root@localhost ~/docker/redis-cluster]# docker network ls
    NETWORK ID NAME DRIVER SCOPE
    e98dcf06eec6 bridge bridge local
    845f1245483b host host local
    f72ff3f690a0 none null local
    72aa0ec39b32 redis-net bridge local
  2. 现在我们来批量执行生成配置文件和数据存储目录

    1
    2
    3
    4
    5
    for port in `seq 7000 7005`; do \
    mkdir -p ~/docker/redis-cluster/${port}/conf \
    && PORT=${port} envsubst < ~/docker/redis-cluster/redis-cluster.tmpl > ~/docker/redis-cluster/${port}/conf/redis.conf \
    && mkdir -p ~/docker/redis-cluster/${port}/data; \
    done

    共生成6个文件夹,从7000到7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件

  3. 创建6个redis容器,并启动registry.cn-shenzhen.aliyuncs.com/zhouqi/redis:4.0是我自己的docker镜像,当然也可以直接使用官方镜像。

    1
    2
    3
    4
    5
    6
    7
    for port in `seq 7000 7005`; do \
    docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
    -v ~/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:z \
    -v ~/docker/redis-cluster/${port}/data:/data:z \
    --restart always --name redis-${port} --net redis-net \
    --sysctl net.core.somaxconn=1024 registry.cn-shenzhen.aliyuncs.com/zhouqi/redis:4.0 redis-server /usr/local/etc/redis/redis.conf; \
    done

    我们查看一下是否启动成功

建立Redis集群关系
1
2
3
4
5
6
7
8
echo yes | docker run -i --rm --net redis-net ruby sh -c '\
gem install redis \
&& wget http://download.redis.io/releases/redis-4.0.10.tar.gz \
&& tar -xzvf redis-4.0.10.tar.gz \
&& ruby redis-4.0.10/src/redis-trib.rb create --replicas 1 \
'"$(for port in `seq 7000 7005`; do \
echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; \
done)"

最后我们在看一下redis的集群信息

问题
  1. centos7创建redis集群一直卡在Waiting for the cluster to join

    问题:
    机器没有开放redis集群总线端口。

    解决方法:
    开放redis集群总线端口。
    集群总线端口是redis客户端连接的端口+10000。
    如:redis客户端端口是7001。
    则:集群总线端口就是17001。
    注意、所以redis集群机器都要放开对应的redis客户端端口和集群总线端口。
    如果你是在虚拟机上搭建redis集群、那么你直接关闭防火墙即可解决

  2. centos7创建redis集群一直卡在Waiting for the cluster to join

    问题:
    也许你的redis集群的ip设置成了127.0.0.1或loclahost

    解决方法:
    将redis-cluster.tmpl中的ip设置成本机ip

  3. WARNING: redis-trib.rb is not longer available!

    问题:
    只有redis 5.0以下的版本才支持

    解决方法:
    http://download.redis.io/releases中下载你对应的版本号

批量处理命令
  1. Redis停止

    1
    2
    3
    for port in `seq 7000 7005`; do \
    docker stop redis-${port}; \
    done
  2. Redis删除

    1
    2
    3
    4
    for port in `seq 7000 7005`; do \
    docker stop redis-${port}; \
    docker rm redis-${port}; \
    done
  3. Redis启动

    1
    2
    3
    for port in `seq 7000 7005`; do \
    docker start redis-${port}; \
    done