如何在主/从Redis设置上平衡读取的负载?

时间:2018-10-22 18:17:51

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

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

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

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

但是,如果我使用redis-cli MONITOR监视3个容器,则总是从主服务器处理请求,而2个从属服务器则什么也不做,因此没有负载平衡。

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

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

谢谢

2 个答案:

答案 0 :(得分:3)

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

  • DemandMaster
  • PreferMaster
  • DemandSlave
  • PreferSlave

默认行为是PreferMaster;写操作将其推向DemandMaster,并且有很少个命令会积极地喜欢副本(键空间迭代等)。

因此:如果您未指定CommandFlags,那么现在您可能正在使用默认值:PreferMaster。假设母版存在并且可以访问,那么:它将使用母版。而且只能有一个主服务器,因此:它将使用一台服务器。

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

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

答案 1 :(得分:1)

按照docs,它应该自动检测主/从。 StackExchange.Redis可能正在检测到您的所有节点都是主节点,因此仅使用其自己的决胜规则即可选择一个。

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

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

如果您发现有任何问题,可以在Github上发布一个问题

最后,您也可以尝试twemproxy