Redis Sentinel的高可用性详解

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis Sentinel的高可用性详解

一、概述

Redis Sentinel 在不使用 Redis 集群时为 Redis 提供高可用性。

Redis Sentinel还提供其他附带任务,例如监控, 通知并充当客户端的配置提供程序。

这是宏观层面(即大局)的哨兵功能的完整列表:

  • 监控。Sentinel 会不断检查您的主实例和副本实例是否按预期工作。
  • 通知。Sentinel 可以通过 API 通知系统管理员或其他计算机程序,其中一个受监控的 Redis 实例出现问题。
  • 自动故障转移。如果主节点未按预期工作,Sentinel 可以启动故障转移过程,其中副本将提升为主副本,将其他其他副本重新配置为使用新的主副本,并且使用 Redis 服务器的应用程序将被告知连接时要使用的新地址。
  • 配置提供程序。Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinels,以请求负责给定服务的当前 Redis 主服务器的地址。如果发生故障转移,Sentinels将报告新地址。

二、Sentinel作为一个分布式系统

Redis Sentinel是一个分布式系统:

Sentinel 本身设计为在有多个 Sentinel 进程协同的配置中运行。让多个 Sentinel 流程协作的优势如下:

  1. 当多个哨兵同意给定主节点不再可用时,将执行故障检测。这降低了误报的可能性。
  2. 即使不是所有的 Sentinel 进程都在工作,Sentinel 也能正常工作,使系统能够抵御故障。毕竟,拥有一个本身就是单点故障的故障转移系统没有任何乐趣。

哨兵、Redis 实例(主实例和副本实例)和客户端的总和 连接到Sentinel和Redis,也是一个更大的分布式系统,具有 特定属性。在本文档中,概念将逐步介绍 从基本信息开始,了解基本信息 Sentinel 的属性,到更复杂的信息(可选)在 以了解哨兵究竟是如何工作的。

三、快速入门

1、获取Sentinel

Sentinel的当前版本称为Sentinel 2。这是对 最初的 Sentinel 实现使用更强、更易于预测的方法 算法(在本文档中进行了说明)。

Redis Sentinel 的稳定版本从 Redis 2.8 开始发布。

在不稳定的分支中进行新的开发,并具有新功能 有时一到最新的稳定分支就被回移植到最新的稳定分支中 被认为是稳定的。

2、运行Sentinel

如果您使用的是redis sentinel可执行文件(或者如果您具有指向redis服务器可执行文件的具有该名称的符号链接),则可以使用以下命令行运行sentinel:

redis-sentinel /path/to/sentinel.conf

否则,您可以直接使用redis服务器可执行文件以Sentinel模式启动它:

redis-server /path/to/sentinel.conf --sentinel

但是,在运行 Sentinel 时必须使用配置文件,因为系统将使用该文件来保存重新启动时将重新加载的当前状态。如果没有提供配置文件或配置文件路径不可写,Sentinel 将简单地拒绝启动。

默认情况下,哨兵会侦听与 TCP 端口 26379 的连接,因此 要使 Sentinels 正常工作,服务器的端口 26379 必须打开才能接收 来自其他 Sentinel 实例的 IP 地址的连接。 否则哨兵无法交谈,也无法就该怎么做达成一致,因此故障转移 永远不会执行。

3、部署前需要了解的有关 Sentinel 的基本事项

  1. 您至少需要三个 Sentinel 实例才能进行可靠的部署。
  2. 应将三个 Sentinel 实例放置在被认为以独立方式发生故障的计算机或虚拟机中。例如,在不同的可用性区域上执行不同的物理服务器或虚拟机。
  3. Sentinel + Redis 分布式系统不保证在故障期间保留已确认的写入,因为 Redis 使用异步复制。但是,有一些方法可以部署 Sentinel,使窗口丢失写入仅限于某些时刻,而还有其他不太安全的方法来部署它。
  4. 您需要圣天诺为客户提供支持。常用的客户端库具有 Sentinel 支持,但不是全部。
  5. 如果您不在开发环境中不时进行测试,则没有安全的 HA 设置,如果可以的话,如果它们可以工作,则甚至更好。您可能有一个配置错误,只有在为时已晚(凌晨 3 点您的主站停止工作时)才会变得明显。
  6. Sentinel、Docker 或其他形式的网络地址转换或端口映射应小心混合使用:Docker 执行端口重新映射,破坏 Sentinel 自动发现其他 Sentinel 进程和主进程的副本列表。有关详细信息,请查看本文档后面有关 Sentinel 和 Docker 的部分

