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。

若是您以爲本文不錯,歡迎關注個人微信公衆號,您的關注是我堅持的動力!

相關文章
相關標籤/搜索