Redis sentinel(哨兵)介绍
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
Redis Sentinel**的主要功能**
Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。
Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:
监控:
Sentinel会不断的检查主服务器和从服务器是否正常运行。
通知:
当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
自动故障转移:
当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
配置提供者:
在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
Redis Sentinel**的工作流程**
参考链接(含图):http://www.cnblogs.com/jifeng/p/5138961.html
Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。
并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。
在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程还是蛮复杂的。
相关概念:
主观失效
SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
客观失效
ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
环境准备
准备3台机器,其中每台机器上都有两个角色,分配如下:
主机名 | IP:Port | 角色 |
---|---|---|
Jinaki01 | 192.168.111.136:6379 | Redis Master |
Jinaki05 | 192.168.111.140:6379 | Redis Slave1 |
Jinaki06 | 192.168.111.141:6379 | Redis Slave2 |
Jinaki01 | 192.168.111.136:26379 | Sentinel1 |
Jinaki05 | 192.168.111.140:26379 | Sentinel2 |
Jinaki06 | 192.168.111.141:26379 | Sentinel3 |
部署
安装Redis
步骤略(参考前面的笔记)
部署Redis主从
步骤略(参考前面的笔记)
部署Sentinel
三台Sentinel配置文件是一样的,编辑配置文件
vi /etc/sentinel.conf #内容如下
# 端口
port 26379
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/sentinel.log"
# 定义工作目录
dir /var/redis
# 定义Redis主的别名, 主IP, 主端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 192.168.111.136 6379 2
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster admin123
启动服务
启动顺序:主Redis -> 从Redis -> Sentinel1/2/3
注意启动顺序,顺序错误,可能导致sentinel连接不上
Sentinel 启动命令
redis-sentinel /etc/sentinel.conf --sentinel
Sentinel操作
输出被监控的主节点的状态信息
sentinel master mymaster
查看mymaster的从信息
sentinel slaves mymaster
查看其他Sentinel信息
sentinel sentinels mymaster
测试
停止主redis
查看日志cat /var/log/sentinel.log
开启原主redis 服务,原主redis 136变成了新主redis的从
客户端连接问题
使用sentinel后,客户端(如,php)如何连Redis呢?
参考:https://blog.51cto.com/chenql/1958910
多从之间选举新的主:
vim /etc/redis.conf
replica-priority 100 选择数值小的