4、配置Sentinel

Redis源发行版包含一个名为sentinel.conf的文件,该文件是一个可用于配置sentinel的自我记录示例配置文件,但典型的最小配置文件如下所示:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

您只需要指定要监视的主机,为每个单独的主机(可能有任意数量的副本)指定不同的名称。无需指定自动发现的副本。Sentinel将使用有关副本的附加信息自动更新配置(以便在重新启动时保留信息)。在故障切换期间,每当复制副本升级为主副本时,以及每当发现新的Sentinel时,也会重写配置。

上面的示例配置基本上监视两组Redis实例,每个实例由一个主实例和未定义数量的副本组成。一组实例称为mymaster,另一组称为resque。

sentinel监控器语句参数的含义如下:

sentinel monitor <master-name> <ip> <port> <quorum>

第一行是用来告诉Redis监视一个叫mymaster的主控, 即地址 127.0.0.1 和端口 6379,仲裁为 2。万事 很明显,但法定人数参数:

  • 仲裁是需要就无法访问主服务器的事实达成一致的哨兵数量,以便真正将主服务器标记为失败,并最终启动故障转移过程(如果可能)。
  • 但是,仲裁仅用于检测故障。为了实际执行故障转移,需要选择其中一个哨兵进行故障转移的领导者并被授权继续。这只有在大多数哨兵进程投票的情况下才会发生。

因此,例如,如果您有 5 个 Sentinel 进程,以及给定的仲裁 master 设置为值 2,这就是发生的情况:

  • 如果两个哨兵同时同意无法访问主服务器,则其中一个将尝试启动故障转移。
  • 如果总共至少有三个哨兵可访问,则故障转移将被授权并实际启动。

实际上,这意味着在故障期间,如果大多数 Sentinel 进程无法通信(即少数分区中没有故障转移),则 Sentinel 永远不会启动故障转移。

六、其他Sentinel选项

其他选项几乎总是以下形式:

sentinel <option_name> <master_name> <option_value>

并用于以下目的:

  • down-after-milliseconds是实例不应使用的时间(以毫秒为单位) 是可访问的(要么不回复我们的 PING,要么回复 错误)的哨兵开始认为它已经关闭。
  • parallel-syncs设置可以重新配置为使用的副本数 同时进行故障转移后的新主服务器。数字越小, 完成故障转移过程需要更多时间,但是如果 副本配置为提供旧数据,您可能不希望所有副本都 同时与主服务器重新同步。而复制 对于副本,进程大多是非阻塞的,有一刻它会停止 从主服务器加载批量数据。您可能希望确保只有一个副本 通过将此选项设置为 1 来一次无法访问。

七、IP 地址和 DNS 名称

旧版本的 Sentinel 不支持主机名,并且要求在任何地方指定 IP 地址。 从版本 6.2 开始,Sentinel 对主机名提供了可选支持。

默认情况下,此功能处于禁用状态。如果您要启用 DNS/主机名支持,请注意:

  1. Redis和Sentinel节点上的名称解析配置必须可靠,并且能够快速解析地址。地址解析中的意外延迟可能会对Sentinel产生负面影响。
  2. 您应该在任何地方使用主机名,并避免混用主机名和IP地址。为此,对所有Redis和sentinel实例分别使用replica announce-ip<hostname>和sentinel announce-ip<hostname>。

启用解析主机名全局配置允许Sentinel接受主机名:

  • 作为命令的一部分sentinel monitor
  • 作为副本地址,如果复制副本使用replica-announce-ip

Sentinel 将接受主机名作为有效输入并解析它们,但在宣布实例、更新配置文件等时仍会引用 IP 地址。

启用公告主机名全局配置会使Sentinel改用主机名。这会影响对客户端的回复、写入配置文件中的值、向副本发出的REPLICATION命令等

八、快速教程

本节是一个教程,显示 如何配置 3 个 Sentinel 实例并与之交互。

这里我们假设实例在端口 5000、5001、5002 执行。 我们还假设您在端口 6379 上有一个正在运行的 Redis 主站,其 在端口 6380 上运行的副本。我们将使用 IPv4 环回地址 127.0.0.1 本教程期间的所有位置,假设您正在运行模拟 在您的个人计算机上。

