redis的数据量在内存高过50G时系统出现了明显的瓶颈。为了解决这个问题,笔者找了些相关的资料,发现了这个开源软件。功能很强大,包含了last.fm的ketama的一致性hash算法,对于笔者目前的需求,该软件已经能够完全满足。
软件的源代码已经在git上面开源:https://github.com/twitter/twemproxy
下载和安装的过程就不再赘述,在README中有详细的叙述。这里主要说一说如何配置一个自己的集群。
安装完成之后,修改配置文件。
alpha: listen: 127.0.0.1:22121 hash: fnv1a_64 distribution: ketama auto_eject_hosts: true redis: true server_retry_timeout: 2000 server_failure_limit: 1 servers: - 127.0.0.1:8604:1 - 127.0.0.1:8605:1 - 127.0.0.1:8606:1 - 127.0.0.1:8607:1
启动完成redis之后,启动代理服务。
$ nutcracker -d
$ ./redis-cli -p 22121 set abc abc
$ ./redis-cli -p 22121 get abc
简单测试之后结果正常。
为了简单测试proxy的性能,使用脚本执行批量写入的操作:
#!/usr/bin/perl # Program: # # History: # Author: luyao([email protected]) # Date: 2013/02/22 17:09:30 use strict; my @port = (8604, 8605, 8606, 8607); my $pre = shift; for (my $i = 0; $i< 1000;$i++) { my $num = rand; `./redis-cli -p 22121 set $pre$i $i`; }
$for i in a b c d e f g h i j k l m n o p q r s t u v w x y z;do sh -c "time perl test.pl $i&";done
real 0m3.315s user 0m0.457s sys 0m1.473s real 0m3.391s user 0m0.458s sys 0m1.512s real 0m3.433s user 0m0.459s sys 0m1.455s real 0m3.475s user 0m0.449s sys 0m1.465s real 0m3.442s user 0m0.472s sys 0m1.465s real 0m3.483s user 0m0.471s sys 0m1.421s real 0m3.487s user 0m0.467s sys 0m1.459s real 0m3.440s user 0m0.480s sys 0m1.425s real 0m3.498s user 0m0.452s sys 0m1.428s real 0m3.403s user 0m0.445s sys 0m1.411s real 0m3.505s user 0m0.479s sys 0m1.416s real 0m3.495s user 0m0.461s sys 0m1.483s real 0m3.424s user 0m0.465s sys 0m1.422s real 0m3.477s user 0m0.496s sys 0m1.403s real 0m3.521s user 0m0.454s sys 0m1.474s real 0m3.494s user 0m0.491s sys 0m1.399s real 0m3.550s user 0m0.446s sys 0m1.435s real 0m3.539s user 0m0.445s sys 0m1.442s real 0m3.527s user 0m0.501s sys 0m1.447s real 0m3.477s user 0m0.468s sys 0m1.442s real 0m3.569s user 0m0.449s sys 0m1.405s real 0m3.512s user 0m0.462s sys 0m1.428s real 0m3.539s user 0m0.472s sys 0m1.388s real 0m3.584s user 0m0.483s sys 0m1.396s real 0m3.529s user 0m0.468s sys 0m1.396s real 0m3.554s user 0m0.459s sys 0m1.398s
最后,查看一下key的分布情况:
8604:db0:keys=7760,expires=0
8605:db0:keys=6010,expires=0
8606:db0:keys=6545,expires=0
8607:db0:keys=5685,expires=0
key的分布基本ok,考虑到key都比较简单,而且可能相似"a-z+0-999",因此,该分布表现仍可以接受。