这篇文章分享如何在docker中搭建redis sentinel集群。

搭建redis sentinel集群,继续使用上一篇文章中的bin/redis-server镜像,请参考 -- docker环境,搭建redis cluster集群

docker-entrypoint.sh内容修改如下

#!/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主从服务信息了。

$ 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节点连接。

下面搭建sentinel集群,在docker-entrypoint.sh添加如下内容

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进行同步。

注意redis sentinel进程会修改配置文件,所以它必须有配置文件修改权限。

启动所有的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。

如果您觉得本文不错,欢迎关注我的微信公众号,您的关注是我坚持的动力!


binecy
49 声望18 粉丝