Redis哨兵 vs 集群化

179

我了解redis sentinel是一种在多个redis实例之间配置高可用性(HA)的方法。我认为,在任何给定时间,有一个redis实例正在积极地为客户端请求提供服务。还有两个额外的服务器处于待机状态(等待发生故障,以便其中之一可以再次运行)。

  • 这是资源的浪费吗?
  • 是否有更好的方法充分利用可用资源?
  • Redis集群是Redis Sentinel的替代方案吗?

我已经查看了redis文档sentinelclustering,请有经验的人解释一下。

Redis sentinel中的主从配置 - 故障前

主节点失败,从节点接管

更新

好的。在我的实际部署场景中,我有两台服务器专门用于redis。我有另一台服务器运行我的Jboss服务器。在Jboss中运行的应用程序被配置为连接到Redis主服务器(M)。

故障转移场景

理想情况下,我认为当主缓存服务器失败(无论是Redis进程崩溃还是机器故障)时,Jboss中的应用程序需要连接到从缓存服务器。我如何配置redis服务器才能实现这一点?

+--------+          +--------+
| Master  |---------| Slave  |
|         |         |        |
+--------+          +--------+

Configuration: quorum = 1

4
这可能会有帮助 - http://fnordig.de/2015/06/01/redis-sentinel-and-redis-cluster/ - Itamar Haber
1
这也可能有所帮助:https://alex.dzyoba.com/blog/redis-ha/ - Toby
8个回答

169
首先,让我们谈一下Sentinel。
Sentinel管理故障转移,但不配置Redis的高可用性。这是一个重要的区别。其次,您张贴的图表实际上是一个糟糕的设置 - 您不希望在管理它的Redis节点上运行Sentinel。当您失去该主机时,您将失去两者。
至于“是否浪费资源”,这取决于您的用例。在该设置中,您不需要三个Redis节点,只需要两个。三个增加了冗余性,但并非必需。如果您需要增加的冗余性,则它不是资源浪费。如果您不需要冗余性,则只需运行单个Redis实例即可 - 运行更多将是“浪费”。
运行两个从属节点的另一个原因是为了拆分读取。同样,如果您需要它,则不会浪费。
至于“是否有更好的利用可用资源的方法”,我们无法回答,因为它完全取决于您特定的情况和代码。尽管如此,如果要存储的数据量“小”且命令速率并不非常高,请记住您不需要将主机专用于Redis。
现在是“Redis集群是否是Redis Sentinel的替代方案?”。 这完全取决于您的用例。Redis Cluster不是HA解决方案-它是多写/大于RAM解决方案。如果您的目标只是HA,那么它可能不适合您。Redis Cluster具有限制,特别是在多键操作方面,因此并不一定是直接使用“集群”的操作。
如果您认为运行三个运行Redis(和三个运行Sentinel)的主机是浪费的,那么您可能会认为Cluster更加浪费,因为它确实需要更多资源。
您提出的问题可能过于广泛和基于观点,无法保留原意。如果您正在解决特定情况/问题,请更新内容以便我们可以提供具体的帮助和信息。
更新内容如下:

针对您的情况来管理故障转移,我建议使用3个Sentinel,其中一个在JBoss服务器上运行。如果您有3个JBoss节点,则每个节点都应该有一个Sentinel。我会在不同的节点上部署Redis pod(主+从),并让Sentinel来管理故障转移。

接下来就是将JBoss/Jedis与Sentinel进行连接和信息管理的问题。由于我没有使用这些技术,所以进行了快速搜索,发现Jedis已经支持它,只需要正确配置即可。一些例子可以在Looking for an example of Jedis with Sentinelhttps://github.com/xetorthio/jedis/issues/725找到,它们讨论使用JedisSentinelPool作为连接池的方法。

当Sentinel执行故障转移时,客户端会被断开连接,Jedis会通过询问Sentinels来获取当前的主节点,并应该自动重新连接。


