这篇文章分享如何在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。
如果您觉得本文不错,欢迎关注我的微信公众号,您的关注是我坚持的动力!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。