Redis 前哨与群集

我知道 redis Sentinel 是一种在多个 redis 实例之间配置 HA (高可用性)的方法。正如我所看到的,在任何给定的时间都有一个主动为客户机请求服务的 redis 实例。另外还有两台服务器处于待机状态(等待故障发生,以便其中一台可以再次运行)。

  • 这是浪费资源吗?
  • 是否有更好的方法来充分利用现有资源?
  • Redis 集群是否是 Redis 哨兵的替代品?

我已经查阅了 哨兵聚集的红地文件,请有经验的人解释一下。

Master slave configuration in Redis sentinel - before failure

Master fails and slave kicks in to action

更新

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

故障转移方案

理想情况下,我认为当主缓存服务器出现故障(Redis 进程出现故障或机器出现故障)时,Jboss 中的应用程序需要连接到从缓存服务器。如何配置 Redis 服务器来实现这一点?

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


Configuration: quorum = 1
121400 次浏览

首先,让我们谈谈哨兵。

Sentinel 管理故障转移,它不为 HA 配置 Redis。这是一个重要的区别。其次,您发布的图表实际上是一个糟糕的设置——您不希望在与它管理的 Redis 节点相同的节点上运行 Sentinel。当你失去了那个宿主,你就失去了两个。

至于“这是浪费资源吗?”这取决于你的用例。在这个设置中,您不需要三个 Redis 节点,只需要两个。三个增加您的冗余,但不是必需的。如果您需要增加冗余,那么这并不是浪费资源。如果您不需要冗余,那么您只需运行一个 Redis 实例并调用它就可以了——因为运行更多的实例将是“浪费”。

运行两个奴隶的另一个原因是分割读取。再说一次,如果你需要它,那么它不会是一种浪费。

至于“有没有更好的方法来充分利用现有的资源?”我们不能回答这个问题,因为它太依赖于您的特定场景和代码了。也就是说,如果要存储的数据量“很小”,并且命令率不是非常高,那么请记住,您不需要为 Redis 专用一个主机。

现在讨论“ Redis 集群是否是 Redis 哨兵的替代品?”。 它实际上完全取决于您的用例。Redis 集群不是 HA 解决方案-它是一个多写入器/大于内存的解决方案。如果你的目标只是 HA,那么它可能不适合你。Redis 集群有一些局限性,特别是在多键操作方面,所以它不一定是一个简单的“仅仅使用集群”操作。

如果您认为有三个主机运行 Redis (和三个运行哨兵)是浪费,那么您可能会认为 Cluster 更浪费,因为它确实需要更多的资源。

你提出的问题可能过于宽泛和基于观点,以至于无法按照书面形式存在下去。如果您有一个特定的情况/问题,您正在解决请更新,以便我们可以提供具体的协助和信息。

更新细节:

为了在您的场景中进行适当的故障转移管理,我将使用3个哨兵,其中一个在您的 JBoss 服务器上运行。如果您有3个 JBoss 节点,那么每个节点上使用一个。我将在不同的节点上安装一个 Redis pod (主从节点) ,并让 Sentinel 管理故障转移。

从这里开始,就需要将 JBoss/Jedis 连接起来,使用 Sentinel 进行信息和连接管理。由于我没有使用这些快速搜索出来的绝地武士支持它,你只需要正确地配置它。我发现的一些例子是在 找一个绝地武士和御天敌的例子https://github.com/xetorthio/jedis/issues/725,它们谈到 JedisSentinelPool是使用池的路由。

当哨兵执行故障转移时,客户端将被断开,而绝地将(应该?)通过询问哨兵现在的主人是谁来处理重新连接。

所有地方的建议都是从一个奇怪的数量开始,而不是使用两个或两个的倍数。这个问题已经得到纠正,但是让我们来纠正一些其他的问题。

首先,说 Sentinel 在没有 HA 的情况下提供故障转移是错误的。当进行故障转移时,您将获得 HA,并且可以复制应用程序状态的额外好处。区别在于,系统中可以有 HA 而不需要复制(它是 HA,但不能容错)。

其次,在同一台机器上运行一个哨兵作为它的目标 redis 实例并不是一个“糟糕的设置”: 如果您丢失了哨兵,或者您的 redis 实例,或者整个机器,结果是相同的。这可能就是为什么这种配置的每个示例都显示在同一台机器上运行。

