精华内容
下载资源
问答
  • redis的哨兵模式

    2020-07-24 19:04:10
    redis的哨兵模式1. redis的哨兵模式2. redis的Sentinel的启动3. redis的Sentinel的配置3.1 monitor 监控3.2 下线等待时间3.3 自动故障迁移超时时间3.4 master同步数据的slave数量3.5 示例4. 主观下线和客观下线5. ...

    1. redis的哨兵模式

    redis的哨兵(Sentinel)模式用于管理多个redis服务器。主要实现以下三个功能:

    • 监控:Sentinel会不断的检查redis的master和slave是否运行正常。
    • 提醒:当被监控的某个redis的服务器出现问题时,Sentinel可以通过API向管理员或者其他程序发送自动通知。
    • 自动故障转移:当一个master不能正常工作时,Sentinel会开始一次自动故障迁移操作。Sentinel会将失效的master中的一个slave升级为master。并且让其他slave复制新master的数据。当客户端试图连接旧master时,集群会向客户端返回新master的地址,使得集群可以使用新master替换失效的master.

    Redis Sentinel是一个分布式系统,在集群中可以运行多个Sentinel的实例。这些实例之间使用流协议(gossip protocols)来接收master是否下线的信息。并使用投票协议(agreement protocols)来决定是否执行自动故障转移,选择哪个slave做为新的master。

    2. redis的Sentinel的启动

    redis Sentinel在编译完成后是一个单独的可执行文件redis-sentinel。但是实际上只是一个运行在特殊模式下的redis服务器,可以使用redis-server通过给定--sentinel参数来启动Sentinel。

    目前 Sentinel 系统是 Redis 的 unstable 分支的一部分, 你必须到 Redis 项目的 Github 页面 克隆一份 unstable 分值, 然后通过编译来获得 Sentinel 系统。

    Sentinel 程序可以在编译后的 src 文档中发现, 它是一个命名为 redis-sentinel 的程序。

    对于 redis-server 程序, 你可以用以下命令来启动一个运行在 Sentinel 模式下的 Redis 服务器:

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

    启动Sentinel必须制定配置文件,Sentinel会使用配置文件保存Sentinel的状态,在重启时,根据上次保存的配置信息完成状态还原。

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

    3. redis的Sentinel的配置

    Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。

    完整的配置文件可以查看github上的示例配置文件

    3.1 monitor 监控

    image-20200724151840718

    完整文件

    配置指示Sentinel去监视一个名为mymaster的redis-master,这个master的IP是127.0.0.1,端口是6379。将这个master判断为失效至少需要2个Sentinel同意(只要同意的Sentinel的数量达不到指定个数,自动故障迁移就不会执行)。

    不过要注意, 无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数Sentinel(过半原则)的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置纪元(configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。

    换句话说, 在只有少数Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。

    3.2 下线等待时间

    image-20200724153300029

    完整文件

    配置指示Sentinel认为mymaster下线需要当mymaster在30000毫秒内没有回复,此时Sentinel才能认为mymaster下线了。

    如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。

    不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。

    将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。

    3.3 自动故障迁移超时时间

    image-20200724154235421

    完整文件

    当Sentinel决定开始执行自动故障转移开始计时,如果在指定的时间内还未完成故障转移,那么认为自动故障迁移超时。

    如果自动故障迁移超时,那么Sentinel会重新选择迁移的目标slave,然后重新进行迁移。重新进行迁移,时间会重新开始计算。

    3.4 master同步数据的slave数量

    image-20200724161233509

    完整文件

    指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

    因为我们的master进行了转移,所以全部的slave需要从master复制数据。在复制时,因为需要载入新的RDB文件,会造成一定程度的卡顿。

    简单来说,这个数值就是配置了,在故障转移之后,有多少个slave处于临时不可用状态。

    如果数值配置的越大,不可用的slave就越多,可靠性就越差。

    你可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。

    一般来说,配置好一个Sentinel,需要这4个配置就足够了。

    3.5 示例

    这是组织结构图

    image-20200724171540176

    首先我们在docker环境下创建多个redis实例(主从redis)

    image-20200724164923199

    然后我们拷贝github上的sentinel.conf文件

    image-20200724173139156

    进行配置

    image-20200724173324425

    image-20200724180509736

    image-20200724180434886

    image-20200724180401873

    其他参数都使用默认值。

    启动sentinel

    docker run -v /redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf --name=sentinel_1_A redis redis-server /usr/local/etc/redis/sentinel.conf --sentinel

    image-20200724180559322

    没有写权限

    image-20200724180622256

    因为Sentinel需要将状态保存到sentinel.conf中,所以,每一个sentinel都应该配置独立的conf文件

    image-20200724180735139

    给与权限

    image-20200724180754536

    重试,记得修改配置文件

    image-20200724180903598

    看到这里表示我们的配置文件现在OK了,可以使用后台方式启动了

    docker run -d -p 26379:26379 -v /redis/sentinel_1_A.conf:/usr/local/etc/redis/sentinel.conf --name=sentinel_1_A redis redis-server /usr/local/etc/redis/sentinel.conf --sentinel
    docker run -d -p 26380:26379 -v /redis/sentinel_1_B.conf:/usr/local/etc/redis/sentinel.conf --name=sentinel_1_B redis redis-server /usr/local/etc/redis/sentinel.conf --sentinel
    docker run -d -p 26381:26379 -v /redis/sentinel_2.conf:/usr/local/etc/redis/sentinel.conf --name=sentinel_2 redis redis-server /usr/local/etc/redis/sentinel.conf --sentinel
    

    image-20200724181222815

    接下来配置主从复制

    slave_2_A

    image-20200724181641837

    slave_2_B

    image-20200724181744926

    slave_1_A

    image-20200724181957276

    slave_1_B

    image-20200724182053942

    接下来我们连接sentinel_1_A,查看其监视的master

    image-20200724182249284

    sentinel_1_B也是一样的

    image-20200724183004990

    sentinel_2也可以访问

    image-20200724183036125

    4. 主观下线和客观下线

    在redis的Sentinel中,下线有两个概念:

    • 主观下线(Subjectively Down,简称SDOWN)指的是单个Sentinel对redis做出的下线判断。
    • 客观下线(Objectively Down,简称ODOWN)指的是多个Sentinel实例在对同一个redis做出SDOWN的判断,并且通过SENTINEL is-master-down-by-addr命令询问其他的Sentinel是否判断指定的master是否下线,最终认为下线。

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

    服务器对 PING 命令的有效回复可以是以下三种回复的其中一种:

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

    如果服务器返回除以上三种回复之外的其他回复, 又或者在指定时间内没有回复 PING 命令, 那么 Sentinel 认为服务器返回的回复无效(non-valid)。

    注意, 一个服务器必须在 master-down-after-milliseconds 毫秒内, 一直返回无效回复才会被 Sentinel 标记为主观下线。

    举个例子, 如果 master-down-after-milliseconds 选项的值为 30000 毫秒(30 秒), 那么只要服务器能在每 29 秒之内返回至少一次有效回复, 这个服务器就仍然会被认为是处于正常状态的。

    客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。

    只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。

    5. 流言协议

    如果 Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了足够数量的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线。 如果之后其他 Sentinel 不再报告主服务器已下线, 那么客观下线状态就会被移除。

    6. Sentinel的定期操作

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

    7. 自动发现Sentinel和slave

    一个 Sentinel 可以与其他多个 Sentinel 进行连接, 各个 Sentinel 之间可以互相检查对方的可用性, 并进行信息交换。

    你无须为运行的每个 Sentinel 分别设置其他 Sentinel 的地址, 因为 Sentinel 可以通过发布与订阅功能来自动发现正在监视相同主服务器的其他 Sentinel , 这一功能是通过向频道 sentinel:hello 发送信息来实现的。

    与此类似, 你也不必手动列出主服务器属下的所有从服务器, 因为 Sentinel 可以通过询问主服务器来获得所有从服务器的信息。

    • 每个 Sentinel 会以每两秒一次的频率, 通过发布与订阅功能, 向被它监视的所有主服务器和从服务器的 sentinel:hello 频道发送一条信息, 信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)。
    • 每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 sentinel:hello 频道, 查找之前未出现过的 sentinel (looking for unknown sentinels)。 当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中, 这个列表保存了 Sentinel 已知的, 监视同一个主服务器的所有其他 Sentinel 。
    • Sentinel 发送的信息中还包括完整的主服务器当前配置(configuration)。 如果一个 Sentinel 包含的主服务器配置比另一个 Sentinel 发送的配置要旧, 那么这个 Sentinel 会立即升级到新配置上。
    • 在将一个新 Sentinel 添加到监视主服务器的列表上面之前, Sentinel 会先检查列表中是否已经包含了和要添加的 Sentinel 拥有相同运行 ID 或者相同地址(包括 IP 地址和端口号)的 Sentinel , 如果是的话, Sentinel 会先移除列表中已有的那些拥有相同运行 ID 或者相同地址的 Sentinel , 然后再添加新 Sentinel 。

    8. Sentinel的API

    在默认情况下, Sentinel 使用 TCP 端口 26379 (普通 Redis 服务器使用的是 6379 )。

    Sentinel 接受 Redis 协议格式的命令请求, 所以你可以使用 redis-cli 或者任何其他 Redis 客户端来与 Sentinel 进行通讯。

    有两种方式可以和 Sentinel 进行通讯:

    • 第一种方法是通过直接发送命令来查询被监视 Redis 服务器的当前状态, 以及 Sentinel 所知道的关于其他 Sentinel 的信息, 诸如此类。
    • 另一种方法是使用发布与订阅功能, 通过接收 Sentinel 发送的通知: 当执行故障转移操作, 或者某个被监视的服务器被判断为主观下线或者客观下线时, Sentinel 就会发送相应的信息。

    9. Sentinel的命令

    以下列出的是 Sentinel 接受的命令:

    • PING :返回 PONG 。

    • SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。

      image-20200724183133789

    • SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。

      image-20200724183450109

    • SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个命令返回新的主服务器的 IP 地址和端口号。

      image-20200724183120404

    • SENTINEL reset : 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。

    • SENTINEL failover : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移 (不过发起故障转移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新)。

    10. 发布/订阅

    客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。

    一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

    通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。

    以下列出的是客户端可以通过订阅来获得的频道和信息的格式: 第一个英文单词是频道/事件的名字, 其余的是数据的格式。

    注意, 当格式中包含 instance details 字样时, 表示频道所返回的信息中包含了以下用于识别目标实例的内容:

    <instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>
    

    @ 字符之后的内容用于指定主服务器, 这些内容是可选的, 它们仅在 @ 字符之前的内容指定的实例不是主服务器时使用。

    • +reset-master :主服务器已被重置。
    • +slave :一个新的从服务器已经被 Sentinel 识别并关联。
    • +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
    • +failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
    • +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 SLAVEOF 命令,为实例设置新的主服务器。
    • +slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
    • +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
    • -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
    • +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
    • +sdown :给定的实例现在处于主观下线状态。
    • -sdown :给定的实例已经不再处于主观下线状态。
    • +odown :给定的实例现在处于客观下线状态。
    • -odown :给定的实例已经不再处于客观下线状态。
    • +new-epoch :当前的纪元(epoch)已经被更新。
    • +try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
    • +elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
    • +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
    • no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
    • selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
    • failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
    • failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
    • failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
    • +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
    • +tilt :进入 tilt 模式。
    • -tilt :退出 tilt 模式。

    image-20200724183709883

    我们手动关闭master_1

    image-20200724183749495

    image-20200724183809425

    等待一小会:

    image-20200724183835216

    image-20200724184409449

    开始故障转移

    image-20200724184546384

    因为是docker,一直没有转移成功,不知道为什么,我重新启动容器

    image-20200724185247951

    会发现,确实已经发生了转移

    image-20200724185325697

    6379端口现在是slave,而6380现在是master

    接着我们继续使用原来master_1的信息链接

    image-20200724185436338

    依然可用,但是,无法写入了,因为6379已经成为只读的slave了

    image-20200724185523765

    11. 故障转移

    一次故障转移操作由以下步骤组成:

    • 发现主服务器已经进入客观下线状态。
    • 对我们的当前版本进行自增(详情请参考 Raft leader election ), 并尝试在这个版本中当选。
    • 如果当选失败, 那么在设定的故障迁移超时时间的两倍之后, 重新尝试当选。 如果当选成功, 那么执行以下步骤。
    • 选出一个从服务器,并将它升级为主服务器。
    • 向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
    • 通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel , 其他 Sentinel 对它们自己的配置进行更新。
    • 向已下线主服务器的从服务器发送 SLAVEOF 命令, 让它们去复制新的主服务器。
    • 当所有从服务器都已经开始复制新的主服务器时, 领头 Sentinel 终止这次故障迁移操作。

    每当一个 Redis 实例被重新配置(reconfigured) —— 无论是被设置成主服务器、从服务器、又或者被设置成其他主服务器的从服务器 —— Sentinel 都会向被重新配置的实例发送一个 CONFIG REWRITE 命令, 从而确保这些配置会持久化在硬盘里。

    Sentinel 使用以下规则来选择新的主服务器:

    • 在失效主服务器属下的从服务器当中, 那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰。
    • 在失效主服务器属下的从服务器当中, 那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰。
    • 在经历了以上两轮淘汰之后剩下来的从服务器中, 我们选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器; 如果复制偏移量不可用, 或者从服务器的复制偏移量相同, 那么带有最小运行 ID 的那个从服务器成为新的主服务器。

    12. 一致性特质

    Sentinel 自动故障迁移使用 Raft 算法来选举领头(leader) Sentinel , 从而确保在一个给定的版本(epoch)里, 只有一个领头产生。

    这表示在同一个版本中, 不会有两个 Sentinel 同时被选中为领头, 并且各个 Sentinel 在同一个版本中只会对一个领头进行投票。

    更高的配置版本总是优于较低的版本, 因此每个 Sentinel 都会主动使用更新的版本来代替自己的配置。

    简单来说, 我们可以将 Sentinel 配置看作是一个带有版本号的状态。 一个状态会以最后写入者胜出(last-write-wins)的方式(也即是,最新的配置总是胜出)传播至所有其他 Sentinel 。

    举个例子, 当出现网络分割(network partitions)时, 一个 Sentinel 可能会包含了较旧的配置, 而当这个 Sentinel 接到其他 Sentinel 发来的版本更新的配置时, Sentinel 就会对自己的配置进行更新。

    如果要在网络分割出现的情况下仍然保持一致性, 那么应该使用 min-slaves-to-write 选项, 让主服务器在连接的从实例少于给定数量时停止执行写操作, 与此同时, 应该在每个运行 Redis 主服务器或从服务器的机器上运行 Redis Sentinel 进程。

    13. Sentinel 状态的持久化

    Sentinel 的状态会被持久化在 Sentinel 配置文件里面。

    每当 Sentinel 接收到一个新的配置, 或者当领头 Sentinel 为主服务器创建一个新的配置时, 这个配置会与配置纪元一起被保存到磁盘里面。

    这意味着停止和重启 Sentinel 进程都是安全的。

    我们关闭sentinel_1_B,然后查看sentinel.conf文件

    image-20200724185833490

    image-20200724185849928

    14. 非故障迁移的情况下对实例进行重新配置

    即使没有自动故障迁移操作在进行, Sentinel 总会尝试将当前的配置设置到被监视的实例上面。 特别是:

    • 根据当前的配置, 如果一个从服务器被宣告为主服务器, 那么它会代替原有的主服务器, 成* 为新的主服务器, 并且成为原有主服务器的所有从服务器的复制对象。 那些连接了错误主服务器的从服务器会被重新配置, 使得这些从服务器会去复制正确的主服务器。

    不过, 在以上这些条件满足之后, Sentinel 在对实例进行重新配置之前仍然会等待一段足够长的时间, 确保可以接收到其他 Sentinel 发来的配置更新, 从而避免自身因为保存了过期的配置而对实例进行了不必要的重新配置。

    15. TILT 模式

    Redis Sentinel 严重依赖计算机的时间功能: 比如说, 为了判断一个实例是否可用, Sentinel 会记录这个实例最后一次相应 PING 命令的时间, 并将这个时间和当前时间进行对比, 从而知道这个实例有多长时间没有和 Sentinel 进行任何成功通讯。

    不过, 一旦计算机的时间功能出现故障, 或者计算机非常忙碌, 又或者进程因为某些原因而被阻塞时, Sentinel 可能也会跟着出现故障。

    TILT 模式是一种特殊的保护模式: 当 Sentinel 发现系统有些不对劲时, Sentinel 就会进入 TILT 模式。

    因为 Sentinel 的时间中断器默认每秒执行 10 次, 所以我们预期时间中断器的两次执行之间的间隔为 100 毫秒左右。 Sentinel 的做法是, 记录上一次时间中断器执行时的时间, 并将它和这一次时间中断器执行的时间进行对比:

    • 如果两次调用时间之间的差距为负值, 或者非常大(超过 2 秒钟), 那么 Sentinel 进入 TILT 模式。
    • 如果 Sentinel 已经进入 TILT 模式, 那么 Sentinel 延迟退出 TILT 模式的时间。

    当 Sentinel 进入 TILT 模式时, 它仍然会继续监视所有目标, 但是:

    • 它不再执行任何操作,比如故障转移。
    • 当有实例向这个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令时, Sentinel 返回负值: 因为这个 Sentinel 所进行的下线判断已经不再准确。

    如果 TILT 可以正常维持 30 秒钟, 那么 Sentinel 退出 TILT 模式。

    16. 处理 -BUSY 状态

    当 Lua 脚本的运行时间超过指定时限时, Redis 就会返回 -BUSY 错误。

    当出现这种情况时, Sentinel 在尝试执行故障转移操作之前, 会先向服务器发送一个 SCRIPT KILL 命令, 如果服务器正在执行的是一个只读脚本的话, 那么这个脚本就会被杀死, 服务器就会回到正常状态。

    展开全文
  • Redis的哨兵模式

    2021-01-12 20:07:04
    Redis的哨兵模式         单纯的主从复制,一主一从或一主多从,当主节点挂掉后,从节点无法晋升为主节点,而从节点又是只读的,导致redis无法使用,所以需要配置成哨兵...

    Redis的哨兵模式
            单纯的主从复制,一主一从或一主多从,当主节点挂掉后,从节点无法晋升为主节点,而从节点又是只读的,导致redis无法使用,所以需要配置成哨兵模式
            哨兵模式:其对应的配置文件为sentinel.conf,其中

     sentinel monitor mymaster 198.1.245.202 6381 quorum
    

    表示哨兵监控的主节点地址和端口号,mymaster为主节点名称,可起任意名称,quorum表示哨兵的投票数量,哨兵监控主节点信息,主节点又记录了从节点信息,从而达到哨兵监控整个主从节点。
    配置完哨兵后,先启动,看下启动日志,如下:
    在这里插入图片描述
    如上所述,哨兵达到了监控整个主从节点的效果
    按照一主两从一哨兵的模式,进行举例,看主节点宕机后,哨兵和从节点的变化,借此我们可以再熟悉下master_replid和master_replid2的变量意义
    master A,slave B,slave C
    1.当主节点A宕机后,从节点B切换为主节点后master_replid的变化
    在这里插入图片描述
    从节点B切换为主节点后,master_replid2保存了旧主节点A的复制ID,而master_replid则是自己新生成的复制ID
    2.
    在这里插入图片描述
    从节点C的master_replid2也保存了旧主节点A的复制ID,master_replid为新的主节点的复制ID

    在这里插入图片描述
    节点A启动后自动成为新主节点B的从节点,master_replid保存了新主节点的复制ID,master_replid2为空

    4.查看从节点C的日志变化,如下
    在这里插入图片描述
    从节点C与新的主节点B建立主从关系后,C带着旧主节点的复制ID请求部分复制,主节点B同意并完成了部分复制,说明从节点请求中的master_replid只要是当前主节点中master_replid和master_replid2的任意一个,就可以进行部分复制(当然之后还要判断复制偏移量)
    4.宕机的节点A重启后,日志变化如下:
    在这里插入图片描述

    节点A重启后,会自己生成一个复制ID,并带着它去请求主节点进行部分复制,因为新生成的复制ID不在主节点B的master_replid和master_replid2中,所以直接进行了全量复制,复制完成后,节点A保存了主节点B的master_replid,之后发生断线重连,就可以进行部分复制了(当然还需要判断复制偏移量的大小)

    那么哨兵是如何推选新的主节点的呢?
    先了解几个概念:
    1.哨兵和主节点之间有类似于心跳的机制,哨兵ping主节点,down-after-milliseconds时间后没有响应就认为宕机了
    2.sdown:主观宕机,哨兵自己觉得宕机了就是主观宕机
    3.odown:客观宕机,哨兵投票后决定宕机了是客观单机,一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为master sdown了,那么就认为是odown,注意:必须有quorum数量的哨兵投票后,哨兵才会选举新的主节点,否则不会,如下图
    在这里插入图片描述
    哨兵进行主从节点切换的条件:
    1.哨兵主观认为master sdown
    2.配置文件中已配置的quorum数量的哨兵认为master也sdown了,也就是odown
    以上两个条件满足才会开始选择新的主节点

    哨兵认为主节点odown,就开始从下属的从节点推选新的主节点,条件如下:
    1.按照slave优先级排序,redis.conf配置中有配置replica-priority,默认优先级是100,replica-priority的值越低,优先级越高
    在这里插入图片描述
    2.如果slave的replica-priority相同,那么看replica offset,哪个slave复制了较多的数据,offset值越大,优先级越高
    3.如果以上两个条件都相同,哨兵将会选择run id比较小的那个slave

    展开全文
  • Redis 的哨兵模式

    2020-03-04 15:43:06
    Sentinel(哨兵)是用于监控Redis集群中Master状态工具,是 Redis 高可用解决方案 哨兵可以监视一个或者多个redis master服务,以及这些master服务所有从服务; 当某个master服务宕机后,会把这个maste...

    引子

    Master挂了,如何保证可用性,实现继续读写

    什么是哨兵

    Sentinel(哨兵)是用于监控Redis集群中Master状态的工具,是 Redis 高可用解决方案
    哨兵可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;
    当某个master服务宕机后,会把这个master下的某个从服务升级为master来替代已宕机的master继续工作。

    示例图

    在这里插入图片描述

    配置哨兵监控master

    创建并且配置sentinel.conf:
    • 普通配置

    port 26379
    pidfile "/usr/local/redis/sentinel/redis-sentinel.pid"
    dir "/usr/local/redis/sentinel"
    daemonize yes
    protected-mode no
    logfile "/usr/local/redis/sentinel/redis-sentinel.log"
    

    • 核心配置

    # 配置哨兵
    sentinel monitor mymaster 127.0.0.1 6379 2
    # 密码
    sentinel auth-pass <master-name> <password>
    # master被sentinel认定为失效的间隔时间
    sentinel down-after-milliseconds mymaster 30000
    # 剩余的slaves重新和新的master做同步的并行个数
    sentinel parallel-syncs mymaster 1
    # 主备切换的超时时间,哨兵要去做故障转移,这个时候哨兵也是一个进程,如果他没有去执行,超过这个时间后,会由其他的哨兵来处理
    sentinel failover-timeout mymaster 180000
    

    启动哨兵 x 3(一主两从)

    redis-sentinel sentinel.conf
    

    测试

    1. master挂了,看slave是否成为master
    2. master恢复,观察slave状态

    结论

    master挂了以后,由于哨兵监控,剩余slave会进行选举,选举后其中一个成为master,当原来的master恢复后,他会成为slave。

    展开全文
  • 当主机出现了宕机时,需要人工手动去干预,把一台从服务器切换为主服务器,或者手动去重启主机,费时费力,而且还会导致该时间段内的服务不可用,这就要说说Redis的哨兵模式。哨兵自然就是站岗放哨,负责监控。Redis...

    53624ff0ca03b2da423bdfaf9eea468a.png
    微信公众号:51码农网
    网站:http://www.51manong.com51码农网,让程序员的坚持学习变得可能

    Redis哨兵(Sentinel)模式

    Redis的主从复制,当主机出现了宕机时,需要人工手动去干预,把一台从服务器切换为主服务器,或者手动去重启主机,费时费力,而且还会导致该时间段内的服务不可用,这就要说说Redis的哨兵模式。

    哨兵自然就是站岗放哨,负责监控。Redis的哨兵系统执行3个任务

    1.监控,Redis的哨兵会不断检查主服务器和从服务器的运行状况

    2.提醒,当哨兵检查到某个Redis服务器出现了问题,哨兵可以通过API向运维或者其他程序发送通知

    3.自动故障迁移(Automatic failover), 当一个主服务器不能正常工作时, 哨兵会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器

    哨兵模式的配置文件sentinel.conf

    运行一个 Sentinel 所需的最少配置如下所示:

    sentinel monitor mymaster 127.0.0.1 6379 1
    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 , 而将这个主服务器判断为失效至少需要 1 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。

    down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
    如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。

    不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。

    parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长

    哨兵模式演示

    1.将Redis源码下的sentinel文件复制到Redis的安装目录

    [erayt@ERAYT-01 redis-3.0.0]$ cp sentinel.conf /usr/local/redis/bin/
    

    顺便说一下,Redis Sentinel 兼容 Redis 2.4.16 或以上版本, 推荐使用 Redis 2.8.0 或以上的版本。2.配置sentinel

    sentinel monitor mymaster 127.0.0.1 6379 1
    

    3.启动哨兵

    [erayt@ERAYT-01 bin]$ ./redis-sentinel sentinel.conf
    

    查看窗口日志

    3146:X 20 Jul 05:41:40.158 # Sentinel runid is 2fd81c3ed629769930e5b4511470e95b0a429a4b
    3146:X 20 Jul 05:41:40.158 # +monitor master mymaster 127.0.0.1 6379 quorum 2
    3146:X 20 Jul 05:41:41.169 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
    3146:X 20 Jul 05:41:41.169 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
    

    4.关闭Redis的主节点6379

    [erayt@ERAYT-01 bin]$ ./redis-cli shutdown
    

    查看窗口日志

    3260:X 20 Jul 05:55:33.661 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
    3260:X 20 Jul 05:55:33.674 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
    3260:X 20 Jul 05:55:33.696 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
    3260:X 20 Jul 05:56:03.710 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
    

    6380这个节点应该成为了新的主服务器

    127.0.0.1:6380> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=127.0.0.1,port=6381,state=online,offset=570,lag=0
    master_repl_offset:570
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:569
    

    故障转移的步骤

    发现主服务器已经进入客观下线状态。
    对我们的当前纪元进行自增, 并尝试在这个纪元中当选。
    如果当选失败, 那么在设定的故障迁移超时时间的两倍之后, 重新尝试当选。

    如果当选成功, 那么执行以下步骤。
    1.选出一个从服务器,并将它升级为主服务器。
    2.向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
    3.通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel , 其他 Sentinel 对它们自己的配置进行更新。
    4.向已下线主服务器的从服务器发送 SLAVEOF host port 命令, 让它们去复制新的主服务器。
    5.当所有从服务器都已经开始复制新的主服务器时, 领头 Sentinel 终止这次故障迁移操作。

    微信公众号:51码农网

    2d467c30443c22dc02f3b25744e9021c.png
    展开全文
  • 当主机出现了宕机时,需要人工手动去干预,把一台从服务器切换为主服务器,或者手动去重启主机,费时费力,而且还会导致该时间段内的服务不可用,这就要说说Redis的哨兵模式。哨兵自然就是站岗放哨,负责监控。Redis...
  • 一、Redis哨兵模式Redis的哨兵模式(Sentienl)是为了解决复制中的问题:在“Redis复制”架构中,如果主节点出现了故障,那么, 就需要手动将一个从节点晋升变为主节点,这个过程需要人工干预,比较麻烦主节点的写...
  • Redis-Sentinel Redis的哨兵模式Redis Sentinel 模式简介Redis-Sentinel是官方推荐的高可用解决方案,当redis在做master-slave的高可用方案时,假如master宕机了,redis本身(以及其很多客户端)都没有实现自动进行...
  • Redis进阶:Redis的哨兵模式搭建 哨兵机制介绍 单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备份。 上一篇文章我们通过配置Redis...
  • Redis的哨兵模式和集群模式都是为了实现高可用。 哨兵模式解决了自动化的故障恢复,但无法进行写操作的负载均衡,存储能力受到单机的限制; 集群模式解决了写操作无法负载均衡和存储能力受到单机的限制,实现了...
  • Redis的哨兵模式 实例

    2019-01-10 00:01:26
    在最近的学习中,想着自己实战一下redis的哨兵模式。所以就有了下面的文章 1、在本机安装几个不同端口号的redis服务器 (我这里简单演示的话就只是复制了2个)   2、在安装目录下创建sentinel.conf文件(哨兵...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,833
精华内容 1,533
关键字:

redis的哨兵模式

redis 订阅