使用ServiceStack Redis和Twemproxy

时间:2014-01-25 02:33:14

标签: redis servicestack twemproxy

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

这导致轻负载测试(100个用户)通过ServiceStack连接到Redis时出现问题。我已经尝试了原始的PooledRedisClientManager和BasicRedisClientManager,两者都给出错误 无法建立连接,因为目标计算机主动拒绝它

我需要做些什么来让这两个人在一起玩得很好吗?这是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。

1 个答案:

答案 0 :(得分:2)

之前我没有使用过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

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

  • 环回地址127.0.0.1(localhost),
  • 在您的私人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. 你真的有足够的内存来以这种方式对本地机器进行压力测试吗?你正在运行至少4个Redis实例,它需要真正的内存来存储值,twemproxy消耗大量内存来缓冲它传递给Redis的请求,这个内存池永远不会被释放,see here for more information。您的ServiceStack应用程序将消耗内存 - 在调试模式下更是如此。您可能已经打开了Visual Studio或其他IDE,压力测试应用程序和您的操作系统。最重要的是,可能会有后台进程和其他应用程序尚未关闭。

      

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

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

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