zoukankan      html  css  js  c++  java
  • Redis Sentinel 哨兵模式

    上个文章已经实现了 Redis 的读写分离,一主多从的结构已经搭建起来了,主节点负责写数据,从节点负责读数据,那么现在有个问题:如果主节点挂了,怎么办呢?

    Redis 提供了一种解决方案:Sentinel 哨兵模式。通过它可以实现:当主节点挂了以后,多个从节点会选出一个节点当主节点。

    以 Windows 系统为例,现在有三个一样的程序,首先实现读写分离,参照上一篇文章实现即可:https://www.cnblogs.com/jwen1994/p/12257958.html

     

    然后每个 Redis 目录下都新建一个:sentinel.conf 文件

    主节点下的文件内容如下:

    #当前Sentinel服务运行的端口
    port 26379
    #master
    #Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,
    #而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
    sentinel monitor mymaster 127.0.0.1 6379 1
    #指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。
    #只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
    sentinel down-after-milliseconds mymaster 5000
    #指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
    sentinel config-epoch mymaster 12
    #如果在该时间(ms)内未能完成failover操作,则认为该failover失败
    sentinel leader-epoch mymaster 13

    从节点下的文件内容如下:

    #当前Sentine2服务运行的端口
    port 26479
    #slave1
    sentinel monitor mymaster 127.0.0.1 6379 1
    sentinel down-after-milliseconds mymaster 5000
    sentinel config-epoch mymaster 12
    sentinel leader-epoch mymaster 13

    我们通过两个命令,去启动 Redis 和 Sentinel (每个 Redis 节点都去使用命令去启动)

    F:
    edis>redis-server.exe redis.windows.conf 
    
    F:
    edis>redis-server.exe sentinel.conf --sentinel

    这样就成功了,如果主节点挂了,多个从节点会选出一个节点当主节点。

    参考文章:https://blog.csdn.net/ITLTX1024/article/details/100665452

    如果认为干预该怎么实现从节点变主节点呢?通过以下两个命令

    slaveof no one # 取消主备,变更为主节点
    slaveof 新host 新节点 # 将其他节点设置为新主节点的备份节点

    sentinel 还有其他配置:

    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1

    命令讲解

    • sentinel monitor mymaster 127.0.0.1 6379 1 名称为 mymaster 的主节点名,1表示将这个主服务器判断为失效至少需要 1个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
    • down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
    • failover 过期时间,当 failover 开始后,在此时间内仍然没有触发任何 failover 操作,当前 sentinel 将会认为此次 failover 失败
    • parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

    如果从服务器被设置为允许使用过期数据集, 那么你可能不希望所有从服务器都在同一时间向新的主服务器发送同步请求, 因为尽管复制过程的绝大部分步骤都不会阻塞从服务器, 但从服务器在载入主服务器发来的 RDB 文件时, 仍然会造成从服务器在一段时间内不能处理命令请求: 如果全部从服务器一起对新的主服务器进行同步, 那么就可能会造成所有从服务器在短时间内全部不可用的情况出现

    Sentinel 三大工作任务

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

    互联网冷备和热备讲解,冷备和热备的特点分析

    冷备

    1)概念:冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库

    2)优点:

    • 是非常快速的备份方法(只需拷文件)
    • 低度维护,高度安全

    3)缺点:

    • 单独使用时,只能提供到“某一时间点上”的恢复
    • 再实施备份的全过程中,数据库必须要作备份而不能作其他工作。也就是说,在冷备份过程中,数据库必须是关闭状态

    热备

    1)概念:热备份是在数据库运行的情况下,采用archivelog mode方式备份数据库的方法

    2)优点:

    • 备份的时间短
    • 备份时数据库仍可使用
    • 可达到秒级恢复

    3)缺点

    • 若热备份不成功,所得结果不可用于时间点的恢复
    • 因难于维护,所以要非凡仔细小心

    Sentinel 是怎么工作的?

    主观下线:

    1)概念

    主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断

    2)主管下线特点:

    如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内,对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。服务器对 PING 命令的有效回复可以是以下三种回复的其中一种:

    • 返回  +PONG 。
    • 返回  -LOADING 错误。
    • 返回  -MASTERDOWN 错误。

    客观下线

    1)概念:

    指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

    2)客观下线特点:

    从主观下线状态切换到客观下线状态并没有使用严格的法定人数算法(strong quorum algorithm), 而是使用了流言协议: 如果 Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了足够数量的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线。 如果之后其他 Sentinel 不再报告主服务器已下线,那么客观下线状态就会被移除。

    3)客观下线注意点:

    客观下线条件只适用于主服务器:对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商,所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。 只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。

     

    Spring Boot 整合 Sentinel 的步骤

    步骤一:引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    步骤二:引入 yml 配置

    redis:
        sentinel:
            master: redis_master_group1 #mymaster
            nodes: 172.16.244.133:26379

    步骤三:启动 Spring Boot 服务,发送请求看配置是否有效

  • 相关阅读:
    转 Python学习(九)
    转 Python学习(八)
    转 Python学习(七)
    转 Python学习(六)
    转 Python学习(五)
    转 Python学习(四)
    转Python学习(三)
    转Python学习(一)
    面向对象第三章(向上造型、重写、重载)
    面向对象第一章(成员变量、局部变量、重载)
  • 原文地址:https://www.cnblogs.com/jwen1994/p/12259744.html
Copyright © 2011-2022 走看看