首页 > 数据库 >聊聊Redis sentinel 机制

聊聊Redis sentinel 机制

时间:2023-04-16 23:12:36浏览次数:39  
标签:主库 选主 Redis 哨兵 聊聊 sentinel 从库 下线 主从

Redis 的哨兵机制自动完成了以下三大功能,从而实现了主从库的自动切换,可以降低 Redis 集群的运维开销:

  • 监控主库运行状态,并判断主库是否客观下线;
  • 在主库客观下线后,选取新主库;
  • 选出新主库后,通知从库和客户端。

 

一、为什么需要哨兵

主从模式下,如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。

而且,如果客户端发送的都是读操作请求,那还可以由从库继续提供服务,这在纯读的业务场景下还能被接受。但是,一旦有写操作请求了,按照主从库模式下的读写分离要求,需要由主库来完成写操作。

此时,也没有实例可以来服务客户端的写操作请求了,如下图所示:

 

 无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。所以,如果主库挂了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。

 

这就涉及到三个问题:

  • 主库真的挂了吗?
  • 该选择哪个从库作为主库?
  • 怎么把新主库的相关信息通知给从库和客户端呢?

  

二、哨兵机制的基本流程

哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。

哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。

 

1、监控

监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。

如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。

 

2、选主

这个流程首先是执行哨兵的第二个任务,选主。

主库挂了以后,哨兵就需要从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。这一步完成后,现在的集群里就有了新主库。

 

3、通知

然后,哨兵会执行最后一个任务:通知。

在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。

 

在这三个任务中,通知任务相对来说比较简单,哨兵只需要把新主库信息发给从库和客户端,让它们和新主库建立连接就行,并不涉及决策的逻辑。但是,在监控和选主这两个任务中,哨兵需要做出两个决策:

  • 在监控任务中,哨兵需要判断主库是否处于下线状态;
  • 在选主任务中,哨兵也要决定选择哪个从库实例作为主库。

  

三、主库下线和选主判断

1、哨兵集群

为了降低误判率,在实际应用时,哨兵机制通常采用多实例的方式进行部署,多个哨兵实例通过“少数服从多数”的原则,来判断主库是否客观下线。一般来说,我们可以部署三个哨兵,如果有两个哨兵认定主库“主观下线”,就可以开始切换过程。当然,如果你希望进一步提升判断准确率,也可以再适当增加哨兵个数,比如说使用五个哨兵。

 

2、如何判断

哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态

如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。

如果检测的是从库,那么,哨兵简单地把它标记为“主观下线”就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。

但是,如果检测的是主库,那么,哨兵还不能简单地把它标记为“主观下线”,开启主从切换。因为很有可能存在这么一个情况:那就是哨兵误判了,其实主库并没有故障。可是,一旦启动了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。

 

3、如何选定新主库?

一般来说,我把哨兵选择新主库的过程称为“筛选 + 打分”。简单来说,我们在多个从库中,按照一定的筛选条件,把不符合条件的从库去掉。

 

 

 

标签:主库,选主,Redis,哨兵,聊聊,sentinel,从库,下线,主从
From: https://www.cnblogs.com/binyue/p/17320666.html

相关文章

  • thinkphp: 用redis存储短信验证码(thinkphp v6.0.12LTS)
    一,配置redis1,编辑.env[REDIS0]TYPE=redisHOST=127.0.0.1PORT=6379PASSWORD=2,config/cache.php<?php//+----------------------------------------------------------------------//|缓存设置//+----------------------------------------------------......
  • Redis疑问
    为什么redis默认16个库,建议仅使用第一个库?如果Redis各个库都有在使用,会有以下影响或者问题:数据混乱:如果不同的应用程序使用同一个Redis的不同库,那么就可能出现键名冲突的情况,导致数据被覆盖或者错误地读取。同一个Redis不同库会导致数据被覆盖数据混乱的原因是:键名冲突:......
  • day02-Redis命令
    Redis命令1.Redis数据结构介绍Redis是一个key-value的数据库,key一般是String类型,value的类型多种多样,value常见的八种类型:Redis支持五种基本的数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset,有序集合)。各个数据类型应用场景:类型简介特性场景S......
  • thinkphp:redis+lua实现短信发送频率限制(thinkphp v6.0.12LTS)
    一,配置:.env中[REDIS0]TYPE=redisHOST=127.0.0.1PORT=6379PASSWORD=二,php代码:1,lib\util\SmsRateUtil.php<?phpnamespaceapp\lib\util;//短信验证码发送频率classSmsRateUtil{//redis连接private$redis;//60秒内不允许重复发送pri......
  • Redis
    一、redis数据类型1.字符串类型2.哈希类型(适合存储对象)3.列表4.set(无序不重复元素)5.sortedset(有序不重复元素)二.redis常用命令......
  • redis 一般有用 看1
    redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?区别:1.mc可缓存图片和视频。rd支持除k/v更多的数据结构;2.rd可以使用虚拟内存,rd可持久化和aof灾难恢复,rd通过主从支持数据备份;3.rd可以做消息队列。原因:mc多线程模......
  • Redis分布式锁这样用,有坑?
    背景在微服务项目中,大家都会去使用到分布式锁,一般也是使用Redis去实现,使用RedisTemplate、Redisson、RedisLockRegistry都行,公司的项目中,使用的是Redisson,一般你会怎么用?看看下面的代码,是不是就是你的写法StringlockKey="forlan_lock_"+serviceId;RLocklock=redis......
  • Redis:基本配置与使用?
    一、基于C语言,配置好c环境yuminstall-ygcctcl二、配置文件://监听的请求ip,默认为本地访问,修改为0000为任意访问bind0.0.0.0//设置程序为守护进程,即后台运行daemonizeyes//设置连接密码requirepasspassword//配置日志文件logfile"redis.log"//配置工作目......
  • Redis:数据类型和常用命令有哪些?
    通用命令查询所有的key:keys* 查询a开头的,长度为2的key:keysa?删除指定的key:delkeyName判断指定key是否存在:existskeyName给指定key设置有效期:expirekeyNameseconds查看key的剩余有效时间:ttlkeyName(-1为永久有效,-2为已被删除) ......
  • 【打怪升级】【微服务】聊聊微服务拆分设计
    并不是所有的场景都适合微服务,我理解技术开发者都有一颗追求新技术的心,但是更重要的是业务场景及团队。关于微服务微服务架构,说白了就是一种上层体系的演变。从最早的单体架构,到前后分离,SOA,甚至微服务架构,其实它们都在做一件事,并且都朝着一个方向去发展:那就是分而治之......