前端时间粗略的调研了一下redis集群方案,研究的不算深入,还有很多问题没有想明白,暂时把已经调研的清楚的记录下来。
redis集群方案,主要有4种方案client、twemproxy、codis、redis3.0 cluster。
需要考虑的点包括:集群性能、redis ha、扩容、迁移、client友好程度
可以将redis分成两种用途,cache和storage。
cache:这种方案仅是将redis当作cache,其实和memcache基本一样,client端采用一致性hash算法实现,后端storage可以用mysql。
storage:
storage扩容方案
假如扩容前是模N,我们提出的方案:扩容后,对N的倍数进行模运算。
以扩容后模2N为例,具体操作为:
twemproxy是比较老牌的redis proxy方案,有很多公司(Twitter、yahoo等)在使用。twemproxy由于是单个进程的,只能使用单核cpu,如果前端挂keepalive或haproxy等代理,可以为twemproxy做1+1主备。
豌豆荚codis可以使用多核cpu,如果前端挂keepalive或haproxy等代理,可以为codis做1+1主备。
通过presharding技术做数据分片,slot个数为1024个,SlotId = crc32(key) % 1024,引入zookeeper,记录路由信息。
访问顺序为key---->计算slot id---->通过zookeeper记录的slot和machine对应关系(路由信息),找到对应的machine。
redis3.0 版本提供了一套去中心化的分布式解决方案,需要client端的配合,增加了client redirect过程。这套方案,目前没有在生产环境大规模商用,至于有多少坑要填,尚且未知。
命令:
redis-benchmark -h10.10.73.212 -p 6000 -c 200 -d 1024 -r 1024 -q -t set,get
本地:
SET: 99009.90requests per second
GET: 92506.94requests per second
跨网:
SET: 65746.22requests per second
GET: 77160.49requests per second
单进程twemproxy:
SET: 52603.89requests per second
GET: 51282.05requests per second
4核cpu的codis:
SET: 61327.12requests per second
GET: 62644.86requests per second
结论:Start client,性能不错,但是需要client参与的事情太多(包括ha、扩容、迁移),目前没有开源项目供参考,暂时不考虑。
Twemproxy:性能一般,扩容和迁移很痛苦。
Codis:多核cpu,性能要好于twemproxy,同时ha、扩容、迁移对client完全透明。
Redis3.0 cluster:目前并没有哪家公司在生产环境大规模使用,到底有多少坑需要填,还属于未知数。
综合考虑,我认为可以考虑豌豆荚开源的codis,大家有不同意见,可以一起讨论
Codis开源项目:https://github.com/wandoulabs/codis
Twemproxy开源项目:https://github.com/twitter/twemproxy
Codis作者给出的说明:http://chuansong.me/n/1509830
Redis相关:http://redis.io/topics/sentinel
性能测试数据:https://github.com/wandoulabs/codis/issues/309