【问题标题】:How can I load balance reads on a master/slave redis setup?如何在主/从 redis 设置上负载平衡读取?
【发布时间】:2018-11-14 14:34:08
【问题描述】:

我正在学习 StackExchange.Redis 和 Kubernetes,所以我制作了一个简单的 .net 核心应用程序,它从部署在 kubernetes 上的 Redis master+2slave 读取键/值。 (所以,一切,Redis 和我的应用程序,都在容器中运行)

要连接到 redis,我使用文档中建议的语法:

ConnectionMultiplexer.Connect("server1:6379,server2:6379,server3:6379");

但是,如果我用 redis-cli MONITOR 监控 3 个容器,请求总是从主服务器处理,2 个从服务器什么都不做,所以没有负载平衡。

我还尝试连接到公开 3 个 Redis 容器端点的 Kubernetes 负载均衡器服务,结果是当我启动 .net 应用程序时,请求由 3 个 Redis 节点之一随机处理,但总是在同一个节点上。我必须重新启动 .net 应用程序,它将查询另一个节点,但后续查询始终在该节点上进行。

使用带有主/从 Redis 设置的 StackExchange.Redis 以负载平衡方式读取键/值的正确方法是什么?

谢谢

【问题讨论】:

  • 请分享你的 kubernetes manifests for redis deploymenet/statefulset 和服务

标签: asp.net-core kubernetes stackexchange.redis


【解决方案1】:

SE.Redis 有一个CommandFlags 参数,在每个命令上都是可选的。这里有一些有用且相关的选项:

  • DemandMaster
  • PreferMaster
  • DemandSlave
  • PreferSlave

默认行为是PreferMaster;写入操作将其与DemandMaster 相撞,并且有非常少 主动更喜欢副本的命令(键空间迭代等)。

所以:如果您没有指定 CommandFlags,那么现在您可能正在使用默认值:PreferMaster。假设 master 存在并且是可达的,那么:它将使用 master。并且只能有一个主服务器,所以:它将使用一台服务器。

今天一个便宜的选择是在大容量读取操作中添加PreferSlave 作为CommandFlags 选项。如果可以解决,这会将工作推送到副本 - 或者如果找不到副本:主服务器。由于可以有多个副本,因此它应用了基本的基于轮换的负载平衡方案,您应该开始看到多个副本上的负载。

如果您想将负载分散到包括主节点和副本在内的所有节点...那么我需要为此添加新代码。因此,如果您需要,请将其作为问题记录在 github 存储库中。

【讨论】:

  • 感谢 Marc,使用 PreferSlave 进行了一些更改,现在 get 由 2 个从属设备中的一个处理,而不是像以前那样由主设备处理,但它始终是同一个从设备 :( 连接列表中的第一个...我想要一个 LoadBalanced 命令标志,它可以平均分配 master 和所有 slave 上的读取操作负载,并且理想地找到一种方法来使 M+S 列表与公开它们的 kubernetes 服务保持同步,这可能会更改端点列表。我会想一个更好的方式来表达我的请求并最终在 GH 上打开一个问题。非常感谢现在;)
  • @AntonM 它应该当前在 2 个从站之间轮换;如果这没有发生,那么听起来有些“不对劲”,但如果没有更多上下文就很难具体说明
  • 我正在再次检查代码,如果我无法解决问题,我最终会将您指向源代码。谢谢
  • @AntonM 问题:您使用的是什么 redis 服务器版本,究竟
  • @omriman12 是的,库将识别复制拓扑
【解决方案2】:

根据docs,它应该自动检测主/从。可能是StackExchange.Redis 检测到您的所有节点都是主节点,因此只需使用自己的决胜规则选择一个。

如果 StackExchange.Redis 发送了一些无效命令,我也会检查你的 redis-pod 上的请求日志,也许你没有正确的权限让它检测主/从。

也许您还启用了 Sentinel 和 StackExchange doesn't support sentinel

如果您发现有问题,您可以在 Github 上提出问题

最后,你也可以试试twemproxy

【讨论】:

  • 虽然你说的没有,但根据我的回答,我怀疑这里的实际问题只是CommandFlags
  • 啊酷,谢谢!。它在文档中的哪里,或者您必须从代码中知道?
  • 我不知道我们是否写过.md 覆盖它,但在CommandFlags 的智能感知文档中有说明
  • 感谢 Rico,kube。部分与其他工具完美配合,我试图从使用 SE.Redis 的 .net 应用程序中获得相同的结果。我想按照 Marc 的建议调整 commandFlags 应该会得到想要的结果。
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2023-01-25
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多