`

Sentinel-Redis高可用方案(二):主从切换

 
阅读更多

Redis 2.8版开始正式提供名为Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:

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

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

启动Sentinel

使用--sentinel参数启动,并必须指定一个对应的配置文件,系统会使用配置文件来保存 Sentinel 的当前状态, 并在 Sentinel 重启时通过载入配置文件来进行状态还原。

    redis-server /path/to/sentinel.conf --sentinel

使用TCP端口26379,可以使用redis-cli或其他任何客户端与其通讯。

如果启动 Sentinel 时没有指定相应的配置文件, 或者指定的配置文件不可写(not writable), 那么 Sentinel 会拒绝启动。

配置Sentinel

以下是一段配置文件的示例:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

    第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
    不过需要注意的是,无论你设置要多少个 Sentinel 同意才能判断一个服务器失效,一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持,才能发起一次自动故障迁移,并预留一个给定的配置纪元 (Configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。也就是说,如果只有少数(minority)Sentinel 进程正常运作的情况下,是不能执行自动故障迁移的。

    down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数(判定为主观下线SDOWN)。
    parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的从服务器因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。

主观下线和客观下线

    1. 主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。
    2. 客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。

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

每个Sentinel实例都执行的定时任务

    1. 每个 Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
    2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 一个有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
    3. 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
    4. 如果一个主服务器被标记为主观下线, 并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
    5. 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
    6. 当没有足够数量的 Sentinel 同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向 Sentinel 的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。

Sentinel API

有两种方式可以与Sentinel进行通讯:指令、发布与订阅。

    Sentinel命令

       PING :返回 PONG 。
       SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态;
       SENTINEL slaves <master name> :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;
       SENTINEL get-master-addr-by-name <master name> : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个                     命令返回新的主服务器的 IP 地址和端口号;
       SENTINEL reset <pattern> : 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel ;
       SENTINEL failover <master name> : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。

客户端可以通过SENTINEL get-master-addr-by-name <master name>获取当前的主服务器IP地址和端口号,以及SENTINEL slaves <master name>获取所有的Slaves信息

    发布与订阅信息

    客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
   一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
   通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。

        +switch-master <master name> <oldip> <oldport> <newip> <newport> :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。

    可以看出,我们使用Sentinel命令和发布订阅两种机制就能很好的实现和客户端的集成整合:
    使用get-master-addr-by-name和slaves指令可以获取当前的Master和Slaves的地址和信息;而当发生故障转移时,即Master发生切换,可以通过订阅的+switch-master事件获得最新的Master信息。

    *PS:更多Sentinel的可订阅事件参见官方文档

sentinel.conf中的notification-script

    在sentinel.conf中可以配置多个sentinel notification-script <master name> <shell script-path>, 如sentinel notification-script mymaster ./check.sh

    这个是在群集failover时会触发执行指定的脚本。脚本的执行结果若为1,即稍后重试(最大重试次数为10);若为2,则执行结束。并且脚本最大执行时间为60秒,超时会被终止执行。

    PS:目前会存在该脚本被执行多次的问题,查找资料有人解释是:
        脚本分为两个级别, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者仅由领头 Sentinel 执行(一个 Sentinel),而后者由监视同一个 master 的所有 Sentinel 执行(多个 Sentinel)。

分享到:
评论

相关推荐

    02-Redis持久化、主从与哨兵架构详解.zip

    本资料包主要探讨Redis的三个核心概念:持久化、主从复制和哨兵架构,这些都是确保Redis高可用性和数据安全的重要机制。 首先,我们来详细了解一下Redis的持久化。Redis提供了两种主要的持久化方式:RDB(Redis ...

    03-VIP-Redis缓存高可用集群(预习)1

    1. **哨兵模式**:在Redis 3.0以前,哨兵(Sentinel)系统常用于实现高可用性。哨兵监控Master节点状态,一旦检测到Master故障,会自动执行主从切换,将健康的Slave提升为新的Master。然而,哨兵模式有其局限性,如...

    【中间件篇-Redis缓存数据库06】Redis主从复制/哨兵 高并发高可用

    1. 哨兵系统的作用:哨兵(Sentinel)是Redis提供的高可用性解决方案,它负责监控、故障检测、自动故障迁移和配置更新。 2. 监控与故障检测:哨兵持续监控主从节点的状态,如果发现主节点故障,会进行故障检测。...

    Redis-Sentinel高可用架构学习

    当使用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-Sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现...

    docker-compose redis主从哨兵 redis多节点高可用 redis集群高可用

    这里我们将详细探讨如何利用Docker Compose部署Redis的主从哨兵配置和集群高可用性解决方案。 首先,Docker Compose是一个强大的工具,可以让我们通过YAML文件定义和运行多容器的Docker应用。在这个场景下,我们...

    redis-sentinel-demo:redis-sentinel示例,实现高可用(Auto Failover

    redis-sentinel示例,实现高可用(Auto Failover:自动故障转移),主从自动切换.包含redis配置,redis-sentinel配置,以及Java示例代码. 参考原帖地址:http://blog.csdn.net/pi9nc/article/details/17735653

    lua-resty-redis-connector:lua-resty-redis的连接实用程序

    5. **与 Redis Sentinel 集成**:支持通过 Redis Sentinel 系统进行主从切换,自动发现服务节点,提高容错能力。 **使用示例** ```lua local redis = require "resty.redis.connector" local red, err = redis:new...

    redis-2.8.19主从配置+sentinel主从切换+Java源码案例

    Redis Sentinel是监控和故障转移的组件,它监控主从节点的状态,当检测到主节点故障时,会自动进行主从切换。 1. **Sentinel配置**:创建新的Sentinel实例,配置文件`sentinel.conf`中需要指定主节点的ID、IP和端口...

    高可用Redis:主从复制、sentinel哨兵、漂移VIP故障转移.pdf

    总的来说,Redis的高可用性是通过主从复制来实现数据备份和读取负载分散,通过哨兵模式进行故障检测和自动故障转移,以及通过漂移VIP来实现服务的无缝切换。掌握这些知识点对于确保生产环境中的Redis稳定运行和数据...

    redis 哨兵(sentinel)与springboot集成实战-redis-sentinel.zip

    Redis Sentinel是Redis的一个高可用性解决方案,它提供了监控、故障检测和自动故障转移等功能,确保在主Redis服务器出现故障时,系统能够无缝地切换到备份节点,从而保持服务的连续性和稳定性。SpringBoot是一个轻量...

    redis-windows-Redis7.0.0.zip

    在高可用性架构中,Redis Sentinel系统可以监控、提醒并自动处理主从切换,保证服务的连续性。 总的来说,Redis作为一款高性能的键值数据库,因其强大的功能和易用性,在Windows平台上的应用同样广泛。通过理解其...

    Redis高可用解决方案:哨兵(Sentinel)(csdn)————程序.pdf

    Redis Sentinel是Redis高可用性(HA)解决方案的核心组件,它设计用于监控、故障检测以及自动故障转移主从架构中的主服务器。哨兵系统由多个独立的Sentinel实例组成,它们协同工作以确保在主服务器出现问题时,能够...

    redis linux安装主从自动切换配置

    1. 配置Sentinel(哨兵)系统,Sentinel是Redis的高可用性解决方案,负责监控、故障检测和自动故障切换。 2. 安装Sentinel:重复Redis的安装步骤,但需要安装特定的Sentinel版本。 3. 修改Sentinel配置文件(如/etc/...

    Redis Sentinel主从高可用方案1

    Redis Sentinel 提供了一种强大的高可用性解决方案,通过监控、通知和自动故障迁移功能,确保 Redis 集群在主节点故障时仍能保持服务,同时通过 Jedis SentinelPool 支持,使得客户端能轻松适应这种变化,实现平滑的...

    redis-sentinel-bin.7z

    Redis Sentinel是Redis的高可用性(HA)组件,它监控主从复制结构中的Redis服务器,当检测到主服务器出现故障时,Sentinel系统会自动将一个从服务器提升为主服务器,并通知其他从服务器进行切换,从而实现故障恢复。...

    django-redis组件

    `django-redis` 支持 Redis Sentinel 或 Cluster 模式,可以实现主从复制和故障切换,确保服务的稳定性。同时,Redis 提供的 RDB 和 AOF 两种持久化方式,也能保证数据的安全性。 总的来说,`django-redis` 是 ...

    redis主从配置以及哨兵模式配置

    通过以上步骤, 可以成功构建一个基于 Redis 的高性能、高可用的服务架构。 通过实际部署和测试, 我们可以发现这一配置过程虽然较为复杂, 但是只要按照文档和步骤仔细操作, 就能顺利完成。同时, 针对可能出现的问题,...

    windows redis 主从集群实例加哨兵集群

    Redis Sentinel是一个高可用性解决方案,用于监控、警告以及自动故障转移。哨兵系统会持续检查主从集群的状态,当检测到主节点失效时,会自动将从节点提升为主节点,并通知其他客户端更新连接信息。这样可以极大地...

    redis主从配置及主从切换.rar

    4. **哨兵(Sentinel)系统**:Redis Sentinel是高可用性解决方案,它监控主从节点状态,自动执行故障转移。配置Sentinel需要修改Sentinel的配置文件,指定要监控的主节点及其从节点。 5. **故障检测**:Sentinel会...

    redis-session-manager-redis-session-manager-2.0.6.zip

    - 高可用性:Redis支持主从复制和Sentinel监控,确保session数据的安全性和服务的连续性。 - 持久化:Redis支持多种持久化策略(如RDB、AOF),保证了数据在服务器重启或故障时不会丢失。 - 容错性:如果主Redis...

Global site tag (gtag.js) - Google Analytics