【问题标题】:Using ServiceStack Redis with Twemproxy将 ServiceStack Redis 与 Twemproxy 一起使用
【发布时间】:2014-01-25 02:33:14
【问题描述】:

我一直在成功使用 ServiceStack PooledRedisClientManager。我现在正在将 Twemproxy 添加到组合中,并在单个 Ubuntu 服务器上运行 4 个前面有 Twemproxy 的 Redis 实例。

这导致通过 ServiceStack 连接到 Redis 的轻负载测试(100 个用户)出现问题。我已经尝试过原始的 PooledRedisClientManager 和 BasicRedisClientManager,两者都给出了错误 No connection could be made because the target machine主动拒绝了它

我需要做些什么才能让这两个人一起玩得很好吗?这是 Twemproxy 配置

alpha:
  listen: 0.0.0.0:12112
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  timeout: 400
  server_retry_timeout: 30000
  server_failure_limit: 3
  server_connections: 1000
  servers:
   - 0.0.0.0:6379:1
   - 0.0.0.0:6380:1
   - 0.0.0.0:6381:1
   - 0.0.0.0:6382:1

我可以单独连接到每个 Redis 服务器实例,只是通过 Twemproxy 失败。

【问题讨论】:

  • 你把服务器的ip从0.0.0.0改成127.0.0.1解决了这个问题吗?
  • 很遗憾,没有,仍然是相同的结果,仍在寻找解决方案。我总是可以连接到 twemproxy,问题是在运行 100 个用户的负载测试时出现错误“无法建立连接,因为目标机器主动拒绝它”。
  • 我已经更新了答案。

标签: redis servicestack twemproxy


【解决方案1】:

我以前没有使用过 twemproxy,但我会说你的服务器列表是错误的。我认为您没有正确使用0.0.0.0

您的服务器需要(用于本地测试)

servers:
 - 127.0.0.1:6379:1
 - 127.0.0.1:6380:1
 - 127.0.0.1:6381:1
 - 127.0.0.1:6382:1

您在listen 命令上使用0.0.0.0 来告诉twemproxy 侦听服务器上所有可用的网络接口。这意味着 twemproxy 将尝试监听:

  • 环回地址127.0.0.1(本地主机),
  • 在您的私有 IP(即 192.168.0.1)上和
  • 在您的公共 IP(即 134.xxx.50.34)上

当您指定服务器时,服务器配置需要知道它应该连接的实际地址。 0.0.0.0 没有意义。它需要一个真正的价值。所以当你开始使用不同的 Redis 机器时,每台机器的私有 IP 如下所示:

servers:
 - 192.168.0.10:6379:1
 - 192.168.0.13:6379:1
 - 192.168.0.14:6379:1
 - 192.168.0.27:6379:1

显然您的 IP 地址会有所不同。您可以使用ifconfig 来确定每台机器上的 IP。如果您的 IP 不是静态分配的,那么使用主机名可能是值得的。


更新:

正如您所说,您仍然遇到问题,我会提出以下建议:

  1. 删除auto_eject_hosts: true。如果您获得了一些连接,那么一段时间后您最终没有连接,这是因为某些事情导致 twemproxy 认为 Redis 主机有问题并拒绝它们。

    因此,最终当您的 ServiceStack 客户端连接到 twemproxy 时,将没有主机可以将请求传递到,并且您会收到错误 No connection could be made because the target machine actively refused it

  2. 您实际上是否有足够的 RAM 来以这种方式对您的本地计算机进行压力测试?您正在运行至少 4 个 Redis 实例,它们需要真实内存来存储值,twemproxy 消耗大量内存来缓冲它传递给 Redis 的请求,这个内存池永远不会释放,see here for more information。您的 ServiceStack 应用程序将消耗内存——在调试模式下更是如此。您可能会打开 Visual Studio 或其他 IDE、压力测试应用程序和操作系统。最重要的是,您可能还没有关闭后台进程和其他应用程序。

    一个好的做法是尽可能在隔离的硬件上运行测试。如果不可能,则必须监视系统以检查基准是否受到某些外部活动的影响。

    您应该阅读有关基准测试的Redis article here

  3. 当您在 localhost 情况下使用它时,请使用 BasicRedisClientManager 而不是 PooledRedisClientManager

【讨论】:

  • 谢谢!有了这些信息,我就能解决问题。
  • @rioja,我知道这是 4 年前的事了,但你还记得哪件事对你有用吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多