9
你好@The-Real-Bill,你能否详细说明一下“Sentinel manages the failover, it doesn't configure Redis for HA.”的意思?在官方文档中(http://redis.io/topics/sentinel),它说“Redis Sentinel为Redis提供高可用性。”Sentinel可以管理Redis主从节点之间的故障转移,但它不会配置Redis的高可用性。官方文档中确实提到了"Redis Sentinel provides high availability for Redis.",但这并不代表Sentinel会自动配置Redis实例,而是指Sentinel通过监控和管理Redis实例来提供高可用性支持。 - Devs love ZenUML
2
HA Redis需要多个部分才能实现高可用性。Sentinel只处理其中一个部分:故障转移。它不设置复制,也不提供HA终端。它提供服务发现,以便客户端知道在哪里与主服务器通信。但是它不会为HA配置Redis。 - The Real Bill
6
这里所说的声明并不准确 - Redis Sentinel确实可以管理从主节点到备用节点的复制。在故障转移时,主节点会更改,而复制将从新的主节点移动到任何剩余的节点。恢复的节点成为作为目标进行复制的次要站点。缺失的部分是客户端需要与Sentinel通信以接收有关状态更改的信息。因此,Sentinel是一种高可用性解决方案。 - JasonG
8
我说它不会设置复制,这是正确的。您需要通过设置从服务器来配置Redis复制。然后Sentinel将发现它并管理故障转移。Sentinel无法设置复制,因为它只能管理现有的复制设置。请尝试一下。打开两个独立的Redis服务器,并让Sentinel将一个服务器变成另一个服务器的从服务器,而不直接使用slave of命令。这是行不通的。它也无法添加新的从服务器。因此,它确实设置了复制。 - The Real Bill
@TheRealBill 你提到:“Redis Cluster不是高可用解决方案 - 它是一个多写/大于内存的解决方案。” 但是,与每个主节点相关联的副本确实使Redis集群具有高可用性。不是吗?如果您认为主节点和副本之间的毫秒延迟是一个问题,那么就没有真正具有高可用性的分布式系统了。 - RRM

56

这并不是对你问题的直接回答,但这是关于Redis高可用性解决方案的有用信息,尤其是对像我一样的新手。Redis Sentinel是Redis高可用解决方案的名称......它与Redis Cluster无关,旨在为那些不需要Redis Cluster,而仅需要一种在主实例失效时自动执行故障转移的方法的人使用。

以上内容摘自Redis Sentinel设计草案1.3

当你新使用Redis并实现故障转移解决方案时,这并不明显。关于SentinelClustering的官方文档没有相互比较,因此在不阅读大量文档的情况下很难选择正确的方式。


46

建议在开始使用奇数个实例,不要使用两个或两个的倍数。这一点已经得到了纠正,但还有其他一些需要纠正的地方。

首先,声称Sentinel提供了故障转移但没有高可用是错误的。当您使用故障转移时,您就具备了高可用性,而且还能够复制应用程序状态的附加优势。区别在于,您可以在系统中拥有高可用性,但没有复制(它具备高可用性,但不具备容错功能)。

其次,将Sentinel运行在与目标Redis实例相同的机器上不是一种“糟糕的设置”:如果您失去了Sentinel、Redis实例或整个机器,结果都是一样的。这可能就是为什么这种配置的每个示例都显示两者都在同一台机器上运行。


8
实际上,在“实例上的哨兵”设置中,可能存在Sentinel无法启动选举的错误,我在这里、在ML和个人咨询中都见过很多次。将Sentinel从Redis服务器中移出可以每次都解决这个问题。因此,采用这种方式设置是不好的,因为它会在你最需要它的时候失效。一些示例是这样展示的,因为它们并非由具有丰富操作经验的人编写,而且更容易理解。 - The Real Bill
4
这是哪个漏洞?有没有漏洞报告?你知道它是否仍然存在吗? - sivann
在应用程序机器上放置哨兵是否存在类似的问题? - OrangeDog

39

以上回答的附加信息:

Redis 集群

  • Redis 集群的主要目的之一是通过分片来均匀地分发数据负载。

  • Redis 集群不使用一致性哈希,而是使用另一种分片方式,其中每个键在概念上都是哈希槽的一部分。

  • Redis 集群中有 16384 个哈希槽,每个节点负责哈希槽的一个子集。例如,您可以有一个包含 3 个节点的集群,其中:

    节点 A 包含哈希槽从 0 到 5500, 节点 B 包含哈希槽从 5501 到 11000, 节点 C 包含哈希槽从 11001 到 16383

这使我们能够轻松地添加和移除集群中的节点。例如,如果我们想添加一个新节点 D,我们需要将一些哈希槽从节点 A、B、C 移动到 D。

  • Redis 集群支持主从结构,在创建集群时可以创建从节点 A1、B1、C2 和主节点 A、B、C,因此当主节点 B 宕机时,从节点 B1 将被提升为主节点。

在使用 Redis 集群时,您不需要额外的故障转移处理,绝对不要指向 Sentinel 实例中的任何集群节点。

那么在实际应用中,Redis 集群有什么好处?

1.自动将数据集拆分到多个节点中的能力。

2.当子集节点经历故障或无法与集群的其余部分通信时,继续运行操作的能力。

