这篇文章分享如何在docker中搭建redis sentinel集群。redis
搭建redis sentinel集群,继续使用上一篇文章中的bin/redis-server镜像,请参考 -- docker环境,搭建redis cluster集群docker
docker-entrypoint.sh内容修改以下bash
#!/bin/bash mkdir -p /etc/redis/ /var/log/redis/ /usr/local/redis/data/ chown -R redis:redis /var/log/redis/ /usr/local/redis/data/ if [ "$TYPE" = 'server' ]; then cat>>/etc/redis/redis.conf<<EOF protected-mode no appendonly yes logfile /var/log/redis/redis.log dir /usr/local/redis/data/ EOF exec gosu redis redis-server /etc/redis/redis.conf $@ fi
启动redis master节点容器服务器
sudo docker run -d --name redis-master -e TYPE=server bin/redis-server
启动redis slave节点容器微信
for i in `seq 1 3`; do master_ip=`sudo docker inspect -f '{{ .NetworkSettings.IPAddress}}' redis-master` sudo docker run -d --name redis-slave-$i -e TYPE=server bin/redis-server "--port 6379" "--slaveof $master_ip 6379" done
登陆redis主服务器,经过info replication
命令就能够查看redis主从服务信息了。app
$ sudo docker exec -it redis-master /bin/bash root$ redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:3 ...
能够看到当前redis master节点有3个slave节点链接。spa
下面搭建sentinel集群,在docker-entrypoint.sh添加以下内容code
if [ "$TYPE" = 'sentinel' ]; then cat>>/etc/redis/sentinel.conf<<EOF sentinel monitor $MASTER_NAME $MASTER_IP $MASTER_PORT $QUORUM sentinel down-after-milliseconds $MASTER_NAME 5000 sentinel failover-timeout $MASTER_NAME 60000 sentinel parallel-syncs $MASTER_NAME 1 EOF chown -R redis:redis /etc/redis/ exec gosu redis redis-sentinel /etc/redis/sentinel.conf $@ fi
配置含义
第一行sentinel monitor 配置了master name/master ip/master port/quorum,
其中quorum含义是,当sentinel集群中至少有quorum个节点认为master下线,才能真正认为该master已经不可用了,这时才选出一个sentinel节点进行failover(主备切换)操做。
down-after-milliseconds:若是master在该时间内不回应PONG 或者是回复了一个错误消息,该sentinel节点就认为该master下线。
failover-timeout:若是一个sentinel节点在该时间(ms)内未能完成failover操做,则认为该failover失败,这时再由另外一个sentinel节点从新尝试failover操做
parallel-syncs:发生failover操做,最多能够有多少个slave同时对新的master进行同步。server
注意redis sentinel进程会修改配置文件,因此它必须有配置文件修改权限。token
启动全部的sentinel节点容器
for i in `seq 1 3`; do master_ip=`sudo docker inspect -f '{{ .NetworkSettings.IPAddress}}' redis-master` sudo docker run -d --name redis-sentinel-$i -e TYPE=sentinel -e MASTER_NAME=my_master -e MASTER_IP=$master_ip -e MASTER_PORT=6379 -e QUORUM=2 bin/redis-server done
登陆sentinel节点,经过sentinel masters能够看到master节点信息,证实sentinel监控成功。
$ sudo docker exec -it redis-sentinel-1 /bin/bash root$:/var/lib/redis-5.0.7# redis-cli 127.0.0.1:6379> sentinel masters 1) 1) "name" 2) "my_master" 3) "ip" 4) "172.17.0.2" 5) "port" 6) "6379" ...
下面演示一下failover操做。中止redis master节点
sudo docker stop redis-master
在来看sentinel集群中的master信息
$ sudo docker exec -it redis-sentinel-1 /bin/bash root$:/var/lib/redis-5.0.7# redis-cli 127.0.0.1:6379> sentinel masters 1) 1) "name" 2) "my_master" 3) "ip" 4) "172.17.0.3" 5) "port" 6) "6379" ...
能够看到master节点已经由172.17.0.2切换到172.17.0.3了。
在看sentinel.conf
root$ cat /etc/redis/sentinel.conf sentinel myid 2432497886c8d5543f05b21c142a1dfca84ffe72 sentinel deny-scripts-reconfig yes sentinel monitor my_master 172.17.0.3 6379 2 ...
配置文件中的master ip也改为了172.17.0.3。
若是您以为本文不错,欢迎关注个人微信公众号,您的关注是我坚持的动力!