這篇文章分享如何在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。
若是您以爲本文不錯,歡迎關注個人微信公衆號,您的關注是我堅持的動力!