相关链接

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.confsentinel.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 版本和 引入数据卷使用的哨兵配置文件,版本不一致导致的