三个 Sentinel 配置文件应如下所示:

port 5000
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

其他两个配置文件将相同,但使用 5001 和 5002 作为端口号。

关于上述配置,需要注意的几点:

  • 主集合称为mymaster。它标识主设备及其副本。由于每个主集具有不同的名称,Sentinel可以同时监视不同的主集和副本集。
  • 仲裁设置为值2(sentinel监视器配置指令的最后一个参数)。
  • 毫秒后的下降值为5000毫秒,即5秒,因此在这段时间内,如果我们没有收到ping的任何回复,主机将被检测为失败。

启动三个哨兵后,你会看到它们记录的一些消息,例如:

+monitor master mymaster 127.0.0.1 6379 quorum 2

1、查询主节点状态

要开始使用Sentinel,最明显的一件事是检查它监视的主机是否运行良好:

$ redis-cli -p 5000
127.0.0.1:5000> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "127.0.0.1"
 5) "port"
 6) "6379"
 7) "runid"
 8) "953ae6a589449c13ddefaee3538d356d287f509b"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "735"
19) "last-ping-reply"
20) "735"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "126"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "532439"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "1"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "60000"
39) "parallel-syncs"
40) "1"

如您所见,它打印了许多有关主控形状的信息。我们特别感兴趣的是:

  1. 其他哨兵的数量是2,所以我们知道哨兵已经为这个主节点检测到了两个哨兵。如果检查日志,您将看到生成的+sentinel事件。
  2. flags只是master。如果主节点故障了,我们可以在这里看到s_down或o_down标志。
  3. num slave被正确设置为1,因此Sentinel也检测到有一个连接到我们的主机的副本。

为了进一步了解此实例,您可能需要尝试以下两个命令:

SENTINEL replicas mymaster
SENTINEL sentinels mymaster

第一个将提供有关连接到主节点的副本的类似信息,第二个将提供关于其他哨兵的信息。

2、获取当前主节点的地址

正如我们已经指定的,Sentinel 还充当 想要连接到一组主副本和副本的客户端。以 可能的故障转移或重新配置,客户端不知道谁是 给定实例集的当前活动主节点,因此 Sentinel 导出 一个 API 来询问这个问题:

127.0.0.1:5000> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6379"

九、Redis 访问控制列表身份验证

从 Redis 6 开始,用户身份验证和权限通过访问控制列表 (ACL) 进行管理。

为了让哨兵在 Redis 服务器实例时连接到 Redis 服务器实例 配置了 ACL,哨兵配置必须包括 以下指令:

sentinel auth-user <master-name> <username>
sentinel auth-pass <master-name> <password>

其中,<username>和<password>是用于访问组实例的用户名和密码。这些凭据应该以最小的控制权限在组的所有Redis实例上设置。例如:

127.0.0.1:6379> ACL SETUSER sentinel-user ON >somepassword allchannels +multi +slaveof +ping +exec +subscribe +config|rewrite +role +publish +info +client|setname +client|kill +script|kill

Redis 仅密码身份验证

在 Redis 6 之前,使用以下配置指令实现身份验证:

  • requirepass在 master 中,为了设置身份验证密码,并确保实例不会处理未经身份验证的客户端的请求。
  • masterauth,以便副本向主副本进行身份验证,以便从中正确复制数据。

使用 Sentinel 时,没有一个主节点,因为在故障转移之后 副本可以扮演主控角色,而旧主控可以在 为了充当副本,所以你要做的是设置上面的指令 在您的所有实例中,包括主实例和副本实例。

这通常也是一个理智的设置,因为您不想保护 数据仅在主节点中,在副本中具有相同的数据可访问。

但是,在不常见的情况下,您需要一个无需身份验证即可访问的副本,您仍然可以通过将副本优先级设置为零,以防止将此副本升级为主副本,并在此副本中仅配置masterauth指令,而不使用requirepas指令,以便未经身份验证的客户端可以读取数据。

为了使Sentinel在使用requirepass配置时连接到Redis服务器实例,Sentinel配置必须包含Sentinel auth pass指令,格式如下:

sentinel auth-pass <master-name> <password>

十、在运行时重新配置 Sentinel

