docker部署redis集群:

1. 准备镜像

  1. docker pull redis:4.0.10
  2. docker pull ruby

2. 搭建:

  1. 创建redis配置文件
    mkdir -p /data/redis-cluster
    vi /data/redis-cluster/redis-cluster.tmpl
     port ${PORT}            # 节点端口
     protected-mode no       # 关闭protected-mode模式,外部网络可以直接访问
     cluster-enabled yes     # cluster集群模式
     cluster-config-file nodes.conf          # 集群配置名
     cluster-node-timeout 5000               # 超时时间
     cluster-announce-ip IP                  # 各节点IP
     cluster-announce-port ${PORT}           # 节点映射端口
     cluster-announce-bus-port 1${PORT}      # 节点总线端
     appendonly no            # 持久化模式
    
  1. 创建自定义network
    docker network create redis-net
    
  1. 生成配置文件
    生成conf和data目录,并生成配置信息,公生成6哥文件夹,从7000-7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件;
    for port in `seq 7000 7005`; do \
    mkdir -p ./${port}/conf \
    && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
    && mkdir -p ./${port}/data; \
    done
    
  1. 创建容器
    for port in `seq 7000 7005`; do \
    docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
    -v /data/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
    -v /data/redis-cluster/${port}/data:/data \
    --restart always --name redis-${port} --net redis-net \
    --sysctl net.core.somaxconn=1024 redis:4.0.10 redis-server /usr/local/etc/redis/redis.conf; \
    done
    

3. 创建集群

通过启动ruby来实现集群

 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 xvf redis-4.0.10.tar.gz && cd redis-4.0.10/src \
 && ruby 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)"

输入如下:

    ...
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join..
    >>> Performing Cluster Check (using node 172.18.0.2:7000)
    M: a779c88a19a2582620d0a1ad3f90431f92f91af5 172.18.0.2:7000
       slots:0-5460 (5461 slots) master
    additional replica(s)
    M: 880a2b0671d0ff15192e758ff7204ccf15f52cd0 192.168.31.150:7002
       slots:10923-16383 (5461 slots) master
    additional replica(s)
    S: 3b04d5b6bcd86efaaceb2002087729bcb9bb1c07 192.168.31.150:7005
       slots: (0 slots) slave
       replicates 5e33b75081c76bfc677e1941fdc2577709280f77
    M: 5e33b75081c76bfc677e1941fdc2577709280f77 192.168.31.150:7001
       slots:5461-10922 (5462 slots) master
    additional replica(s)
    S: dad167c467186794e5095b58a0f43e443ff692fb 192.168.31.150:7003
       slots: (0 slots) slave
       replicates 880a2b0671d0ff15192e758ff7204ccf15f52cd0
    S: fa3775cbcdd0512de4fe2c208de1046b5369e0b3 192.168.31.150:7004
       slots: (0 slots) slave
       replicates a779c88a19a2582620d0a1ad3f90431f92f91af5
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

能看到3主3从,说明集群成功了

查看集群信息:

    # docker exec -it redis-7000 /bin/bash -c "redis-cli -p 7000 cluster nodes"
    880a2b0671d0ff15192e758ff7204ccf15f52cd0 192.168.31.150:7002@17002 master - 0 1573806315290 3 connected 10923-16383
    3b04d5b6bcd86efaaceb2002087729bcb9bb1c07 192.168.31.150:7005@17005 slave 5e33b75081c76bfc677e1941fdc2577709280f77 0 1573806316296 6 connected
    5e33b75081c76bfc677e1941fdc2577709280f77 192.168.31.150:7001@17001 master - 0 1573806315000 2 connected 5461-10922
    dad167c467186794e5095b58a0f43e443ff692fb 192.168.31.150:7003@17003 slave 880a2b0671d0ff15192e758ff7204ccf15f52cd0 0 1573806316800 4 connected
    fa3775cbcdd0512de4fe2c208de1046b5369e0b3 192.168.31.150:7004@17004 slave a779c88a19a2582620d0a1ad3f90431f92f91af5 0 1573806316000 5 connected
    a779c88a19a2582620d0a1ad3f90431f92f91af5 192.168.31.150:7000@17000 myself,master - 0 1573806315000 1 connected 0-5460

本文参考链接:https://cloud.tencent.com/developer/article/1595713