【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是从机,因此也无法进行写操作

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

相关推荐
Estar.Lee3 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610035 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_5 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞5 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货5 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng6 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee6 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
新知图书7 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放7 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang7 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net