需要使用redis处理大量数据,单台机器,单个redis实例满足不了需求,需要使用redis集群。redis最新stable(2.8.19)版本,还不支持集群。看了一下其他的开源redis集群方案。
twemproxy是Twitter开源的一个redis和memcache代理服务器。搭建完成后,使用redis-benchmark测试,发现性能减少了将近40%。
Codis是豌豆荚开源的redis集群方案,有优点,但是性能比twemproxy还低。
使用zookeeper监控redis节点,并更新保存redis各个节点的信息,实现一致性hash。架构如图所示。
名词解释:
zk-client: 指使用zookeeper的API实现的程序。
zk-servers:指zookeeper servers集群。
zk-hash,是用tornado实现的web服务器,启动后,开启一个线程从zk-servers中获取redis各个节点的信息。GetKeyNode类进行一致性hash计算,根据get_node请求根据传来的key,计算出对应的redis节点。zk-hash也是一个zk-client,可以连接到zk-servers中任意个zk-server,获得相同的redis节点的信息,因此可以开启多个zk-hash,减少单个zk-hash服务的压力。
zk-redis,是zk-client,监控各个redis节点,向zk-servers注册各个redis节点的信息。修改settings.py里的redis_nodes,可以热更新需要监控的redis节点。
zk-hash 和 zk-client的源码:https://github.com/mxins/redis-cluster
关于ZooKeeper Servers,其大概介绍:
ZooKeeper
Ahighlyavailable, scalable, distributed, configuration, consensus, group membership, leader election, naming,
and coordinationservice。
Protocol Guarantees
1)Sequential Consistency - Updates from a client will be applied in the order that they were sent.
2) Atomicity - Updates either succeed or fail. No partial results.
3) Single System Image - Aclient will see the same view of the service regardless ofthe server that it connects
to.
4) Reliability - Once an update has been applied, it will persist from that time forward until a client overwrites
the update.
5) Timeliness - The clients view of the system is guaranteed to be up-to-date within a certain bound. Either system changes will be seen by a client within this bound, or the client will detect a service outage。
以上就是集群的实现,还有许多待完善之处。
关于ZooKeeper Servers集群的搭架,网上很多介绍。