redis哨兵

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: redis,哨兵,sentinel

sentinel工作原理:

在主从节点和sentinel节点集合配置好之后,sentinel节点之间会相互发送消息,以检测其余sentinel节点是否正常工作,并且sentinel节点也会向主从节点发送消息,以检测监控的主从节点是否正常工作。这里如果主节点因为故障下线,那么某个sentinel节点发送检测消息给主节点时,如果在指定时间内收不到回复,那么该sentinel就会主观的判断该主节点已经下线,那么其会发送消息给其余的sentinel节点,询问其是否"认为"该主节点已下线,其余的sentinel收到消息后也会发送检测消息给主节点,如果其认为该主节点已经下线,那么其会回复向其询问的sentinel节点,告知其也认为主节点已经下线,当该sentinel节点最先收到超过指定数目(配置文件中配置的数目和当前sentinel节点集合数的一半,这里两个数目的较大值)的sentinel节点回复说当前主节点已下线,那么其就会对主节点进行故障转移工作,故障转移的基本思路是在从节点中选取某个从节点向其发送slaveof no one(假设选取的从节点为127.0.0.1:6380),使其称为独立的节点(也就是新的主节点),然后sentinel向其余的从节点发送slaveof 127.0.0.1 6380命令使它们重新成为新的主节点的从节点。重新分配之后sentinel节点集合还会继续监控已经下线的主节点(假设为127.0.0.1:6379),如果其重新上线,那么sentinel会向其发送slaveof命令,使其成为新的主机点的从节点,如此故障转移工作完成。

环境:centos6.5 + redis 3.2.10

master:10.20.44.13:6379
slave1:10.20.44.17:6379
slave2:10.20.44.18:6379

redis主从安装:

sentinel安装:

[root@master ~]# cp /usr/local/redis/sentinel.conf /etc/
[root@master ~]# cat /etc/sentinel.conf                         ####注意,以下配置是有顺序的,不能打乱顺序
daemonize yes  
port 26379                                 #####哨兵自己的端口
dir /usr/local/redis/logs
sentinel monitor mymaster 10.20.44.13 6379 2                #配置主节点的ip和端口,2表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的)
sentinel down-after-milliseconds mymaster 30000                #如果30s内mymaster无响应,则认为mymaster宕机了  
sentinel failover-timeout mymaster 10000                        #如果10秒后,mysater仍没活过来,则启动failover  
sentinel auth-pass mymaster 123456                                #redis主节点密码 ,如果master没设置密码则不需要这一行
sentinel parallel-syncs mymaster 1                                #在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,同步时不能处理请求
logfile "sentinel.log"
protected-mode no                                        注意:在redis3.2之后一定要在哨兵配置文件中加入这一项,不然会哨兵节点之间无法通信,日志中会出现其余节点sdown情况

报错:
image

排查方法:

[root@master etc]# redis-cli -p 26379 -h 10.20.44.13 info              #出现下面错误即表示哨兵节点间无法通信,要去掉保护模式。
![image](https://yqfile.alicdn.com/e29f8372ca284ffc48e7d664a0e0c097d0fa9399.png)

验证sentinel:

[root@master etc]# redis-sentinel /etc/sentinel.conf
[root@master etc]# netstat -tnlp |grep 26379
[root@master etc]# redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 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=127.0.0.1:6379,slaves=2,sentinels=1
127.0.0.1:26379> sentinel masters                        //确认master的信息
127.0.0.1:26379> sentinel slaves mymaster                //确认slave信息


配置slave2,slave3服务:
[root@slave1 ]# scp /etc/sentinel.conf  10.20.44.17:/etc/sentinel.conf
[root@slave1 ]# scp /etc/sentinel.conf  10.20.44.18:/etc/sentinel.conf

启动slave2,slave3的哨兵服务:
[root@slave2 ]# redis-sentinel /etc/sentilen.conf
[root@slave3 ]# redis-sentinel /etc/sentilen.conf


验证自动切换:
[root@master etc]# redis-cli -p 6379 shutdown                //将主库关机
[root@slave1 ]# redis-cli -p 6379                //登录slave1,查看输出结果中角色是否为master
127.0.0.1:6380> info replication                
在这个系统中,初始状态下redis3是master, redis1和redis2是slave。之后redis3所在的主机网络不可用了,sentinel1和sentinel2启动了failover并把redis1选举为master,并且更新了自己的sentinel配置。
但是sentinel3依然持着的是旧配置,因为它与外界隔离了。如果此时客户端所连接的master被网络隔离,会发生什么呢?
客户端将依然可以向redis3写数据,但是当网络恢复后,redis3就会变成redis的一个slave,那么在网络隔离期间,客户端向redis3写的数据将会丢失。

你可以通过以下配置来配置redis3和redis1,使得数据不会丢失。修改redis.conf配置文件:
min-slaves-to-write 1
min-slaves-max-lag 10
通过上面的配置,当一个redis是master时,如果它不能向至少一个slave写数据(上面的min-slaves-to-write指定了slave的数量),它将会拒绝接受客户端的写请求。
由于复制是异步的,master无法向slave写数据意味着slave要么断开连接了,要么不在指定时间内向master发送同步数据的请求了(上面的min-slaves-max-lag指定了这个时间)。
Sentinel命令
127.0.0.1:26379> sentinel masters
127.0.0.1:26379> sentinel slaves mymaster
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
127.0.0.1:26379> SENTINEL reset mymaster
127.0.0.1:26379> SENTINEL failover mymaster
127.0.0.1:26379> SENTINEL flushconfig mymaster
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
NoSQL Redis Sentinel
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
面试官:Redis哨兵知道吧?知道的,Sentinel哨兵本质是一个运行在特殊模式下的Redis服务器。面试官:嗯然后呢?它的主要作用是通过检测Redis主从服务器的下线状态,选举出新Redis主服务器,也就是故障转移,来保证Redis的高可用性。
75 4
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
|
4月前
|
NoSQL Java Redis
SpringBoot2.0整合Redis高可用之Sentinel哨兵
本篇博文分享的是一主二从三哨兵模式。至于为什么用三个哨兵,同第一段。本文是模拟环境,都是一个服务器上面。
67 0
|
5月前
|
存储 监控 NoSQL
redis主从模式,redis哨兵模式,redis集群模式
redis主从模式,redis哨兵模式,redis集群模式
redis主从模式,redis哨兵模式,redis集群模式
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群
|
2月前
|
NoSQL Redis Docker
关于redis的一主三从三哨兵的实现
关于redis的一主三从三哨兵的实现
27 0
|
3月前
|
监控 NoSQL 程序员
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
77 5
|
3月前
|
NoSQL Linux Redis
Redis 6.X Sentinel 哨兵集群搭建
Redis 6.X Sentinel 哨兵集群搭建
32 5
|
3月前
|
缓存 NoSQL 算法
《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU
《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU
43 0
|
3月前
|
监控 NoSQL Redis
redis哨兵
redis哨兵
31 0
|
3月前
|
监控 NoSQL 算法
Redis哨兵机制详解:极致高可用和数据保护的神器
Redis哨兵机制详解:极致高可用和数据保护的神器
111 0