参考源

https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0

版本

本文章基于 Redis 6.2.6


概述

主从切换技术的操作是:当主机宕机后,需要手动把一台从机切换为主机。

这就需要人工干预,费事费力,还会造成一段时间内服务不可用。

这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式

Redis 从 2.8 开始正式提供了 Sentinel(哨兵) 架构来解决这个问题。

它是“谋朝篡位”的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从机转换为主机。

哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,它会独立运行。

其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。

这里的哨兵有两个作用:

  • 通过发送命令,让 Redis 服务器返回监控其运行状态,包括主机和从机。

  • 当哨兵监测到 master 宕机,会自动将 slave 切换成 master,然后通过发布订阅模式通知其他的从机,修改配置文件,让它们切换主机。

然而一个哨兵进程对 Redis 服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。

各个哨兵之间还会进行监控,这样就形成了多哨兵模式

假设主机宕机,哨兵 1 先检测到这个结果,系统并不会马上进行 failover(故障转移) 过程,仅仅是哨兵 1 主观的认为主机不可用,这个现象称为主观下线

当后面的哨兵也检测到主机不可用,并且数量达到一定值时,哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行 failover 操作。

切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从机实现切换主机,这个过程称为客观下线

使用

配置

受限于内存大小,这里只演示一个哨兵进程监测一个主机的情况。

在 redis 目录下新建 myconfig 目录,并创建文件 sentinel.conf

文件名必须为 sentinel.conf

  1. [root@sail redis]# mkdir myconfig
  2. [root@sail redis]# cd myconfig/
  3. [root@sail myconfig]# vim sentinel.conf

编写配置

  1. sentinel monitor myredis 127.0.0.1 6379 1

末尾的 1 代表选票达到多少时选举成功。

启动

