Redis(十八)——Sentinel 哨兵模式
文章目录
- 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、配置文件说明:
port:当前Sentinel服务运行的端口
dir: Sentinel服务运行时使用的临时文件夹
sentinel monitor master001 127.0.0.1 6379 2:Sentinel 去监视一个名为
mymaster
的主服务器, 这个主服务器的 IP 地址为127.0.0.1
, 端口号为6379
, 而将这个主服务器判断为失效至少需要2
个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。sentinel down-after-milliseconds master001 60000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起redis实例的自动故障迁移,只有在足够数量的Sentinel都将一个redis实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel parallel-syncs master001 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
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 哨兵模式相关推荐
- redis主从配置+sentinel哨兵模式
redis版本:redis-2.8.19.tar.gz 架构:2个节点 节点1: 10.10.10.10 节点2: 10.10.10.20 节点1部署redis实例,角色master,部署sentin ...
- Redis系列(七)--Sentinel哨兵模式
在上一篇文章了解了主从复制,主从复制本身的容错性很差,一旦master挂掉,只能进行手动故障转移,很难完美的解决这个问题 而本文讲解的sentinel可以解决这个问题 Redis sentinel示意 ...
- Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式
Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据 读写分离 存在的问题: 手动干预切主等操作 主节点的写能力受到单机限制 ...
- Redis进阶实践之十八 使用管道模式提高Redis查询的速度
Redis进阶实践之十八 使用管道模式提高Redis查询的速度 原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来 ...
- 为什么至少三个哨兵_入职第一周,组长让我把部门redis服务搞成哨兵模式...慌-龙跃十二...
少点代码,多点头发 本文已经被GitHub收录,欢迎大家踊跃star 和 issues. 入职第一周,我被坑了 最近刚入职新公司,本来想着这刚来新公司,一般都是熟悉熟悉公司同事,看看组内工程文档,找几 ...
- sentinel哨兵模式详细介绍
sentinel哨兵模式介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本 ...
- Redis集群之哨兵模式
本文来说下Redis集群之哨兵模式 文章目录 概述 哨兵模式 什么是哨兵 实现原理 哨兵选举过程 master选举过程 cluster集群模式 cluster集群模式是怎么存放数据的 键是如何和163 ...
- Redis(主从复制、哨兵模式、集群)概述及部署
Redis(主从复制.哨兵模式.集群)概述及部署 前言 一.主从复制 (1)主从复制原理 (2)主从复制作用 (3)主从复制流程 (4)搭建主从复制 ①修改master节点配置文件 ②修改Slave节 ...
- Redis高可用之哨兵模式
我们前面学习了Redis的主从模式,可以实现读写分离和数据备份,减轻Redis中master节点的压力.但是主从模式仅仅是减轻了master节点的读压力和做数据备份,一旦master节点挂了之后,我们 ...
最新文章
- Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)
- 小学生正确使用计算机,小学生做数学作业用计算器的做法正确吗?为什么?
- 【MAC】记mac中django-admin.py 调用失败的解决方案
- ML基石_11_HazardOfOverfitting
- HashMap的getOrDefault()方法
- python 在windows 中文显示
- win7网站服务器空间怎么清理,win7如何清理c盘空间_win7磁盘空间不足怎么清理
- 52 两个链表的第一个公共结点(时间空间效率的平衡)
- jQuery-input输入框下拉提示层
- (22)System Verilog按时间顺序的通知需求(事件驱动)
- Mosquitto源码学习
- 计算机u盘能直接拨出吗,电脑怎么直接拔出U盘而不丢失数据|电脑可以不用弹出设备直接拔出U盘吗...
- English--consonant_摩擦音_咬舌音
- PD源码阅读系列:PD节点启动
- 微信公众平台测试号推送思路
- vs2013+opencv3.4.3配置安装教程
- Java中的gvm_深入浅出GVM之GC
- 渗透测试常见漏洞描述及修复建议
- 爬虫之BeautifulSoup
- 教你如何快速突破TikTok限流--TK领航社tiktok苹果版安卓版下载教程