docker部署redis集群:
1. 准备镜像
docker pull redis:4.0.10docker pull ruby
2. 搭建:
- 创建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 # 持久化模式
- 创建自定义network
docker network create redis-net
- 生成配置文件
生成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
- 创建容器
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
