docker配置redis哨兵 docker redis 哨兵_docker


本文记录本人在一台机器上配置一主两从三哨兵redis哨兵模式

一、环境

操作系统:centos7

docker版本:1.13.1

二、操作

docker安装redis


docker pull redis


本人安装时,获取的最新版本为redis 6.0.6

获取redis配置文件样本


cd /home/work/docker_data/redis/

wget http://download.redis.io/redis-stable/redis.conf
cp redis.conf redis1.conf
cp redis.conf redis2.conf
cp redis.conf redis3.conf


主要参数设置如下:

redis1: port 6390
redis2: port 6391
redis3: port 6392

注意这里建议大家把端口配置为不一样的,因为在同一台机器上搭建哨兵模式,很容易失败的地方就在于这些redis实例和哨兵(哨兵也是一个特殊的redis实例)的网络通信问题,除非大家对docker的内部网络以及redis实例和哨兵的通信过程非常清楚,否则建议大家使用docker启动实例的时候将docker容器的网络和本地主机映射为一致。所以我们就需要将docker容器内每个redis实例设置为不同的端口号。

在配置哨兵模式的过程中,大家还需注意的一个地方,哨兵实例会回写哨兵配置文件,一旦重启哨兵实例的时候,尽量检查一下哨兵配置文件,将之前回写的数据删除,不然可能会影响哨兵的监控判断。具体回写内容大家可以自己查看。


# 关闭保护模式
protected-mode no
# 
让redis服务后台运行(因为使用docker启动时使用了-d参数,所以需要设置为no, 非docker设置为yes)
daemonize no

# 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码. 只是练习配置,就不使用密码认证了)
# requirepass masterpassword
logfile "/var/tmp/redis.log"
# 从机需要设置该参数 (redis2.conf和redis3.conf需要将masterip设置为#主机的公网或者局域网ip,port为上面设置的6390), 注意该参数在早期版本为slaveof
#replicaof <masterip> <masterport>


docker配置redis哨兵 docker redis 哨兵_docker配置redis哨兵_02


查看集群是否成功

redis-cli –p 6390 (本机也装了redis,所以有redis客户端,本机没有安装redis的同学,进入docker容器来操作docker exec –it redis1 bash)


docker配置redis哨兵 docker redis 哨兵_docker 启动redis_03


可以看到该redis集群有两个从节点。

往主节点写数测试从节点是否复制


docker配置redis哨兵 docker redis 哨兵_redis_04


docker配置redis哨兵 docker redis 哨兵_后台运行_05


可以看到主从配置成功。

接下来开始配置哨兵


wget http://download.redis.io/redis-stable/sentinel.conf

cp sentinel.conf sentinel1.conf
cp sentinel.conf sentinel2.conf

cp sentinel.conf sentinel3.conf


修改三个文件监听端口为port 26379, port 26380, port 26381

其他主要配置如下:


# 让sentinel服务后台运行(docker的话需要设置为no,非docker运行设置为yes, 因为docker有个-d属性就是让在后台运行的)
daemonize no 


# 修改日志文件的路径
logfile "/var/tmp/sentinel.log"

# 修改监控的主redis服务器
# 最后一个2表示,两台机器判定主被动下线后,就进行failover(故障转移)

sentinel monitor mymaster 公网ip 6390 2

#超过5秒master还没有连接上,则认为master已经停止
sentinel down-after-milliseconds mymaster 5000


配置好后启动三个哨兵


docker run --name sentinel1  -v  /home/work/docker_data/redis/sentinel1.conf:/usr/local/etc/redis/sentinel.conf -d --net=host redis redis-sentinel /usr/local/etc/redis/sentinel.conf
docker run --name sentinel2  -v /home/work/docker_data/redis/sentinel2.conf:/usr/local/etc/redis/sentinel.conf -d --net=host redis redis-sentinel /usr/local/etc/redis/sentinel.conf
docker run --name sentinel3  -v /home/work/docker_data/redis/sentinel3.conf:/usr/local/etc/redis/sentinel.conf -d --net=host redis redis-sentinel /usr/local/etc/redis/sentinel.conf


启动后通过docker ps查看


docker配置redis哨兵 docker redis 哨兵_docker 启动redis_06


通过redis-cli –p 26379(注意我是本机安装了redis的,如果本机没有安装,需要进入docker容器,docker exec –it sentinel1 bash)进入哨兵实例,查看哨兵监控状态


docker配置redis哨兵 docker redis 哨兵_redis_07


可以看到哨兵的状态是正确的,发现了1个主节点,2个从节点,并且哨兵一共有3个。

模拟主节点崩溃后,其中一个从节点变为主节点,并且另外一个从节点以新主节点做备份。(从节点通过客户端连接后,只能查看,不能写入数据)

docker stop redis1

停止主节点后,需要等待5-10秒再查看redis2和redis3

redis-cli –p 6391


docker配置redis哨兵 docker redis 哨兵_docker_08


可以看到redis2变为了主节点,并且成功向其写入user2键

连接redis3查看一下


docker配置redis哨兵 docker redis 哨兵_docker配置redis哨兵_09


成功复制了刚在redis2中写入的user2键,查看info信息也发现其master port变成了6391(redis2)

这时再查看一下哨兵日志


docker配置redis哨兵 docker redis 哨兵_后台运行_10


可以发现哨兵发现redis实例,以及发现redis1 down掉后选取新主节点的整个过程。

================重点==================