本文将利用docker搭建一个三节点的Redis哨兵集群,来监管之前的Redis主从集群:
(关于Redis主从集群的搭建见我的上一篇文章)
三个sentinel实例信息如下:
节点 | IP | 宿主机的映射端口 |
---|---|---|
sen-1 | 172.21.0.31 | 27001 |
sen-2 | 172.21.0.32 | 27002 |
sen-3 | 172.21.0.33 | 27003 |
一、利用docker搭建redis哨兵集群(三节点)
-
在本机上某位置新建文件夹
docker_redis/sen-1/conf
,docker_redis/sen-2/conf
,docker_redis/sen-3/conf
存放三个哨兵节点的配置文件 -
在
sen-1/conf
目录下创建一个配置文件sentinel.conf
,添加如下内容:port 26379 sentinel announce-ip 172.21.0.31 sentinel monitor mymaster 172.21.0.21 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 dir ./
说明:
port 26379
:是当前sentinel实例的端口(是在该容器内自己的端口,而不是在宿主机上的映射端口)sentinel monitor mymaster 172.21.0.21 6379 2
:指定哨兵监控的集群主节点信息(从节点信息可以通过主节点获取)mymaster
:主节点名称,自定义,任意写172.21.0.21 6379
:主节点的ip和端口2
:选举master时的quorum值(因为判断客观下线需要超过半数哨兵认为已下线,之前主从集群有三个节点,因此这里quorum值为2)
对于另外两个哨兵节点
sen-2
和sen-3
可以直接复制上面的sentinel.conf
到对应的conf
目录,然后修改sentinel announce-ip
为自己容器的ip,如下:port 26379 sentinel announce-ip 172.21.0.32 sentinel monitor mymaster 172.21.0.21 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 dir ./
port 26379 sentinel announce-ip 172.21.0.33 sentinel monitor mymaster 172.21.0.21 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 dir ./
由于每个容器都可以看作独立的机器,因此端口号都可以为自己容器上的26379,这个不用改。
-
从redis镜像启动三个redis实例容器,并分别将本机的27001、27002、27003端口映射到每个容器的26379端口,来模拟三个不同的哨兵节点。创建时将宿主机上的配置文件夹、data、log等挂载到容器中,并且将哨兵节点也加入之前的主从集群所在的子网中。
docker run -p 27001:26379 --restart=always --name sen-1 -v D:\docker_redis\sen-1\conf:/etc/redis -v D:\docker_redis\sen-1\data:/data -v D:\docker_redis\sen-1\log:/home/redis_sentinel/log --net redis --ip 172.21.0.31 -d redis redis-sentinel /etc/redis/sentinel.conf docker run -p 27002:26379 --restart=always --name sen-2 -v D:\docker_redis\sen-2\conf:/etc/redis -v D:\docker_redis\sen-2\data:/data -v D:\docker_redis\sen-2\log:/home/redis_sentinel/log --net redis --ip 172.21.0.32 -d redis redis-sentinel /etc/redis/sentinel.conf docker run -p 27003:26379 --restart=always --name sen-3 -v D:\docker_redis\sen-3\conf:/etc/redis -v D:\docker_redis\sen-3\data:/data -v D:\docker_redis\sen-3\log:/home/redis_sentinel/log --net redis --ip 172.21.0.33 -d redis redis-sentinel /etc/redis/sentinel.conf
注意:
-
每个容器的IP要与它们在宿主机上的配置文件中设置的IP相同
-
将宿主机上的
conf
文件夹挂载到容器内,防止容器关闭后配置丢失。注意这里不要直接挂载配置文件,否则可能导致哨兵没有写入配置文件的权限, 在日志中会报WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy.
,因此要采用直接挂载文件夹的形式
这样就搭建好了三节点的哨兵集群:
从启动日志可以看出,哨兵节点一启动就开始监视主从集群的状态了,并且也成功通过master获取到了其slave的信息,这里master和slave的IP和端口号与之前我们搭建的一主二从的主从集群完全一致。
-
-
哨兵集群建立成功,可以执行如下命令查看
-
进入某哨兵的终端:
docker exec -it sen-1 bash
连接哨兵:
redis-cli -h 127.0.0.1 -p 26379
查看sentinel信息:
info sentinel
-
二、测试
-
为模拟master宕机,这里手动将主节点
redis-m
停机 -
然后查看哨兵
sen-1
的日志
-
查看新的主节点
redis-s1
的日志
-
这时重启
redis-m
,模拟其已从故障中恢复
-
新主节点
redis-s1
的日志
-
原主节点
redis-m
的日志