Redis 高可用之 Sentinel

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis 高可用之 Sentinel

Sentinel 结构


640.png


在 redis3.0 以前的版本要实现集群一般是借助哨兵 sentinel 工具来监控 master 节点的状态,如果 master 节点异常,则会做主从切换,将某一台 slave 作为 master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。


Sentinel 初始化


Sentinel(哨兵)是 Redis 高可用(high availability) 解决方案,由一个或者多个 Sentinel 实例(instance)组成的 Sentinel 系统(system)可以监视一个或者多个 Redis 主服务器和其跟随的从服务器,并且在被监视的主服务进入下线状态时,自动进行将当前主服务器的从服务器其中一个升级为主服务器,然后将下线的主服务器设置为新主服务器的从节点。


Sentinel 本身我们可以理解为一个特殊的 Redis 服务器, 它也可以通过 redis-server xxx.conf --sentinel启动。


下面是我们实验环境的一个 Sentinel 服务器和 Redis 服务器列表(由于实验都在本机进行,我们采用端口的方式来区分多个服务),服务和端口大致如下:


IP 端口 集群
127.0.0.1 6379 Master
127.0.0.1 6380 Slave
127.0.0.1 6381 Slave
127.0.0.1 26379 Sentinel
127.0.0.1 26380 Sentinel
127.0.0.1 26381 Sentinel


首先我们找到 Redis 的配置文件目录,修改 redis-sentinel.conf文件中的下参数:


# sentinel 端口
port 26381
# 后台运行
daemonize yes
# 监控主服务器和有一个 slave 节点
sentinel monitor mymaster 127.0.0.1 6379 2


Sentinel 启动命令如下:


redis-server redis-sentinel-26379.conf --sentinel
redis-server redis-sentinel-26380.conf --sentinel
redis-server redis-sentinel-26381.conf --sentinel


登录到 Sentinel 节点, 查询集群状态, 使用 info命令即可


640.jpg


sentinel 服务和其他 redis 服务节点启动区别,就是在启动的过程中,不会加载 RDB 或者 AOF 来还原数据。


Sentinel 和 Redis 服务之间的通讯


  • _命令连接_,建立一个链接接收主/从服务器的回复 (默认 10 秒一次发送请求 info 信息获取节点状态,故障转移的时候会变为 1 秒一次。并且每一秒向服务器节点发一个 PING 命令判断服务是否在线


640.png


  • 订阅链接,用于订阅主服务器的 __sentinel__:hello 频道


我们先验证一下在主节点上查询,执行 SUBSCRIBE __sentinel__:hello


c435d6bdb7f6c546d21acbf7bfdf9c2e.png


主节点服务上的同步信息,我们可以通过 INFO 命令来查询


69f8652a32044f4c326c877951a39a08.png


从节点服务器上通过 INFO 命令查询同步信息


09c5946d004a9fcb36310b9d6cb45caf.png


Sentinel 之间通讯


  • 对于监视同一个主/从服务器的多个 Sentinel 节点,他们会以每两秒一次的频率,向被监视的服务器的 __sentinel__:hello 频道发送消息来宣告自己存在。
  • Sentinel 之间不会创建订阅链接,通过命令通讯。因为已经可以通过主/从服务器获取未知的 Sentinel 服务节点。


Sentinel 获取 Redis 节点列表


** Sentinel 会默认 10 秒一次向主服务器信息,通过发送 info 命令**,的回复来获取当前主服务器的信息。


# Server
run_id:5e4d6e3ee147ff231d540ae2add485e906944f2a
...
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=2712947,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=2712947,lag=0
master_replid:f2163cc41b43c20998a54c14647ba5b106dc4677
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2713213
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1664638
repl_backlog_histlen:1048576
....


通过分析主服务器的 info 命令可以获取到以下两方面的信息:


  1. 关于服务器本身的信息,包括 run_id 记录服务器运行的 id, 以及服务器 role 角色等。
  2. 另外一方面就是获取主服务器下面的所有从服务器信息,比如: slave0:ip=127.0.0.1,port=6381,state=online,offset=2712947,lag=0这样就不需要我们在 conf 文件中配置从服务器的信息,Sentinel 可以自动发现。


当 Sentinel 从主服务器获取到从服务器信息过后,也会 10 秒钟向从服务器发送 INFO 命令来获取从服务器信息 我们可以执行命令 redis-cli -h 127.0.0.1 -p 6380 info 得到以下信息


# Server 
run_id:7ef635af0d3e0b1d60d2776eba0a15883db06245
...
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:2779874
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f2163cc41b43c20998a54c14647ba5b106dc4677
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2779874
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1731299
repl_backlog_histlen:1048576
...


我们从结果中可以得到以下信息:


  1. 服务器的运行 Id run_id
  2. 服务器的角色 role
  3. 主服务器的信息 master_host, master_port
  4. 主从服务器的连接状态 master_link_status
  5. 从服务器的优先级 slave_priority
  6. 从服务器的复制偏移量 slave_repl_offset


服务下线


主观下线:一台 sentinel 判断下线 客观下线:主观下线后会询问其他的 sentinel 节点判断是否该主节点下线,如果是真的下线了,那么就是客观下线。


51846b1c889e0020ccf6c06616de8fe1.png


判断下线的方式


sentinel 配置文件中 down-after-millseconds 选项制定了 sentinel 实例进入主观下线所需的时间;如果一个实例在 down-after-millseconds毫秒内,连续向 Sentinel 返回无效回复,那么 Sentinel 会修改这个实例所对应的实例结构,在结构的 flags 属性中打开 SIR_S_DOWN 标示,来表示这个实例主观下线。当超过一半的哨兵节监测到一个redis 节点下线后此刻该集群中该节点才算真正被判断为下线,也叫客观下线


选举领头 sentinel


当发生 master 节点客观下线后,会进行 sentinel 选举,进行选举出领头 sentinel 对 redis sentinel 集群做故障转移。领头 sentinel 选举规则:


  1. 所有在线的 sentinel 都具有选举资格。
  2. 每次选举后,不管是否选举成功,sentinel 配置纪元(configuration epoch)都会自增一次
  3. 每个配置纪元里面都有一次将某个 sentinel 设置为局部领头 sentinel 的机会,且局部领头 sentinel 一旦设置当前配置纪元里面不可修改
  4. 每个发现主服务器客观下线的 sentinel 都会要求其他的 sentinel 将自己设置为局部的 领头 sentinel
  5. sentinel 局部领头 sentinel 的规则是先到先的,最先向目标 sentinel 发送设置要求的 sentinel 先设置成功,之后的都会被拒绝
  6. 如果某个 sentinel 被半数以上的 sentinel 设置成了局部领头 sentinel ,那么这个 sentinel 就成为领头 sentinel
  7. 因为领头 sentinel 产生需要半数的 sentinel 的支持,并且每个配置纪元里面只能设置一次 领头 sentinel ,所以只会出现一个领头 sentinel
  8. 如果在指定的时间内没有产生领头 sentinel 那么就会进行再次选举,直到选出领头 sentinel 为止。


故障转移


故障转移分为三个步骤:


  1. 在已经下线的主服务器下的所有服务器里中,选择一个从服务器,将器作为主服务器。
  2. 让已经下线的主服务器下的所有从服务器复制新的主服务器。
  3. 将已经下线的主服务器设置为新主服务器的从服务器,当这个旧的主服务器重新上线后它就会成为新的主服务器的从服务器。


选择新主服务器


对从服务器进行过滤


  1. 删除处于下线的从服务器,保证都是正常在线
  2. 删除列表中所有 5 秒没有回复过 sentinle leader 的 info 命令的服务器,可以保证列表中剩余的从服务器通讯正常
  3. 保证从服务器的数据是最新的,主要是删除与主服务器断开链接超过 down-after-millseconds * 10 毫秒的服务器。保证没有过早的断开链接
  4. 最后按照上面的筛选过后,进行排序,选择其中优先级最高的。


      1) 如果存在多个相同优先级的,考虑偏移量(slave_repl_offset)最大的从服务器,因为偏移量最大说明保存的数据是最新的

   2) 果还是存在相同的偏移量的从服务器,那么就选择运行 id(run_id)最小的从服务器


