【redis】redis的哨兵

1.redis的哨兵机制

1.主从复制的问题 
一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同事需要修改应用
方的主节点,还需要命令其他从节点去复制新的主节点,这个过程都需要人工干预。
主节点的写能力受到单机的限制。
主节点的存储能力受到单机的限制。

将独立的从节点提升为主节点:
slaveof no one; 

2.redis sentinel高可用 
当主节点出现故障时,redis sentinel 能自动完整故障发现和故障转移,并通知
应用方,从而实现真正的高可用。

redis sentinel 是一个分布式架构,其中包含若干个sentinel节点和redis数据节点,
每个sentinel节点会对数据节点和其余sentinel节点进行监控,当它发现节点不可达时,
会对节点做下线处理。如果被标识的节点是主节点,它还会和其他sentinel节点进行
协调,当大多数sentinel节点都认为主节点不可达时,它们会选举出一个sentinel节点
来完成自动故障转移。同时会将这个变化实时通知给应用方。
redis sentinel与redis主从复制模式只是多了若干sentinel节点,所以redis sentinel 
并没有针对redis节点做了特殊处理。
从逻辑架构上看,sentinel节点集合会定期对所有节点进行监控,特别是对主节点
的故障实现自动转移。

3.故障转移处理的四个流程 
(1)主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。
(2)每个sentinel节点通过定期监控发现主节点出现了故障。
(3)多个sentinel节点对主节点的故障达成一致,选举出 sentinel-3节点作为领导者负责故障转移。
(4)sentinel领导者节点执行了故障转移。

redis sentinel的功能:
监控:sentinel节点会定期检测redis数据节点,其余sentinel节点是否可达。
通知:sentinel节点会将故障转移的结果通知给应用方。
主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
配置提供者:在redis sentinel结构中,客户端在初始化的时候连接的是sentinel
节点集合,从中获取主节点信息。

