Redis从2.8开始正式提供了Redis Sentinel(哨兵)来实现高可用。
Redis Sentinel具有以下几个功能:
Redis主从复制模式是将主节点的数据改变同步给从节点,从节点即可以做备份也可以扩展主节点读能力。
但是主从复制模式存在如下问题:
当主节点出现故障时,Redis Sentinel能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。
Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点。每个Sentinel节点会对数据节点和其他Sentinel节点进行监控,当发现其他节点不可达时,会对节点做下线标识。如果被标识的是主节点,并且大多数Sentinel节点都认为主节点不可达时,则会选举出一个Sentinel节点来完成自动故障迁移工作,不需要人工干预。Redis Sentinel方案有效解决了Redis的高可用问题。
如下图所示,Redis Sentinel与Redis主从复制模式只是多了若干Sentinel节点并没有针对Redis节点做了特殊处理。
下面将以3个Sentinel节点、1个主节点、2个从节点组成一个Redis Sentinel为例进行部署。
物理结构如下表所示:
角色 | ip | port |
---|---|---|
master | 127.0.0.1 | 6379 |
slave-1 | 127.0.0.1 | 6380 |
slave-2 | 127.0.0.1 | 6381 |
sentinel-1 | 127.0.0.1 | 26379 |
sentinel-2 | 127.0.0.1 | 26380 |
sentinel-3 | 127.0.0.1 | 26381 |
Redis Sentinel中Redis数据节点没有做任何特殊配置,只需正常安装启动。
配置:
redis-6379.conf
port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/opt/soft/redis/data/"
启动主节点:
redis-server redis-6379.conf
验证:
redis-cli -h 127.0.0.1 -p 6379 ping
配置1(从节点2配置同理):
redis-6380.conf
port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 6379
启动从节点:
redis-server redis-6380.conf
redis-server redis-6381.conf
验证:
redis-cli -h 127.0.0.1 -p 6380 ping
redis-cli -h 127.0.0.1 -p 6381 ping
主节点视角下有两个从节点,分别是127.0.0.1:6380和127.0.0.1:6381
$ redis-cli -h 127.0.0.1 -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=281,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=281,lag=0
···
从节点的视角,它的主节点是127.0.0.1:6379
$ redis-cli -h 127.0.0.1 -p 6380 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
···
redis-sentinel-26379.conf
port 26379
daemonize yes
logfile "26379.log"
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2 # 监控127.0.0.1:6379这个主节点(别名 mymaster),2代表判断主节点失败至少需要2个Sentinel节点同意
sentinel down-after-milliseconds mymaster 30000 # 判定节点不可达超时时间,单位毫秒
sentinel parallel-syncs mymaster 1 # 故障转移后,每次向主节点发起复制操作的从节点个数
sentinel failover-timeout mymaster 180000 # 故障转移超时时间
#sentinel auth-pass <master-name> <password> # 主节点密码
#sentinel notification-script <master-name> <script-path> # 故障转移期间事件通知脚本
#sentinel client-reconfig-script <master-name> <script-path> # 故障转移结束后触发脚本
Sentinel节点的启动方法有两种:
redis-sentinel redis-sentinel-26379.conf
redis-server redis-sentinel-26379.conf --sentinel
Sentinel节点本质上是一个特殊的Redis节点,所以也可以通过info命令来查询它的相关信息:
$ redis-cli -h 127.0.0.1 -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
从info的Sentinel片段看,Sentinel节点找到了主节点127.0.0.1:6379,发现了它的两个从节点,同时发现Redis Sentinel一共有3个Sentinel节点。
sentinel masters # 展示所有被监控的主节点状态和统计信息
sentinel master <master name> # 展示指定<master name>的主节点状态以及统计信息
sentinel slaves <master name> # 展示指定<master name>的从节点以及相关统计信息
sentinel sentinels <master name> # 展示指定<master name>的Sentinel节点集合(不包含当前Sentinel节点)
sentinel get-master-addr-by-name <master name> # 返回指定<master name>主节点的IP地址和端口
sentinel reset <pattern> # 当前Sentinel节点对符合<pattern>(通配符风格)主节点的配置进行重置,包含清除主节点的相关状态(例如故障转移),重新发现从节点和Sentinel节点
sentinel failover <master name> # 对指定<master name>主节点进行强制故障转移(没有和其他Sentinel节点“协商”),当故障转移完成后,其他Sentinel节点按照故障转移的结果更新自身配置
sentinel ckquorum <master name> # 检测当前可达的Sentinel节点总数是否达到<quorum>的个数
sentinel flushconfig # 将Sentinel节点的配置强制刷到磁盘上
sentinel remove <master name> # 取消当前Sentinel节点对于指定<master name>主节点的监控
sentinel monitor <master name> <ip> <port> <quorum> # 通过命令的形式来完成Sentinel节点对主节点的监控
sentinel set <master name> # 动态修改Sentinel节点配置选项
sentinel is-master-down-by-addr # Sentinel节点之间用来交换对主节点是否下线的判断
Redis Sentinel的基本实现原理,具体包含以下几个方面:
Redis Sentinel的三个定时任务、主观下线和客观下线、Sentinel领导者选举、故障转移。
Redis Sentinel通过三个定时任务完成对各个节点发现和监控:
Redis Sentinel的第三个定时任务中,每个Sentinel节点会每隔1秒对主节点、从节点、其他Sentinel节点发送ping命令做心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个行为叫做主观下线。主观下线存在误判的可能。
当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过
假如Sentinel节点对于主节点已经做了客观下线,接下来Redis会基于Raft算法从Sentinel节点之间会做一个领导者选举的工作,选出一个Sentinel节点作为领导者进行故障转移的工作。
Sentinel节点选举大致思路如下:
领导者选举出的Sentinel节点负责故障转移,具体步骤如下:
原文:https://www.cnblogs.com/haif/p/14322134.html