Redis-sentinel 哨兵(HA)
Sentinel 介绍
Redis-Sentinel 是 Redis 官方推荐的高可用性(HA)解决方案,当用 Redis 做 Master-slave 的高可用方案时,假如Master 宕机了,Redis 本身(包括它的很多客户端)都没有实现自动进行主备切换,而 Redis-sentinel 本身也是一个独立运行的进程,它能监控多个 Master-Slave 集群,发现 Master 宕机后能进行自动切换 。
必须在 Redis 主从已经做好的前提下,再做 Redis 哨兵(高可用)
Sentinel 主要功能(转载)
Sentinel 是一个监视器,它可以根据被监视实例的身份和状态来判断应该执行何种动作,
如下图 Server1 为主库,其他 Server 为从库,Sentinel 监控着每一个 Redis 实例:
在 Server1 掉线后:
升级 Server2 为新的主服务器:
当 Server1 故障恢复重新上线时,Sentinel 会将 Server1 重新配置为从库,指向新的主库 Server2 !
Sentinel 其他功能
提醒(Notification):
当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
自动故障迁移(Automatic failover):
当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器 。
Sentinel 工作流程
Sentinel 通过用户给定的配置文件来发现主服务器
Sentinel 会与被监视的主服务器创建两个网络连接:
命令连接用于向主服务器发送命令;
订阅连接用于订阅指定的频道,从而发现监视同一主服务器的其他 SentinelSentinel 通过向主服务器发送 INFO 命令来自动获得所有从服务器的地址
发现其他 Sentinel
Sentinel 会通过命令连接向被监视的主从服务器发送 "HELLO" 信息,该消息包含 Sentinel 的 IP、端口号、ID 等内容,以此来向其他 Sentinel 宣告自己的存在;与此同时 Sentinel 会通过订阅连接接收其他 Sentinel 的 "HELLO" 信息,以此来发现监视同一个主服务器的其他 Sentinel 。多个 Sentinel 之间只会互相创建命令连接,用于进行通信,因为已经有主从服务器作为发送和接收 "HELLO" 信息的中介,所以 Sentinel 之间不会创建订阅连接 。
检测实例的状态
Sentinel 使用 PING 命令来检测实例的状态:如果实例在指定的时间内没有返回回复,或者返回错误的回复,那么该实例会被 Sentinel 判断为下线 。
Redis 的 Sentinel 中关于下线(down)有两个不同的概念:
1)主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断;
2)客观下线(Objectively Down,简称 ODOWN)指的是多个Sentinel实例在对同一个服务器做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的服务器下线判断 。(一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器判断已下线 )
Sentinel 故障转移流程
一次故障转移操作由以下步骤组成:
1.发现主服务器已经进入客观下线状态。
2.基于 Raft leader election 协议,进行投票选举
3.如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。如果当选成功,那么执行以下步骤。
- 1)选出一个从服务器,并将它升级为主服务器。
- 2)向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
- 3)通过发布与订阅功能,将更新后的配置传播给所有其他Sentinel,其他Sentinel对它们自己的配置进行更新。
- 4)向已下线主服务器的从服务器发送SLAVEOF命令,让它们去复制新的主服务器。
- 5)当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。
Sentinel 选择主库的规则
- 在失效主服务器属下的从服务器当中,那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰;
- 在失效主服务器属下的从服务器当中,那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰;
- 在经历了以上两轮淘汰之后剩下来的从服务器中,我们选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器;如果复制偏移量不可用,或者从服务器的复制偏移量相同,那么带有最小运行 ID 的那个从服务器成为新的主服务器
Sentinel 实战
环境准备
角色 | 主机 | IP | 端口 |
---|---|---|---|
主库 | db01 | 172.16.1.51 | 6379 |
从库 | db02 | 172.16.1.52 | 6379 |
从库 | db03 | 172.16.1.53 | 6379 |
恢复主从状态
# 修复坏掉的主库
[root@db01 ~]# redis-server /service/redis/6379/redis.conf
[root@db01 ~]# redis-cli -h 172.16.1.51
172.16.1.51:6379> info replication
172.16.1.51:6379> SLAVEOF 172.16.1.52 6379
OK
172.16.1.51:6379> info replication
# 主库查看
172.16.1.52:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.53,port=6379,state=online,offset=4229,lag=1
slave1:ip=172.16.1.51,port=6379,state=online,offset=4229,lag=1
master_repl_offset:4229
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:4228
Sentinel 配置
如果 Redis 设置了密码,需要配置以下参数:
sentinel auth-pass <master-name> <password>
# 创建目录(随便创建)
[root@db01 ~]# mkdir /service/redis/26379
# 编辑 Sentinel 配置文件
[root@db01 ~]# vim /service/redis/26379/sentinel.conf
port 26379
daemonize yes
pidfile /service/redis/26379/sentinel.pid
logfile /service/redis/26379/sentinel.log
dir /service/redis/26379
bind 172.16.1.51 127.0.0.1
# 定义一个监控的主节点名(mymaster),IP + 端口,法定人数(1,即多个 Sentinel 投票选取从库变更为新主节点,超过 N 票,则选为主节点)
sentinel monitor mymaster 172.16.1.52 6379 1
# 检测主库心跳,用 PING 命令检测是否返回 PONG,如果超过 5s 没有回应,判定主库宕机
sentinel down-after-milliseconds mymaster 5000
# 执行故障转移的超时时间
sentinel failover-timeout mymaster 180000
# 执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
sentinel parallel-syncs mymaster 1
============= parallel-syncs
# 在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,
# 但是如果这个数字越大,就意味着在某一个时间点,越多的 Slave 因为 Replication 而不可用,可以通过将这个值设为 1 ,
# 来保证每次只有一个slave处于不能处理命令请求的状态 。
============================
启动 Sentinel
[root@db01 ~]# redis-sentinel /service/redis/26379/sentinel.conf
#启动之后配置文件会发生改变
[root@db01 ~]# vim /service/redis/26379/sentinel.conf
port 26379
daemonize yes
pidfile "/service/redis/26379/sentinel.pid"
logfile "/service/redis/26379/sentinel.log"
dir "/service/redis/26379"
bind 172.16.1.51 127.0.0.1
sentinel myid 7d430385a1269307819e5300ecf09dfbf92b46f5
sentinel monitor mymaster 172.16.1.52 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 172.16.1.51 6379
sentinel known-slave mymaster 172.16.1.53 6379
sentinel current-epoch 0
停止 Sentinel
[root@db01 ~]# redis-cli -p 26379 shutdown
测试 Sentinel
# 关闭主库的 redis
[root@db02 ~]# redis-cli shutdown
# 查看其它从库主从状态
172.16.1.51:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.1.53,port=6379,state=online,offset=586,lag=1
master_repl_offset:723
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:722
恢复故障节点
# 修复故障节点
[root@db02 ~]# redis-server /service/redis/6379/redis.conf
# 查看主库状态
172.16.1.51:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.53,port=6379,state=online,offset=5077,lag=1
slave1:ip=172.16.1.52,port=6379,state=online,offset=5077,lag=1
master_repl_offset:5077
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5076
Sentinel 管理命令(不常用)
# 连接 Sentinel 管理端口
[root@db01 ~]# redis-cli -p 26379
# 检测状态,返回 PONG
127.0.0.1:26379> ping
PONG
# 列出所有被监视的主服务器
127.0.0.1:26380> SENTINEL masters
# 列出所有被监视的从服务器
127.0.0.1:26380> SENTINEL slaves mymaster
# 返回给定名字的主服务器的IP地址和端口号
127.0.0.1:26380> SENTINEL get-master-addr-by-name mymaster
1) "172.16.1.51"
2) "6379
# 重置所有名字和给定模式
127.0.0.1:26380> SENTINEL reset mymaster
# 当主服务器失效时,在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移
127.0.0.1:26380> SENTINEL failover mymaster
设置权重,指定升级为主库的优先级
# 查看 db02 的权重
172.16.1.52:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
# 修改 db02 的权重值为 0
172.16.1.52:6379> CONFIG set slave-priority 0
OK
172.16.1.52:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "0"
# 权重值越低越不会优先切换为主库
# 强制开始一次自动故障迁移
127.0.0.1:26380> SENTINEL failover mymaster
# 再次查看,主库为 db03
172.16.1.53:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.52,port=6379,state=online,offset=71377,lag=0
slave1:ip=172.16.1.51,port=6379,state=online,offset=71377,lag=0
master_repl_offset:71514
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:70496
repl_backlog_histlen:1019
Redis-sentinel 哨兵(HA)的更多相关文章
- Redis Sentinel哨兵配置
概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...
- Redis的主从复制与Redis Sentinel哨兵机制
1 Redis的主从复制 1.1 什么是主从复制 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损 ...
- Redis sentinel 哨兵模式集群方案配置
第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2) ...
- Redis sentinel 哨兵模式
一.sentinel介绍 Sentinel作用: 1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Maste ...
- Redis:Sentinel哨兵
简介 Sentinel的作用就是主从切换:Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,R ...
- Redis Sentinel哨兵集群
Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...
- 【Redis】Redis Sentinel 哨兵模式搭建
Redis Sentinel介绍 Redis Sentinel是Redis的官方高可用性解决方案 Redis Sentinel为Redis提供高可用性.实际上,这意味着使用Sentinel可以创建一个 ...
- Redis 5 配置 Redis sentinel(哨兵模式)
先了解一下哨兵都 做了什么工作:Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: * 监控(Monitoring): Sentin ...
- Redis Sentinel(哨兵核心机制) 初步深入
##### 1.Redis 的 Sentinel 系统用于管理多个 Redis 服务 该系统执行以下三个任务: 1.监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务 ...
- redis sentinel哨兵模式集群搭建教程
1.环境说明 我们将使用192.168.220.128.192.168.220.129两台机器搭建sentinel交叉主从为例 当前我们已在192.168.220.128上按redis安装教程安装了r ...
随机推荐
- SDUST数据结构 - chap5 数组与广义表
选择题:
- SSRF - Pikachu
概述: SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制 导致 ...
- JCO RFC destination
一:登陆PI的GUI,进入事物SM59,创建T类型RFC destinations如下: AI_RUNTIME_JCOSERVER :used for the mapping runtime, va ...
- apijson简单使用
apijson简单使用 介绍 APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库.为简单的增删改查.复杂的查询.简单的事务操作 提供了完全自动化的 ...
- DockerFile关键字相关作用以及解释
Dockerfile 关键字 作用 备注 FROM 指定父镜像 指定dockerfile基于那个image构建 MAINTAINER 作者信息 用来标明这个dockerfile谁写的 LABEL 标签 ...
- vue首次加载白屏过渡动画(vue优化)
过渡动画需要在index.html文件里面添加 1.css,在public.index.css创建index.css html, body, #app { height: 100%; margin: ...
- centos7防火墙firewalld拒绝某ip或者某ip段访问服务器任何服务
安装firewall后(LINUX7系统一般情况下默认已安装),防火墙默认配置是只打开SSH端口的,也就是22端口,如果SSH的端口已更改成别的端口了,请切记一定在启动firewall前先修改对应服务 ...
- 编译Nacos,解决No Server available 以及 failed to req API__nacos_v1_ns_instance after all servers
问题描述:如图,显示没有服务可用 仔细看控制台,看到上面Error部分,相关参数没有读取到配置信息,那么配置信息这块似乎是有问题,赶紧看看IDE对配置信息的扫描情况: 可以看到有信息了,但是报错:No ...
- PHPday01
1:概念 1.1.1 静态网站和动态网站 静态网站:不支持数据交互的网站,(html,htm) 动态网站:支持数据交互的网站 实现动态网站的技术: 实现技术 网站后缀 ASP技术 .asp PHP . ...
- namedtuple
Python的namedtuple使用详解_kongxx的专栏-CSDN博客_namedtuple https://blog.csdn.net/kongxx/article/details/51553 ...