我一直在使用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。
答案 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会试着听:
当您指定服务器时,服务器配置需要知道它应连接的实际地址。 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未被静态分配,则可能值得使用主机名。
如你所说,你仍然有问题,我会提出这些建议:
删除auto_eject_hosts: true
。如果你得到了一些连接,那么在一段时间之后你最终没有连接,这是因为有些东西导致twemproxy认为Redis主机有问题并拒绝它们。
因此,当您的ServiceStack客户端连接到twemproxy时,将没有主机将请求传递给您,并且您收到错误No connection could be made because the target machine actively refused it
。
你真的有足够的内存来以这种方式对本地机器进行压力测试吗?你正在运行至少4个Redis实例,它需要真正的内存来存储值,twemproxy消耗大量内存来缓冲它传递给Redis的请求,这个内存池永远不会被释放,see here for more information。您的ServiceStack应用程序将消耗内存 - 在调试模式下更是如此。您可能已经打开了Visual Studio或其他IDE,压力测试应用程序和您的操作系统。最重要的是,可能会有后台进程和其他应用程序尚未关闭。
一个好的做法是尝试尽可能在隔离硬件上运行测试。如果不可能,则必须监视系统以检查基准不受某些外部活动的影响。
您应该阅读有关基准测试的Redis article here。
当您在localhost
情况下使用此功能时,请使用BasicRedisClientManager
而不是PooledRedisClientManager
。