【Redis】高可用——哨兵

上一篇我们介绍了复制,正是由于复制的痛点,于是产生了哨兵(sentinel)

什么是哨兵

哨兵会巡查监控后台master主机,查看是否存在故障,如果故障了,就会根据投票数自动将某一个从库转换为新主库,继续对外服务(解决复制的痛点)

官方网址

redis.io/docs/manage...

简单来讲,哨兵就是一种无人值守的运维机制

功能

  • 监控redis运行状态,包括master和slave

    • 当master down机,能自动将slave切换成新master
  • 主从监控 · Monitoring

    • 监控主从库是否正常运行
  • 消息通知 · Notification

    • 可以将故障转移的结果发送给客户端
  • 故障转移 · Automatic failover

    • 如果主机异常会进行主从切换,将其中一个从机切换为新的主机
  • 配置中心 · Configuration provider

    • 客户端通过连接哨兵来获取当前redis服务的主节点地址

案例演示实战步骤

架构介绍

  • 3个哨兵

    • 自动监控和维护集群,不存放数据,只是"吹哨人"
  • 1主2从

    • 用于数据读取和存放

具体操作

配置

redis的一主二从配置建议参考前一篇的内容

配置好一主二从后,将解压缩后的Redis/opt目录下的sentinel.conf 复制到自定义的aqinredis文件夹中

接着进行相关配置修改

  • bind:服务监听地址,用于客户端连接,默认本机地址

  • daemonize:是否以后台daemon方式运行

  • protected-mode:安全保护模式

    • Redis 的保护模式(protected mode)是一种安全机制,旨在保护 Redis 实例免受未经授权的访问。当保护模式开启时,Redis 只允许来自本地主机的连接请求,而拒绝来自其他主机的连接请求

      • 保护模式的目的是防止未经授权的访问者远程连接到 Redis 服务器,并避免可能的安全漏洞。如果 Redis 实例暴露在公共网络中并且未开启保护模式,攻击者可能会发起针对 Redis 的恶意操作,例如读取、修改或删除数据,甚至执行系统命令
      • 通过将保护模式设置为开启,Redis 将限制对其服务器的访问,只允许来自本地主机的连接请求。这意味着只有在 Redis 实例运行在本地主机上,或者在本地主机上具有相应权限的客户端才能连接到 Redis。这种限制有助于减少潜在的安全风险,并提供了一层额外的保护
      • 要关闭保护模式,您需要修改 Redis 的配置文件(redis.conf)并将 protected-mode 选项设置为 no。但是,在这种情况下,您应该确保 Redis 实例受到适当的网络和身份验证措施的保护,以防止未经授权的访问。
  • port:端口

  • logfile:日志文件路径

  • pidfile:pid文件路径

  • dir:工作目录

(以上都可以按照配置Redis一主二从的文章对配置文件Redis.conf的修改)

设置要监控的主机服务器

  • sentinel monitor

  • quorum参数详解

    • quorum表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数
    • 我们知道,网络是不可靠的,有时候一个哨兵会因为网络堵塞而误以为一个Redis主机已经死掉了,在哨兵集群环境下需要多个哨兵互相沟通来确认某个主机是否真的死了,quorum这个参数是进行客观下线的一个依据,意思是至少有quorum个哨兵认为这个主机有故障,才会对这个主机进行下线以及故障转移。因为有的时候,某个哨兵节点可能因为自身网络原因,导致无法连接主机,而此时该主机并没有出现故障,所以,这就需要多个哨兵都一致认为该主机有问题,才可以进行下一步操作,这就保证了公平性高可用
  • sentinel auth-pass

下面👇提供需要配置的全部参数(跟着操作的同学🧑🎓直接拷贝即可,注意对应参数的修改)

xml 复制代码
bind 0.0.0.0
daemonize yes
protected-mode no
port <端口号>
logfile "/aqinredis/sentinel<端口号>.log"
pidfile /var/run/redis-sentinel<端口号>.pid
dir /<自定义存放的文件夹📁>
sentinel monitor mymaster <主机IP> <主机端口号> 2
sentinel auth-pass mymaster <密码>

按本文操作的3台配置分别如下图

bind 0.0.0.0 代表不限制就类似于把bind 127.0.0.1 注释掉

启动

执行redis-sentinel启动(记得添加软连接)

依次使用各自的配置文件启动

启动成功~

查看日志

查看哨兵日志,可以看到其监控的主从信息,以及烧饼集群的信息

原先的配置文件也会自动写入一些内容(下图红框框)

模拟主机宕机

接下来我们模拟主机宕机

此时有以下问题需要注意

  • 数据是否还在
  • 能否从剩下的两台主机中选出新的主机
  • 如果宕机的主机恢复,是否会出现主机冲突

过一段时间以后(给哨兵选举的时间)再尝试获取可以发现,原先的数据还在

尝试插入数据,会发现6381上可以,6380不行(还是只读)

查看下此时两台从机的信息

我们查看下sentinel日志,看看发生了什么

sentinel26379.log

sentinel26380.log

sentinel26381.log

从上面三个哨兵日志可以看到,哨兵在确认主机宕机后(我们的案例配置的quorum是2,即3个哨兵中至少有2个认为主机宕机就确认主机宕机),对从机进行了新主机的投票选举,最终决定将主机从 172.17.0.2 6379 切换成了 172.17.0.4 6381

重启172.17.0.2 6379,并查看其主从信息

可以看到,此时6379变成了6381的从机(不会出现主机冲突)

由于目前6379是从机,因此也无法进行写操作

下一篇------集群!敬请期待( ̄∇ ̄)/🎉~~~~~~~~~

相关推荐
谭光志3 分钟前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..7 分钟前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects13 分钟前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰13 分钟前
一些基础和问题解决
后端
陈随易31 分钟前
前端项目部署只要30秒
前端·后端·程序员
YIAN35 分钟前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana35 分钟前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端
学渣超36 分钟前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
北冥you鱼1 小时前
Go 语言读取链上数据:从基础到实战
开发语言·后端·golang
程序员cxuan1 小时前
Claude Code 为了封禁中国用户,竟然在代码里下毒
人工智能·后端·程序员