从 Redis 版本 2.8.4 开始,Sentinel 提供了一个 API,用于添加、删除或更改给定主节点的配置。请注意,如果您有多个哨兵,则应将所有更改应用于您的实例,以便 Redis Sentinel 正常工作。这意味着更改单个哨兵的配置不会自动将更改传播到网络中的其他哨兵。

以下是用于更新SENTINEL实例配置的SENTINEL子命令列表。

  • SENTINEL MONITOR<name><ip><port><quorum此命令告诉SENTINEL开始监视具有指定名称、ip、端口和quorum的新主机。它与sentinel.conf配置文件中的sentinelmonitor配置指令相同,不同之处在于不能在中使用主机名作为ip,但需要提供IPv4或IPv6地址。
  • SENTINEL REMOVE<name>用于删除指定的主机:主机将不再被监控,并且将从SENTINEL的内部状态中完全删除,因此不再被SENTINEL主机列出,依此类推。
  • SENTINEL SET<name>〔<option><value>…〕SET命令与Redis的CONFIG SET命令非常相似,用于更改特定主机的配置参数。可以指定多个选项/值对(或根本不指定)。可以通过sentinel.conf配置的所有配置参数也可以使用SET命令进行配置。

以下是SENTINEL SET命令的示例,用于修改称为对象缓存的主机的毫秒后停机配置

SENTINEL SET objects-cache-master down-after-milliseconds 1000

文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群!!!你的支持和鼓励是我创作的动力❗❗❗

Doker的成长,欢迎大家一起陪伴!!!

官网:Doker 多克; 官方旗舰店首页-Doker 多克 多克创新科技企业店-淘宝网全品优惠

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
监控 NoSQL Redis
如何保证Redis的高可用性?
【4月更文挑战第2天】Redis高可用性涉及数据持久化(RDB&AOF)、主从复制与Sentinel故障转移、Redis Cluster分布式部署、身份认证、多线程、数据压缩及监控报警等策略,确保服务连续性、数据安全及性能优化。
34 0
|
1月前
|
NoSQL Java Redis
SpringBoot2.0整合Redis高可用之Sentinel哨兵
本篇博文分享的是一主二从三哨兵模式。至于为什么用三个哨兵,同第一段。本文是模拟环境,都是一个服务器上面。
101 0
|
1月前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
197 2
|
1月前
|
NoSQL Shell Redis
Redis热升级秘诀:保证高可用性的技术方案
Redis热升级方案允许在不中断业务的情况下,实现数千级别Redis的无缝更新。通过构建Redis Shell程序保存数据库状态,封装动态连接库,以及在运行时加载新版本库,保持客户端连接,该方法确保了业务连续性和高可用性,且升级仅需几毫秒,显著提升了系统效率。
420 6
|
1月前
|
NoSQL Redis
透视Redis集群:心跳检测如何维护高可用性
Redis心跳检测保障集群可靠性,通过PING命令检测主从连接状态,预防数据丢失。当连接异常时,自动触发主从切换。此外,心跳检测辅助实现`min-slaves-to-write`和`min-slaves-max-lag`策略,避免不安全写操作。还有重传机制,确保命令无丢失,维持数据一致性。合理配置心跳检测,能有效防止数据问题,提升Redis集群的高可用性。关注“软件求生”获取更多Redis知识!
237 10
透视Redis集群:心跳检测如何维护高可用性
|
1月前
|
监控 NoSQL 算法
Redis集群模式:高可用性与性能的完美结合!
小米探讨Redis集群模式,通过一致性哈希分散负载,主从节点确保高可用性。节点间健康检测、主备切换、数据复制与同步、分区策略和Majority选举机制保证服务可靠性。适合高可用性及性能需求场景,哨兵模式则适用于简单需求。一起学习技术的乐趣!关注小米微信公众号“软件求生”获取更多内容。
191 11
Redis集群模式:高可用性与性能的完美结合!
|
1月前
|
监控 NoSQL Redis
Redis - 主从复制那些事与高可用sentinel
Redis - 主从复制那些事与高可用sentinel
42 0
|
1月前
|
监控 NoSQL 程序员
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
85 5
|
1月前
|
NoSQL Linux Redis
Redis 6.X Sentinel 哨兵集群搭建
Redis 6.X Sentinel 哨兵集群搭建
39 5
|
6月前
|
NoSQL Redis Docker
使用bitnamiredis-sentinel部署Redis 哨兵模式
使用bitnamiredis-sentinel部署Redis 哨兵模式
238 0