这不是对你问题的直接回答,但是想一想,这对于像我这样的 Redis 新手来说是很有帮助的信息。此外,这个问题出现在谷歌的第一个链接时,搜索“红迪斯集群与哨兵”。

雷迪斯哨兵是雷迪斯高可用性解决方案的名字。 它与 Redis 集群没有任何关系,应该由以下人员使用 人们不需要 Redis 集群,只需要一种方式来执行 当主实例无法运行时自动故障转移 正确。

拍自 Redis Sentinel 设计草案1.3

当您刚接触 Redis 并实现故障转移解决方案时,这一点并不明显。关于 哨兵聚集的官方文档不能相互比较,所以如果不阅读大量的文档,就很难选择正确的方法。

这是我在整个文件过程中撞到头后的理解。

哨兵是一种热备份解决方案,奴隶保持复制和随时准备提升。但是,它不支持任何多节点写。可以为读操作配置从服务器。Sentinel 不会提供 HA 的说法是不正确的,它具有典型的主动-被动集群的所有特性(尽管这里不适合使用这个术语)。

Redis 集群或多或少是一个分布式解决方案,工作在碎片之上。每个数据块都分布在主节点和从节点之间。复制因子的最小值为2可以确保在主服务器和从服务器之间有两个活动碎片可用。 如果您知道 Mongo 或 Elasticsearch 中的分片,那么将很容易赶上。

Redis 可以在分区集群中操作(有许多主服务器和从服务器) ,也可以在单个实例模式下操作(有复制从服务器的单个主服务器)。
这里的 链接说:

在单实例模式下使用 Redis 时(其中单个 Redis 服务器管理整个未分区数据库) ,使用 Redis Sentinel 管理其可用性

它还表示:

Redis 集群将数据在多个主实例之间进行分区,它自己管理可用性,不需要额外的组件。

因此,可以在上述两种情况下确保 HA。希望这能消除你的疑虑。红迪斯集群和哨兵是不可替代的。它们只是用于确保在不同的分区或非分区主机情况下执行 HA。

RedisSentinel 在看到主服务器失效时执行故障转移促进副本。您通常需要奇数个前哨节点。对于一个主人和一个副本的例子,应该使用3个哨兵,以便就决定达成共识。理想情况下,第三哨兵位于第三服务器上,因此决策不会有偏差(取决于失败情况)。Sentinel 负责更改节点上的主/副本配置设置,以便以正确的顺序进行升级和同步,并且不会通过引入现在包含旧数据的旧失败主控来覆盖数据。

设置了用于执行故障转移的前哨节点后,需要确保指向正确的实例。参见 用于此的 HAProxy 配置的示例。HAProxy 执行健康检查,并在发生故障时指向新的主服务器。

集群将允许您水平伸缩,并且可以帮助处理高负载。预先设置和配置确实需要一些工作。

Redis 有一个开源分支“ KeyDB”,它消除了对带有活动副本选项的前哨节点的需要。这允许复制节点接受读和写。当发生故障转移时,HAProxy 停止对故障节点的读/写操作,只使用剩余的已同步的活动节点。时间戳使失败的节点能够自动重新连接并在重新联机时重新同步,而不会丢失数据。安装非常简单,对于较高的流量,您不需要特殊的前置设置来将读操作指向复制节点,并将读/写操作指向主节点。请参见此处的活动复制示例.KeyDB 也是多线程的,对于某些应用程序来说,它可能是集群的一种替代方案,但实际上取决于您的需求是什么。

还有一个设置 手动聚类创建-集群工具创建-集群工具的例子。如果使用 Redis,这些步骤是相同的(在指令中用“ Redis”替换“ keydb”)

以上答案的附加信息

红迪斯群集

  • Redis 集群的一个主要目的是均匀分布 通过分片

  • 加载数据
  • Redis Cluster 不使用一致哈希,而是一种不同形式的分片,其中每个键在概念上都是所谓散列槽的一部分

  • 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 集群时,不需要额外的故障转移处理,而且绝对不应该将哨兵实例指向任何集群节点。

那么,从实际的角度来说,您从 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