redis-sentinel myconfig/sentinel.conf

  1. [root@sail redis]# redis-sentinel myconfig/sentinel.conf
  2. 16728:X 08 Jun 2022 22:23:38.464 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  3. 16728:X 08 Jun 2022 22:23:38.464 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=16728, just started
  4. 16728:X 08 Jun 2022 22:23:38.464 # Configuration loaded
  5. 16728:X 08 Jun 2022 22:23:38.465 * monotonic clock: POSIX clock_gettime
  6. _._
  7. _.-``__ ''-._
  8. _.-`` `. `_. ''-._ Redis 6.2.6 (00000000/0) 64 bit
  9. .-`` .-```. ```\/ _.,_ ''-._
  10. ( ' , .-` | `, ) Running in sentinel mode
  11. |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
  12. | `-._ `._ / _.-' | PID: 16728
  13. `-._ `-._ `-./ _.-' _.-'
  14. |`-._`-._ `-.__.-' _.-'_.-'|
  15. | `-._`-._ _.-'_.-' | https://redis.io
  16. `-._ `-._`-.__.-'_.-' _.-'
  17. |`-._`-._ `-.__.-' _.-'_.-'|
  18. | `-._`-._ _.-'_.-' |
  19. `-._ `-._`-.__.-'_.-' _.-'
  20. `-._ `-.__.-' _.-'
  21. `-._ _.-'
  22. `-.__.-'
  23. 16728:X 08 Jun 2022 22:23:38.466 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  24. 16728:X 08 Jun 2022 22:23:38.469 # Sentinel ID is a7ebdd5f7260485b8f6108169d96910b747e3c8f
  25. 16728:X 08 Jun 2022 22:23:38.469 # +monitor master myredis 127.0.0.1 6379 quorum 1
  26. 16728:X 08 Jun 2022 22:23:38.469 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379

主机断开

主机断开后,哨兵进程会监测到,然后发起选举,调用选举算法,最后选举 6380 为新的主机,6381 也认定其为主机。

主机恢复

之前断开的主机恢复后,哨兵进程也会检测到,但此时并不会将其再设为主机,而是设为新的主机的从机。

优缺点

优点

哨兵集群模式是基于主从模式的,所有主从的优点,哨兵模式同样具有。

主从可以切换,故障可以转移,系统可用性更好。

哨兵模式是主从模式的升级,系统更健壮,可用性更高。

缺点

Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

实现哨兵模式的配置也不简单,甚至可以说有些繁琐。

完整配置

前面自定义的 sentinel.conf 只配置了一项,再来看下完整的配置内容:

  1. # 哨兵 sentinel 实例运行的端口 默认 26379
  2. port 26379
  3. # 哨兵 sentinel 的工作目录
  4. dir /tmp
  5. # 哨兵 sentinel 监控的 redis 主节点的 ip port
  6. # master-name 可以自己命名的主节点名字:只能由字母 A-z、数字 0-9、".-_"这三个字符组成。
  7. # quorum 配置多少个 sentinel 哨兵统一认为 master 主节点失联那么这时客观上认为主节点失联了
  8. # sentinel monitor <master-name> <ip> <redis-port> <quorum>
  9. sentinel monitor mymaster 127.0.0.1 6379 2
  10. # 当在 Redis 实例中开启了 requirepass foobared 授权密码 这样所有连接 Redis 实例的客户端都要提供密码
  11. # 设置哨兵 sentinel 连接主从的密码,注意必须为主从设置一样的验证密码
  12. # sentinel auth-pass <master-name> <password>
  13. sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
  14. # 指定多少毫秒之后,主节点没有应答哨兵 sentinel,此时,哨兵主观上认为主节点下线,默认 30 秒
  15. # sentinel down-after-milliseconds <master-name> <milliseconds>
  16. sentinel down-after-milliseconds mymaster 30000
  17. # 这个配置项指定了在发生 failover 主备切换时最多可以有多少个 slave 同时对新的 master 进行同步
  18. # 这个数字越小,完成 failover 所需的时间就越长
  19. # 但是如果这个数字越大,就意味着越多的 slave 因为 replication 而不可用
  20. # 可以通过将这个值设为 1 来保证每次只有一个 slave 处于不能处理命令请求的状态
  21. # sentinel parallel-syncs <master-name> <numslaves>
  22. sentinel parallel-syncs mymaster 1
  23. # 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
  24. # 1. 同一个 sentinel 对同一个 master 两次 failover 之间的间隔时间
  25. # 2. 当一个 slave 从一个错误的 master 那里同步数据开始计算时间。直到 slave 被纠正为向正确的 master 那里同步数据时。
  26. # 3. 当想要取消一个正在进行的 failover 所需要的时间。
  27. # 4. 当进行 failover 时,配置所有 slaves 指向新的 master 所需的最大时间。
  28. # 不过,即使过了这个超时,slaves 依然会被正确配置为指向 master,但是就不按 parallel-syncs 所配置的规则来了
  29. # 默认三分钟
  30. # sentinel failover-timeout <master-name> <milliseconds>
  31. sentinel failover-timeout mymaster 180000
  32. # SCRIPTS EXECUTION
  33. # 配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
  34. # 对于脚本的运行结果有以下规则:
  35. # 若脚本执行后返回 1,那么该脚本稍后将会被再次执行,重复次数目前默认为 10
  36. # 若脚本执行后返回 2,或者比 2 更高的一个返回值,脚本将不会重复执行。
  37. # 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为 1 时的行为相同。
  38. # 一个脚本的最大执行时间为 60s,如果超过这个时间,脚本将会被一个 SIGKILL 信号终止,之后重新执行。
  39. # 通知型脚本:当 sentinel 有任何警告级别的事件发生时(比如说 redis 实例的主观失效和客观失效等),将会去调用这个脚本
  40. # 这时这个脚本应该通过邮件,SMS 等方式去通知系统管理员关于系统不正常运行的信息。
  41. # 调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。
  42. # 如果 sentinel.conf 配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则 sentinel 无法正常启动成功。
  43. # 通知脚本
  44. # sentinel notification-script <master-name> <script-path>
  45. sentinel notification-script mymaster /var/redis/notify.sh
  46. # 客户端重新配置主节点参数脚本
  47. # 当一个 master 由于 failover 而发生改变时,这个脚本将会被调用,通知相关的客户端关于 master 地址已经发生改变的信息。
  48. # 以下参数将会在调用脚本时传给脚本:
  49. # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
  50. # 目前 <state> 总是 “failover”,<role> 是 “leader” 或者 “observer” 中的一个。
  51. # 参数 from-ip,from-port,to-ip,to-port是用来和旧的 master 和新的 master (即旧的 slave)通信的
  52. # 这个脚本应该是通用的,能被多次调用,不是针对性的。
  53. # sentinel client-reconfig-script <master-name> <script-path>
  54. sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

Redis 16 哨兵模式的更多相关文章

  1. redis主从+哨兵模式(借鉴)

    三台机器分布 192.168.189.129  //  master的角色 192.168.189.130  //  slave1的角色 192.168.189.131  //  salve2的角色 ...

  2. Redis-Sentinel Redis的哨兵模式

    Redis-Sentinel Redis的哨兵模式Redis Sentinel 模式简介Redis-Sentinel是官方推荐的高可用解决方案,当redis在做master-slave的高可用方案时, ...

  3. redis的哨兵模式

    我是在一台服务器上安装了三个redis  一主两从 想安装gcc gcc-c++ make tcl  lrzsz yum -y install gcc gcc-c++ make tcl  lrzsz ...

  4. redis主从+redis的哨兵模式

    三台机器分布 192.168.189.129  //  master的角色 192.168.189.130  //  slave1的角色 192.168.189.131  //  salve2的角色 ...

  5. Redis进阶:Redis的哨兵模式搭建

    Redis进阶:Redis的哨兵模式搭建 哨兵机制介绍 单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备 ...

  6. Redis搭建哨兵模式

    一 安装Redis 1. 从https://redis.io/download redis官网下载二进制包安装 例如:wget http://download.redis.io/releases/re ...

  7. Redis 5 配置 Redis sentinel(哨兵模式)

    先了解一下哨兵都 做了什么工作:Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: * 监控(Monitoring): Sentin ...

  8. Redis sentinel 哨兵模式集群方案配置

    第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2) ...

  9. Redis sentinel 哨兵模式

    一.sentinel介绍 Sentinel作用: 1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Maste ...

随机推荐

  1. 使用docker创建和运行跨平台的容器化的mssql数据库

    我们一般启用sql server数据库要么选择安装SQL Server实例和管理工具(SSMS),要么用vs自带的数据库.如今net跨平台成为趋势,今天给大家介绍另一种我最近在玩的方式,即使用dock ...

  2. mac安装java环境

    1.java安装包获取: 链接:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2.验证安装是否成 ...

  3. Pycharm连接远程服务器并保持文件夹同步

    pycharm版本2021 服务器版本 Ubuntu 18 1.连接远程服务器 xxx这部省略了,因为之前就已经连接上了hh,后面用到再补充. 2.保持文件夹同步 1.首先在本地(windows环境创 ...

  4. Aged-cat 的 WebServer 配置详细流程

    前言 最近看到一个不错的webserver项目,但是配置过程给的不详细,这里给出详细配置过程 项目地址:https://github.com/Aged-cat/WebServer (感谢老猫大神的项目 ...

  5. 工具分享:清理 Markdown 中没有引用的图片

    前言: 之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯.但是一是由于 notion 的服务器在国外,有时候很不稳定:二是由于 notion 的分享很不方便,把笔记分享给别人点开链接之 ...

  6. 抽象类与接口——JavaSE基础

    抽象类与接口 抽象类 抽象类既包含规范又包含具体实现 抽象类可以包含实现的方法 和 未实现的用abstract修饰的抽象方法 抽象类不可以有实例化(不能使用new实例化),只能通过子类继承,然后对子类 ...

  7. 10分钟快速部署camunda BPM开源版

    安装部署Camunda BPM有多种方式,基于Camunda独立web应用程序安装部署是最简单的一种方式,您只需要有tomcat即可. 本文档将指导您安装和配置Camunda独立web应用程序,快速体 ...

  8. 从零开始学Java——个人笔记(持续更新中)

    从零开始学Java 学习流程 第一阶段:建立编程思想 Java概述 变量 运算符 控制结构 数组.排序和查找 面向对象编程(基础) 面向对象编程(中级) 项目&学习以致用 编程之乐 第二阶段: ...

  9. C++对象间通信组件,让C++对象“无障碍交流”

    介绍 这是很久之前的一个项目了,最近刚好有些时间,就来总结一下吧! 推荐初步熟悉项目后阅读本文: https://gitee.com/smalldyy/easy-msg-cpp 从何而来 这要从我从事 ...

  10. crane:字典项与关联数据处理的新思路

    前言 在我们日常开发中,经常会遇到一些烦人的数据关联和转换问题,比如典型的: 对象属性中个有字典 id,需要获取对应字典值并填充到对象中: 对象属性中有个外键,需要关联查询对应的数据库表实体,并获取其 ...