文章目录

  • Redis(十八)——Sentinel 哨兵模式
    • 1、哨兵模式概述
    • 2、搭建 Sentinel 集群
    • 3、sentinel 集群测试
    • 4、哨兵模式的所有配置详解

Redis(十八)——Sentinel 哨兵模式

1、哨兵模式概述

主从切换

当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel (哨兵)模式来解决这个问题。

哨兵模式概述

Sentinel 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

哨兵模式作用:

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

多哨兵模式

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover(故障转移)过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover(故障转移)操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。

2、搭建 Sentinel 集群

redis 集群搭建

在Redis(十七)——主从复制中,已经搭建好了一个"一主二从"的redis服务集群

主节点的配置信息:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=32942,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=32942,lag=1
master_replid:082b4fc582bc5ced7fde2b9566d13fbfe87ee8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32942
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:32942

两个从节点的配置信息:

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:32816
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:082b4fc582bc5ced7fde2b9566d13fbfe87ee8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32816
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:32816
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:32830
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:082b4fc582bc5ced7fde2b9566d13fbfe87ee8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32830
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:729
repl_backlog_histlen:32102

搭建 Sentinel 集群

1、创建sentinel.conf配置文件

port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

2、配置文件说明:

  1. port:当前Sentinel服务运行的端口

  2. dir: Sentinel服务运行时使用的临时文件夹

  3. sentinel monitor master001 127.0.0.1 6379 2:Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。

  4. sentinel down-after-milliseconds master001 60000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起redis实例的自动故障迁移,只有在足够数量的Sentinel都将一个redis实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行

  5. sentinel parallel-syncs master001 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

  6. sentinel failover-timeout master001 180000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败

3、需要三份 sentinel.conf 配置文件

分别为 sentinel26379.conf,sentinel36379.conf,sentinel46379.conf,配置文件中端口号分别为:26379、36379、46379

4、启动 sentinel 集群

端口号为 26379的 sentinel 服务启动成功:

Sentinel 可以通过发布与订阅功能来自动发现正在监视相同主服务器的其他 Sentinel

端口号为 36379的 sentinel 服务启动成功:

端口号为 46379的 sentinel 服务启动成功:

3、sentinel 集群测试

1、测试主节点宕机的情况

关闭主节点的redis服务:

127.0.0.1:6379> shutdown
not connected> exit

查看三个 sentinel 服务输出的日志信息:

再查看6381节点的配置信息:6381节点的角色为主节点

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=264493,lag=1
master_replid:b596a14ae6f36ff8cae2592f66c5a8fedf471817
master_replid2:082b4fc582bc5ced7fde2b9566d13fbfe87ee8e5
master_repl_offset:264759
second_repl_offset:202192
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:729
repl_backlog_histlen:264031

2、原主节点重新启动后的情况

原主节点重新启动后,sentinel 服务输出了下面这样一行日志信息:

23349:X 21 Aug 2021 21:50:29.596 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

意思为:6379 redis节点转换为了从节点,主节点为6381 redis节点

原主节点的配置信息:

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:311402
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b596a14ae6f36ff8cae2592f66c5a8fedf471817
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:311402
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:309105
repl_backlog_histlen:2298

验证:发现原主节点还在redis集群中,确实变为了新主节点的从节点,

4、哨兵模式的所有配置详解

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

Redis(十八)——Sentinel 哨兵模式相关推荐

  1. redis主从配置+sentinel哨兵模式

    redis版本:redis-2.8.19.tar.gz 架构:2个节点 节点1: 10.10.10.10 节点2: 10.10.10.20 节点1部署redis实例,角色master,部署sentin ...

  2. Redis系列(七)--Sentinel哨兵模式

    在上一篇文章了解了主从复制,主从复制本身的容错性很差,一旦master挂掉,只能进行手动故障转移,很难完美的解决这个问题 而本文讲解的sentinel可以解决这个问题 Redis sentinel示意 ...

  3. Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

    Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据 读写分离 存在的问题: 手动干预切主等操作 主节点的写能力受到单机限制 ...

  4. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    Redis进阶实践之十八 使用管道模式提高Redis查询的速度 原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来 ...

  5. 为什么至少三个哨兵_入职第一周,组长让我把部门redis服务搞成哨兵模式...慌-龙跃十二...

    少点代码,多点头发 本文已经被GitHub收录,欢迎大家踊跃star 和 issues. 入职第一周,我被坑了 最近刚入职新公司,本来想着这刚来新公司,一般都是熟悉熟悉公司同事,看看组内工程文档,找几 ...

  6. sentinel哨兵模式详细介绍

    sentinel哨兵模式介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本 ...

  7. Redis集群之哨兵模式

    本文来说下Redis集群之哨兵模式 文章目录 概述 哨兵模式 什么是哨兵 实现原理 哨兵选举过程 master选举过程 cluster集群模式 cluster集群模式是怎么存放数据的 键是如何和163 ...

  8. Redis(主从复制、哨兵模式、集群)概述及部署

    Redis(主从复制.哨兵模式.集群)概述及部署 前言 一.主从复制 (1)主从复制原理 (2)主从复制作用 (3)主从复制流程 (4)搭建主从复制 ①修改master节点配置文件 ②修改Slave节 ...

  9. Redis高可用之哨兵模式

    我们前面学习了Redis的主从模式,可以实现读写分离和数据备份,减轻Redis中master节点的压力.但是主从模式仅仅是减轻了master节点的读压力和做数据备份,一旦master节点挂了之后,我们 ...

最新文章

  1. Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)
  2. 小学生正确使用计算机,小学生做数学作业用计算器的做法正确吗?为什么?
  3. 【MAC】记mac中django-admin.py 调用失败的解决方案
  4. ML基石_11_HazardOfOverfitting
  5. HashMap的getOrDefault()方法
  6. python 在windows 中文显示
  7. win7网站服务器空间怎么清理,win7如何清理c盘空间_win7磁盘空间不足怎么清理
  8. 52 两个链表的第一个公共结点(时间空间效率的平衡)
  9. jQuery-input输入框下拉提示层
  10. (22)System Verilog按时间顺序的通知需求(事件驱动)
  11. Mosquitto源码学习
  12. 计算机u盘能直接拨出吗,电脑怎么直接拔出U盘而不丢失数据|电脑可以不用弹出设备直接拔出U盘吗...
  13. English--consonant_摩擦音_咬舌音
  14. PD源码阅读系列:PD节点启动
  15. 微信公众平台测试号推送思路
  16. vs2013+opencv3.4.3配置安装教程
  17. Java中的gvm_深入浅出GVM之GC
  18. 渗透测试常见漏洞描述及修复建议
  19. 爬虫之BeautifulSoup
  20. 教你如何快速突破TikTok限流--TK领航社tiktok苹果版安卓版下载教程

热门文章

  1. Unity开发4 资源、商店、地形的绘制
  2. 简约精致毕业答辩PPT模板
  3. oracle备份与恢复概述,Oracle 备份与恢复
  4. SAP BASIS 常见basis的事务码
  5. 男人你应该去尝试创业
  6. 腾讯:建造“通天塔”的“帝企鹅”
  7. CFileDialog 使用
  8. iOS 查看所有系统字体
  9. 【学习笔记】Tensorflow-ENet代码学习(二)
  10. Impala之02-原理、架构分析(1)