26ebeafa395f382f274bef3f3d0a6b0c.png


发生故障转移后 Server2 升级为主服务器


修改从服务器的复制目标


当新的主服务器出现后 ,领头的 Sentinel 会让其他的服务器节点,去复制新的主节点的数据可以通过向从服务器发送 saveof 命令来实现。


771bf9b21164f308eb57e86e038d5ab1.png


将旧的主服务器变成从服务器


故障转移的最后操作,就是将已经下线的的主服务器设置为新的主服务的从服务器。


ba28bdbc930fb253f99bbbccf3551ffb.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
112 2
基于Redis的高可用分布式锁——RedLock
|
4月前
|
监控 NoSQL Redis
Redis 哨兵模式高可用
Redis 哨兵模式高可用
85 4
|
5月前
|
运维 监控 NoSQL
Redis Sentinel哨兵模式部署
Redis Sentinel哨兵模式部署
110 2
|
2月前
|
监控 NoSQL Redis
Redis Sentinel:秒杀系统背后的可靠性保障神器!
本文详细介绍了如何在个人项目中利用 Redis 哨兵模式保障系统的可靠性与高可用性。哨兵模式通过监控主从服务器状态、自动故障转移和通知客户端等功能,确保在主服务器宕机时系统仍能正常运行。适用于读请求多于写请求的场景,如秒杀系统,能有效缓解数据库压力。同时也探讨了哨兵模式在高并发场景下的优化方法及潜在缺陷,帮助开发者更好地应用该模式。
67 7
Redis Sentinel:秒杀系统背后的可靠性保障神器!
|
1月前
|
监控 NoSQL 算法
Redis Sentinel(哨兵)详解
Redis Sentinel(哨兵)详解
|
1月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
33 3
|
3月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
4月前
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
137 1
|
5月前
|
存储 运维 NoSQL
Redis 分区:构建高性能、高可用的大规模数据存储解决方案
Redis 分区:构建高性能、高可用的大规模数据存储解决方案
|
6月前
|
存储 监控 NoSQL
Redis是如何保证高可用的?
通过这些机制,Redis可以在主节点故障或其他异常情况下保持高可用性,确保数据的可靠性和可用性。不过,为了实现高可用性,需要仔细规划和配置Redis集群,并确保监控和故障恢复机制的可靠性。
188 6