Redis Sentinel

  • Redis支持多个从节点复制主节点的数据。
  • 这为主节点中的数据提供了备份。
  • Redis Sentinel是一个系统,旨在管理主节点和从节点。它作为单独的程序运行。在理想的系统中,所需的最小哨兵数量为3个。它们彼此之间通信,并确保主节点正常运行,如果主节点异常,它们将晋升其中一个从节点为新的主节点,因此在之后死亡的节点将作为新主节点的从节点重新加入集群。
  • Quorum是可配置的。基本上是需要同意的哨兵数来判断主节点是否失效。N/2 +1应该同意。其中N是Pod中节点的数量(请注意,此设置称为Pod而不是集群)。

那么实际上,Redis Sentinel有什么好处呢?

它将确保主节点始终可用(如果主节点关闭,则从节点将被晋升为主节点)。

参考资料:

https://fnordig.de/2015/06/01/redis-sentinel-and-redis-cluster/

https://redis.io/topics/cluster-tutorial


26

在阅读了大量文档后,这是我的理解。

Sentinel是一种热备份解决方案,其中从服务器被保持复制并随时准备进行晋升。但是,它不支持任何多节点写操作。从服务器可以配置用于读操作。Sentinel不会提供HA是不正确的,它具有典型主动-被动集群的所有功能(尽管这不是在这里使用的正确术语)。

Redis集群基本上是一个分布式解决方案,建立在分片之上。每个数据块都被分配给主服务器和从服务器节点。最小的复制因子为2,确保您在主服务器和从服务器之间有两个活动的分片可用。 如果你了解Mongo或Elasticsearch中的分片,那么理解起来就很容易。


8
Redis可以在分区群集(具有许多主服务器和这些主服务器的从服务器)或单个实例模式(具有副本从服务器的单个主服务器)下运行。 这里的link说:
当在单个实例模式下使用Redis时,其中一个Redis服务器管理整个未分区的数据库,Redis Sentinel用于管理其可用性。
它还说:
Redis集群将数据分区在多个主实例之间,自己管理可用性,不需要额外的组件。
因此,在这两种情况下都可以确保高可用性。 Redis集群和Sentinel不是彼此的替代品。 它们只是用于确保分区或非分区主服务器中不同情况的高可用性。

6
Redis Sentinel在主节点宕机时,会将从节点升级为主节点。通常情况下,需要使用奇数个Sentinel节点。例如,对于一个主节点和一个从节点的情况,应该使用3个Sentinel节点,以便达成共识。最好第三个Sentinel节点在第三台服务器上,这样可以避免决策被偏向(取决于故障)。Sentinel会负责更改节点的主/从配置设置,以便正确地进行升级和同步,避免因为引入旧的失败主节点而覆盖数据。
一旦您设置了Sentinel节点以执行故障转移,您需要确保指向正确的实例。请参阅HAProxy配置示例。HAProxy会执行健康检查,并在发生故障时指向新的主节点。
集群将允许您进行水平扩展,并有助于处理高负载。但是,需要一些工作来进行前期设置和配置。
有一个名为“KeyDB”的Redis开源分支,它通过使用主从复制选项消除了需要哨兵节点的必要性。这使得副本节点能够接受读写操作。当故障转移发生时,HAProxy停止与失败节点的读/写操作,并只使用已同步的剩余活动节点。时间戳功能使得失败的节点可以自动重新加入并在其重新上线时重新同步而不会丢失数据。设置简单,对于更高的流量,您不需要特殊的预先设置来将读取定向到副本节点并将读/写操作定向到主节点。在此处查看主从复制示例。KeyDB还是多线程的,对于某些应用程序可能是集群的替代方案,但这实际上取决于您的需求。
还有一个手动设置集群和使用create-cluster 工具的示例。如果您使用Redis,则这些步骤相同(在指令中替换'keydb'为'redis')。

0
除了@Kamarey的回答以外,我发现Redis作者在2015年发表的文章"Redis cluster, no longer vaporware."对于像我这样的Redis新手来说,有助于理解Sentinel和Cluster之间的区别,特别是其中的这一段话,

人们反复尝试做两件事情:

  1. 将数据集分片成N个节点。
  2. 实现对某些故障的响应式容错程序。

问题“2”非常严重,以至于我决定在Cluster完成之前启动Redis Sentinel项目,以尽快提供一个HA系统,而且这个系统比Redis Cluster更适用于大多数仅需要“2”而不是“1”的使用情况。

一开始让我感到困惑的一件事是,集群概念总是与高可用性相关联,但这里Redis Cluster用于数据分片,而Sentinel用于HA(带主从模式)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接