相关链接
redis-GitHub-配置文件下载:https://github.com/redis/redis
redis 官网配置文件:https://redis.io/topics/config
作者搭建记录:https://github.com/mailjobblog/dev_redis/tree/master/sentinel
redis哨兵原理 - 思维导图:https://kdocs.cn/l/spXDj5U6vDKF
实战演示的服务节点分布图 :https://kdocs.cn/l/sk1lDLmDbLqY
redis哨兵原理:https://blog.mailjob.net/posts/2778025183.html
redis 主从复制搭建:https://blog.mailjob.net/posts/1586519326.html
redis广播:https://blog.mailjob.net/posts/2416487960.html
搭建方法
实战演练
1、下载redis和哨兵的配置文件
我是用 docker 搭建的 redis 节点,没有 .conf 文件,所以我需要下载
redis.conf
和sentinel.conf
redis版本:6.0。下载地址:https://github.com/redis/redis
注释:下载配置文件的时候,请先查看自己的redis版本,然后下载匹配的redis配置文件,否则redis启动报错
2、首先建立redis主从复制
请参照上文中,相关链接中,redis 主从复制搭建 进行搭建
通过以上方法,搭建了3个redis节点
------------------------------------------------
名字--------IP--------------端口映射-------角色
redis1------172.30.0.10-----6000->6379-----mater
redis2------172.30.0.11-----6001->6379-----slave
redis3------172.30.0.12-----6002->6379-----slave
------------------------------------------------
3、开始建立3个哨兵节点
# 在 /data/redis_group/ 目录,创建 data4~data6 三个文件夹做数据卷
# 创建redis哨兵节点
docker run -itd -p 26000:26379 --network netredis --ip 172.30.0.20 -v /data/redis_group/data4:/data -v /data/redis_group/sentinel/sentinel-s1.conf:/etc/sentinel.conf --name redis-s1 [container id]
docker run -itd -p 26001:26379 --network netredis --ip 172.30.0.21 -v /data/redis_group/data5:/data -v /data/redis_group/sentinel/sentinel-s2.conf:/etc/sentinel.conf --name redis-s2 [container id]
docker run -itd -p 26002:26379 --network netredis --ip 172.30.0.22 -v /data/redis_group/data6:/data -v /data/redis_group/sentinel/sentinel-s3.conf:/etc/sentinel.conf --name redis-s3 [container id]
# 哨兵节点如下
------------------------------------------
名字----------IP--------------端口映射----
redis-s1------172.30.0.20-----26000->26379
redis-s2------172.30.0.21-----26001->26379
redis-s3------172.30.0.22-----26002->26379
------------------------------------------
4、修改哨兵的配置文件
哨兵 redis-s1 配置
vim /data/redis_group/sentinel/sentinel-s1.conf
daemonize yes
logfile "/data/log-sentinel.log"
sentinel monitor mymaster 172.30.0.10 6379 2
改好一份后,我复制了两份出来,sentinel-s2.conf、sentinel-s3.conf
这样,三个节点都有了配置文件
mymaster -是节点的起的别名,如果是多个集群,可以用集群的名字
6379 -是redis的端口
2 -至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
5、启动哨兵节点
# 进入哨兵容器
docker exec -it [container id] bash
# 启动哨兵
redis-sentinel sentinel.conf
redis-server sentinel.conf --sentinel
(二者作用是完全相同的)
6、查看是否配置成功
用 redis-cli 客户端操作哨兵 (26379是哨兵的默认端口)
>> redis-cli -p 26379
查看配置信息
127.0.0.1:26379> info sentinel
(或者使用命令也可以查看:sentinel master mymaster 【mymaster是配置哨兵的别名,自定义的名字】)
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.12:6379,slaves=2,sentinels=3
这里可以看到主节点的redis信息,从节点的个数,哨兵个数
7、模拟宕机测试
# 我把 (master)172.30.0.10 这个容器进行stop宕机
# 30s 后去查看了 172.30.0.10 的日志如下
# 发现主(msater)节点 172.30.0.10 转移到了 172.30.0.12
25:X 05 Feb 2021 14:49:50.331 # +sdown slave 172.30.0.10:6379 172.30.0.10 6379 @ mymaster 172.30.0.12 6379
# 去 172.30.0.11 查看了一下,12 变成了主节点
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.30.0.12
# 再次启动 172.30.0.10 ,发现它已经变成了从节点
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.30.0.11,port=6379,state=online,offset=547584,lag=0
slave1:ip=172.30.0.10,port=6379,state=online,offset=547584,lag=1
搭建报错问题
哨兵启动报错
root@85cbceb66bad:/data# redis-server /etc/sentinel.conf --sentinel
*** FATAL CONFIG FILE ERROR (Redis 6.0.10) ***
Reading the configuration file, at line 336
>>> 'SENTINEL resolve-hostnames no'
Unrecognized sentinel configuration statement.
这个是由于 docker 按照的 redis 版本和 引入数据卷使用的哨兵配置文件,版本不一致导致的