docker环境,搭建redis sentinel集群

这篇文章分享如何在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。

若是您以为本文不错,欢迎关注个人微信公众号,您的关注是我坚持的动力!

相关文章
相关标签/搜索