【Redis】Redis 哨兵

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
简介: 【Redis】Redis 哨兵

一、哨兵简介

image.png

如果master宕机了,哨兵会找一个slave作为master,通知其他所有的slave连接新的master,启动新的master与slave,进行数据同步(全量复制*N+部分复制 *N)

这个过程有几个问题:谁来确认master宕机了?用什么方法找一个master?修改配置后,原始的master恢复了怎么办?

哨兵(sentinel)  :是一个对主从结构中的每台服务器进行监控的分布式系统,当出现故障时通过投票机制选择新的master,并将所有slave连接到新的master;哨兵也是一台redis服务器,只是不提供数据服务,通常哨兵配置数量为奇数(防止投票时打平)

image.png

哨兵的作用

  • 监控:不断地进行master存活检测、master与slave运行情况检测
  • 通知(提醒):当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知
  • 自动故障转移:断开宕机的master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址

二、配置哨兵模式

配置一拖二的主从结构,配置三个哨兵(配置相同,端口不同),配置文件为Redis根目录下的sentinel.conf

启动哨兵


redis-sentinel sentinel-端口号.conf

1. 编写哨兵的配置文件

image.png

# 哨兵服务占用的端口
port 26379
# dir存放哨兵工作日志
dir /tmp
# mymaster:表示哨兵监控的master,名字可以任意取   
# 2:如果有2个哨兵认为mymaster挂了,那这个master就真的挂了,通常设置为哨兵总数的一半 + 1
sentinel monitor mymaster 127.0.0.1 6379 2
# mymaster 30000ms没响应,哨兵就认为mymaster挂了
sentinel down-after-milliseconds mymaster 30000
# 新的master选出来后,一次和几个slave进行数据同步
# 这个值越小,对服务器压力越小,同步速度越慢;这个值越大,对服务器压力越大,同步速度越快
sentinel parallel-syncs mymaster 1
# 如果同步时间超过180000ms,就认为数据同步超时
sentinel failover-timeout mymaster 180000

image.png

修改一下哨兵日志目录

image.png

修改端口,生成另外两个哨兵的配置文件。三个哨兵使用的端口分别是26379、26380、26381

image.png

2. 编写redis服务器的配置文件

查看redis服务器配置文件,6379为master,6380为slave

image.png

生成6381的slave

image.png

3. 启动redis服务器以及哨兵

启动一主两从三个redis服务器

image.png

启动26379哨兵

image.png

通过客户端登录已启动的26379哨兵服务器

image.png

在哨兵服务器上不能执行数据操作,只能执行哨兵对应的一些指令,我们输入info命令查看信息

image.png

info输出的信息中,我们可以看到哨兵监视的master以及master对应的slave数量,以及当前监视此master的哨兵数量

查看一下当前启动的26379哨兵对应的配置文件,发现配置文件改变了

image.png

启动26380哨兵

image.png

我们再查看一下26379哨兵的配置文件

image.png

此时26379哨兵服务器端也有2638哨兵监视master的提示信息。我们现在知道了,每启动一个新的哨兵去监视同一个master,哨兵之间都可以相互识别

image.png

同理,3个哨兵监视同一个master,三个哨兵的配置文件以及终端提示信息都是相互的,都能互相检测到

4. 验证哨兵的作用

如果master宕机了,哨兵会找一个slave作为master,通知其他所有的slave连接新的master。我们演示一下这个功能

我们先退出master

image.png

我们在哨兵配置文件中设置的是,30000ms内master没有响应,哨兵则认为master已经宕机,30000ms后,哨兵1的终端有如下提示信息:

image.png

作为master的6379下线后,主要过程就是所有哨兵都去确认6379是否真的下线,都确定6379下线后开始投票,从slave中选出新的master,然后为其他的slave更改master。并把下线的旧6379master设置为slave,后面6379上线后直接就是slave

我们启动6379 redis服务器

image.png

查看26379的提示信息,发现6379成为slave

image.png

三、哨兵工作原理

哨兵在进行主从切换过程中经历三个阶段:监控、通知、故障转移

  • 监控:同步信息
  • 通知:保持联通
  • 故障转移:发现问题、竞选sentinel、优选新master、新master上任,其他slave切换master,原master恢复后成为slave