4.安装和部署sentinel  
(1)启动主节点 
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  
(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-6381.conf  
port 6381 
daemonize yes 
logfile "6381.log"
dbfilename "dump-6381.rdb"
dir "/opt/soft/redis/data"
slaveof 127.0.0.1 6379 

redis-server redis-6381.conf
redis-server redis-6380.conf

redis-cli -h 127.0.0.1 -p 6380  ping 
redis-cli -h 127.0.0.1 -p 6381  ping 

(3)确认主从关系 
redis-cli -h 127.0.0.1 -p 6379 info replication 
redis-cli -h 127.0.0.1 -p 6380 info replication 

(4)配置sentinel节点 
vi 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 
sentinel down-after-milliseconds mymaster 30000 
sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000 

vi redis-sentinel-26380.conf 
port 26380 
daemonize yes  
logfile "26380.log"
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2 
sentinel down-after-milliseconds mymaster 30000 
sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000 

vi redis-sentinel-26381.conf 
port 26381 
daemonize yes  
logfile "26381.log"
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2 
sentinel down-after-milliseconds mymaster 30000 
sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000 


--说明
sentinel monitor mymaster 127.0.0.1 6379 2
2 代表判断主节点失败至少需要2个sentinel节点同意。
mymaster是主节点的别名。

启动sentinel节点:
redis-sentinel redis-sentinel-26379.conf 
或者:
redis-server redis-sentinel-26379.conf --sentinel 

--检查
sentinel节点本质上是一个特殊的redis节点。
redis-cli -h 127.0.0.1 -p 26379  info sentinel 

生产注意事项:
生产环境中建议redis sentinel的所有节点应该分布在不同的物理机上
redis sentinel中数据节点和普通的redis数据节点在配置上没有区别。
只不过是添加了一些sentinel节点对他们进行监控。

sentinel节点参数说明:
sentinel monitor mymaster 127.0.0.1 6379 2 
sentinel down-after-milliseconds mymaster 30000 
sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000 

sentinel monitor:
监控的主节点和故障转移时需要的票数。
sentinel down-after-milliseconds:每个sentinel节点都要通过定期发送ping命令 
来判断redis数据节点和其余sentinel节点是否可达,如果超过了down-after-milliseconds
配置的时间且没有有效的回复,则判定节点不可达。
sentinel parallel-syncs :用来限制在一次故障转移后,每次向新的主节点发起复制
操作的从节点个数。
sentinel failover-timeout:通常被解释为故障转移的超时时间。

sentinel auth-pass mymaster pw123456 
如果sentinel监控的主节点配置了密码,sentinel auth-pass 配置通过添加主节点
的密码,防止sentinel节点对主节点无法监控。
sentinel notification-script 的作用是在故障转移期间,当一些告警级别的
sentinel事件发生时,会触发对应路径的脚本,并向脚本发送相应的事件参数。

5.sentinel set 命令支持的参数 
quorum:sentinel set mymaster quorum 2  
down-after-milliseconds: 	sentinel set mymaster down-after-milliseconds 30000 
failover-timeout: 			sentinel set mymaster failover-timeout 360000
parallel-syncs: 			sentinel set mymaster parallel-syncs 2 
notification-script: 		sentinel set mymaster notification-script /opt/xxx.sh  
client-reconfig-script: 	sentinel set mymaster client-reconfig-script /opt/yy.sh 
auth-pass: 					sentinel set mymaster auth-pass pw123456

注意事项:
sentinel set命令只对当前sentinel节点有效。
sentinel set命令如果执行成功会立即刷新配置文件,这点和redis普通数据节点设置需要执行 
config rewrite 刷新到配置文件不同。
建议所有sentinel系欸但那的配置尽可能一致,这样在故障发现和转移时比较容易达成一致。
sentinel对外不支持config命令。

6.sentinel的常用API;
--查看被监控的主节点的状态
127.0.0.1:26379> sentinel masters 
--展示一个主节点的状态及统计信息。
127.0.0.1:26379> sentinel master mymaster-1 
--展示从节点的状态及统计信息
127.0.0.1:26379> sentinel slaves mymaster-1 
--展示sentinel节点集合
127.0.0.1:26379> sentinel sentinels mymaster-1 
--返回指定集群对应的主节点的IP和PORT;
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster-1 
--清除主节点的相关状态,重写发现从节点和sentinel节点。
127.0.0.1:26379> sentinel reset mymaster-1 
--对指定主节点进行强制故障转移。
127.0.0.1:26379> sentinel failover mymaster-1 
--检测当前可达的sentinel节点数是否达到 quorum 个数。
127.0.0.1:26379> sentinel ckquorum mymaster-1 
--将sentinel节点的配置强制刷到磁盘上,当配置文件损害或者丢失时很有用。
127.0.0.1:26379> sentinel flushconfig 
--取消当前sentinel节点对于指定主节点的监控。
127.0.0.1:26379> sentinel remove mymaster-1
--添加对主节点的监控 
127.0.0.1:26379> sentinel monitor mymaster-1 127.0.0.1 6379 2 

7.redis sentinel的实现原理 
redis sentinel的三个定时任务,主观下线和客观下线,sentinel领导者选举,故障转移。
三个定时任务:
redis sentinel通过三个定时任务完成对各个节点的发现和监控。
(1)每隔10s,每个sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构。
	这个定时任务的作用:
	通过向主节点执行info命令,获取从节点的信息。
	当有新的从节点加入时可以立即感知出来。
	节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息。
(2)每隔2s,每个sentinel节点会向redis数据节点的 __sentinel__:hello 频道上发送该
sentinel节点对于主节点的判断以及当前sentinel节点的信息。同时每个sentinel节点 
也会订阅该频道,来了解其他sentinel节点以及他们对主节点的判断。这个定时任务完成
两个工作:
	发现新的sentinel节点
	sentinel节点之间交换主节点的状态。
	
(3)每隔1s,每个sentinel节点会向主节点,从节点,其余sentinel节点	
发送一条ping命令做一次心跳检测,来确认这些节点是否可达。

8.主观下线和客观下线 
(1)主观下线 
每个sentinel节点会每隔1s对主节点,从节点,其他sentinel节点发送ping命令做
心跳检测,当这些节点超过down-after-milliseconds进行有效回复,sentinel就会
对该节点做失败判定,这个行为叫做主观下线。
(2)客观下线 
当 sentinel主观下线的节点是主节点时,该sentinel节点会通过 sentinel is-master-down-by-addr 
命令向其他sentinel节点询问对主节点的判断,当超过 quorum 个数,sentinel节点认为 
主节点确实有问题。这时该sentinel节点会做出客观下线的决定。

9.故障转移的步骤 
(1)在从节点列表中选举一个节点作为新的主节点。
	a.过滤"不健康",5s内没有回复过sentinel节点ping 响应,与主节点失联超过
	down-after-milliseconds*10s。
	b.选择slave-priority 最高的从节点列表,如果存在则返回,不存在则继续。
	c.选择复制偏移量最大的从节点,如果存在则返回,不存在则继续。
	d.选择runid最小的从节点。
(2)sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点。
(3)sentinel领导者节点会向剩余的从节点发送命令,让他们成为新的主节点的从节点,
复制规则和 parallel-syncs 参数有关。
(4)sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复 
后命令它去复制新的主节点。

10.节点运维 
(1)节点下线 
临时下线:暂时将节点关掉,之后还会重新启动,继续提供服务。
永久下线:将节点关掉后不再使用,需要做一些清理工作,如删除配置文件,持久化文件,日志文件。

节点下线的原因:
节点所在的机器出现了不稳定或者即将过保被回收 
节点所在机器性能比较差或者内存比较小,无法支撑应用方的需求。
节点自身出现服务不正常情况,需要快速处理。

(2)主节点下线
如果需要手工对主节点进行下线,可以使用 sentinel failover 功能将从节点晋升为主节点。
sentinel failover master-1 
如果想要将指定从节点晋升为主节点,可以将其他从节点的slavepriority配置为0,但是需要
注意 failover 后,将slave-priority调回原值。
	
(3)从节点和sentinel节点下线。
如果需要对从节点或者sentinel节点进行下线,只需要确定好时临时还是永久下线后执行 
相应操作即可。如果使用了读写分离,下线从节点需要保证应用方可以感知从节点的下线
变化,从而把读取请求路由到其他节点。

(4)节点上线 
添加从节点的场景:
使用了读写分离,但现有的从节点无法支撑应用方的流量。
主系欸但没有可用的从节点,无法支持故障转移。
添加一个更强悍的从节点利用手动failover替换主节点。

添加sentinel节点的场景:
当前sentinel节点数量不够,无法达到redis sentinel健壮性要求或者无法达到票数。
原sentinel节点所在机器需要下线。

节点配置需要注意的地方:
sentinel节点配置尽可能一致,这样在判断节点故障时会更加准确。
sentinel节点支持的命令非常有限,例如 config命令是不支持的,而sentinel
节点也需要dir,loglevel 之类的配置.

(5)sentinel节点支持的命令如下:
ping  
sentinel
subscribe 
unsubscribe 
psubscribe 
punsubscribe 
publish 
info 
role 
client 
shutdown 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值