redis6.x高可用监控之Sentinel哨兵模式

1.Sentinel哨兵介绍

  • 背景

    • 前面搭建了主从,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,人工干预费事费力,还会造成一段时间内服务不可用
  • 哨兵模式介绍

    • redis提供了哨兵的命令,是一个独立的进程
    • 原理:哨兵通过发送命令给多个节点,等待redis服务器响应,从而监控运行的多个redis实例的运行情况
    • 当哨兵监测到master宕机,会自动将slave切换成master,通过通知其他的从服务器,修改配置文件切换主机
  • Sentinel三大工作任务

    • 监控(Monitoring)
      • Sentinel会不断地检查你的主服务器和从服务器是否运作正常
    • 提醒(Notification)
      • 当被监控的某个redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知
    • 自动故障迁移(Automatic failover)
      • 当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器
      • 当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
  • 问题

    • 一个哨兵进程对redis服务器进行监控,可能会出现问题
    • 一般是使用多个哨兵进行监控,各个哨兵之间还会进行监控,形成多哨兵模式
  • 多哨兵模式下线名称介绍

    • 主观下线(Subjectively Down,简称SDOWN)
      • 是单个Sentinel实例对服务器做出的下线判断,比如网络问题接收不到通知等
      • 一个服务器没有在down-after-milliseconds选项所指定的时间内,对向它发送PING命令的Sentinel返回一个有效回复(valid reply),那么Sentinel就会将这个服务器标记为主观下线
    • 客观下线(Objectively Down,简称ODOWN)
      • 指的是多个Sentinel实例在对同一个服务器做出SDOWN判断,并且通过SENTINEL is-master-down-by-addr命令互相交流之后,得出的服务器下线判断
      • 一个Sentinel可以通过向另一个Sentinel发送SENTINEL is-master-down-by-addr命令来询问对方是否认为给定的服务器已下线
      • 客观下线条件只适用于主服务器
    • 仲裁qurum
      • Sentinel在给定的时间范围内,从其他Sentinel那里接收到了【足够数量】的主服务器下线报告,那么Sentinel就会将主服务器的状态从主观下线改变为客观下线
      • 这个【足够数量】就是配置文件里面的值,一般是Sentinel个数的一半加1,比如3个Sentinel则就设置为2
      • down-after-milliseconds是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用
      • 当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover

2.Sentinel哨兵流程和实战

  • 核心流程

    • 每秒ping,超时不响应则认为主观下线
    • 满足多个主观下线,则认为是客观下线
    • 投票选择主节点
    • 如果没有足够的节点同意master下线,则状态会被移除
  • 环境准备

    # 不限制ip
    bind 0.0.0.0
    # 让sentinel服务后台运行
    daemonize yes
    # 配置监听的主服务器,mymaster:服务器名称,自定义; 127.0.0.1 6379:监控的主服务器端口; 2:代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作
    sentinel monitor mymaster 127.0.0.1 6379 2
    # 定义服务的密码,mymaster:服务器名称; 123456:服务器密码
    sentinel auth-pass mymaster 123456
    # 超过5秒master还没有连接上,则认为master已经停止
    sentinel down-after-milliseconds mymaster 5000
    # 如果该时间内没完成failover操作,则认为本次failover失败
    sentinel failover-timeout mymaster 30000
    
    • 创建哨兵1配置vim sentinel1.conf

      port 26379
      bind 0.0.0.0
      daemonize yes
      pidfile "/usr/local/redis/temp/sentinel1.pid"
      logfile "/usr/local/redis/temp/sentinel1.log"
      dir "/usr/local/redis/temp"
      sentinel monitor mymaster 123.57.94.239 6379 2
      sentinel down-after-milliseconds mymaster 5000
      sentinel auth-pass mymaster 123456
      sentinel failover-timeout mymaster 30000
      
    • 创建哨兵2配置vim sentinel2.conf

      port 26380
      bind 0.0.0.0
      daemonize yes
      pidfile "/usr/local/redis/temp/sentinel2.pid"
      logfile "/usr/local/redis/temp/sentinel2.log"
      dir "/usr/local/redis/temp"
      sentinel monitor mymaster 123.57.94.239 6379 2
      sentinel down-after-milliseconds mymaster 5000
      sentinel auth-pass mymaster 123456
      sentinel failover-timeout mymaster 30000
      
    • 创建哨兵3配置vim sentinel3.conf

      port 26381
      bind 0.0.0.0
      daemonize yes
      pidfile "/usr/local/redis/temp/sentinel3.pid"
      logfile "/usr/local/redis/temp/sentinel3.log"
      dir "/usr/local/redis/temp"
      sentinel monitor mymaster 123.57.94.239 6379 2
      sentinel down-after-milliseconds mymaster 5000
      sentinel auth-pass mymaster 123456
      sentinel failover-timeout mymaster 30000
      
  • 启动

    ./bin/redis-sentinel ./temp/sentinel1.conf
    ./bin/redis-sentinel ./temp/sentinel2.conf
    ./bin/redis-sentinel ./temp/sentinel3.conf
    
  • 优点

    • 主从可以自动切换,可用性更高
  • 缺点

    • 主从切换会丢失短暂数据
    • 主节点的写能力和存储能力受限

3.SpringBoot整合redis主从+Sentinel哨兵

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 123.57.94.239:26379,123.57.94.239:26380,123.57.94.239:26381
    cache:
    # 指定缓存类型
    type: redis
    password: 123456
posted @ 2021-08-02 10:13  Gen2021  阅读(249)  评论(0编辑  收藏  举报