1. 监控

用于同步各个节点的状态信息

image.png

  • 哨兵给其他哨兵发ping,获取各个sentinel的状态(是否在线)
  • 获取master的状态和master属性,包括runid、role等
  • 根据master中的slave信息,再找各个slave获取它们的详细信息,包括slave的runid、role、master_host、master_port、offset等

接下来详细说一下,哨兵、master和slave之间如何交换信息的

image.png

这时第一个哨兵上线连接master,拿到master的info,同时master也拿到哨兵的info。然后根据从master拿到的有关slave的信息,去连接slave,然后再拿到slave的info,至此第一个哨兵拿到了master和所有slave的info

image.png

然后第二个哨兵上线连接master,从master拿到info,从master的info就可以知道当前主从环境中master、slave、sentinel的数量以及ip:port,然后这个哨兵就去找其他的slave和sentinel交换信息

拿信息的同时会在sentinel之间建立发布-订阅通道,以共享info

image.png

第三个sentinel连接master上线后,就会获取当前所有的master、slave、sentinel的info,并加入sentinel的发布-订阅通道

2. 通知

sentinel会轮流询问master和slave的信息,然后在sentinel的朋友圈发布,其他sentinel进行订阅

image.png

3. 故障转移

首先sentinel1不断询问master,一直没响应,直到超过哨兵配置文件中的时间则认为这个master挂了,于是sentinel1把master的状态标记为sdown(主观下线),然后会在朋友圈发信息说master挂了

image.png

于是其他sentinel也不断询问master,看看有无回应。如果超过半数的sentinel后觉得master挂了,那就把master的状态标记为odown(客观下线)

master一旦标记为odown,sentinels就会开会,通过一定的算法选出一个sentinel去从slave中挑选新的master

image.png

现在sentinel会根据以下原则选出新的master:在线的、响应快的、与原master信息交互多的、offset大的(数据同步及时)、runid等等

image.png

选出新的master后,sentinel会做如下操作:

  • 给新的master发送salve of no one,断开新master与原master的主从关系
  • 向其他slave发送新master的ip:port,让其他slave重新确定master



相关实践学习
基于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
相关文章
|
4月前
|
NoSQL Redis Sentinel
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
面试官:Redis哨兵知道吧?知道的,Sentinel哨兵本质是一个运行在特殊模式下的Redis服务器。面试官:嗯然后呢?它的主要作用是通过检测Redis主从服务器的下线状态,选举出新Redis主服务器,也就是故障转移,来保证Redis的高可用性。
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
|
3月前
|
运维 监控 NoSQL
Redis Sentinel哨兵模式部署
Redis Sentinel哨兵模式部署
83 2
|
12天前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
3月前
|
监控 NoSQL Java
redis哨兵架构
不过为了高可用一般都推荐至少三个哨兵节点。为什么推荐奇数个哨兵节点跟集群奇数个master节点类似。
33 0
redis哨兵架构
|
2月前
|
消息中间件 监控 NoSQL
Redis哨兵改集群
【7月更文挑战第7天】
|
2月前
|
缓存 NoSQL Redis
Redis复制、哨兵
Redis复制、哨兵
33 0
|
3月前
|
存储 监控 NoSQL
Redis系列学习文章分享---第十二篇(搭建哨兵集群+RedisTemplate连接哨兵+搭建分片集群+-散列插槽+集群伸缩 +故障转移+RedisTemplate访问分片集群)
Redis系列学习文章分享---第十二篇(搭建哨兵集群+RedisTemplate连接哨兵+搭建分片集群+-散列插槽+集群伸缩 +故障转移+RedisTemplate访问分片集群)
136 0
|
4月前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
252 1
|
3月前
|
监控 NoSQL Redis
Redis哨兵,Redis哨兵核心功能如何一个云服务器完成6个节点的搭建-docker什么是docker是否可以把六个容器,都写到同一个ym配置中,一次都启动,不就直接保证互通问题了吗?
Redis哨兵,Redis哨兵核心功能如何一个云服务器完成6个节点的搭建-docker什么是docker是否可以把六个容器,都写到同一个ym配置中,一次都启动,不就直接保证互通问题了吗?