百分点开源分布式内存数据库RedisSentinelClient

2016-02-01 10:02 来源:数邦客
浏览量: 收藏:0 分享

  随着公司业务的不断发展,和数据量的快速增长,单节点的Redis已经不能满足大数据量缓存的需求,实现分布式的缓存系统是个必然趋势。那么如何实现分布式呢?如何保证高可用呢?如何进行动态扩容呢?在Redis3.0诞生之前,业界并无成熟可靠的分布式Redis方案,百分点结合自身的需求,开发了基于客户端实现的分布式缓存系统 RedisSentinelClient,目前该系统已经开源。

  RedisSentinelClient基于Ketama算法在客户端实现了一致性hash,基于Sentinel实现了自动故障切换机制来保证缓存系统的高可用性,并且支持了分布式缓存系统的动态扩容。百分点长期致力于大数据底层技术的研发,秉承开放共享的精神,将此系统开源,以帮助更多的企业和个人开发者减少在分布 式缓存系统上的研发成本。

RedisSentinelClient的优势特性

  一致性hash

  RedisSentinelClient采用一致性hash算法,把Redis实例的name做hash后形成hash环,客户端把key做hash后映射到hash环中对应的机器上。

  优化Ketama算法,实现负载均衡

  RedisSentinelClient优化了Ketama算法,把Redis实例的db数设置为1024映射为1024个db来散列到hash环中,这样可以使vdb均匀的分布在hash环的各个部分,以达到Redis实例的负载均衡。

  自动故障切换

  RedisSentinelClient订阅了Sentinel的消息,当某个Master挂掉,Sentinel会自动检测Master的状态并把某个Slave升级为Master,之后Sentinel会发送相应的消息给客户端,RedisSentinelClient根据Sentinel的消息,会提出连接池对应的无效连接,并对新的Master建立新的连接。这一切对上层用户都是透明的,RedisSentinelClient会进行自动故障切换。

  支持数据Rebalance

  通过RedisSentinelClient存入Redis集群的key会被转换为BusinessID_key,存入指定的Redis实例的db中,在需要Rebalance的时候,只需要查询出Rebalance对应的db中的所有key,对key进行重新存入即可。

  基于hiredis进行的二次开发

  RedisSentinelClient基于C语言的hiredis库进行二次开发,支持原生Redis协议。

  支持BusinessID来区分不同业务的key

  通过RedisSentinelClient存入Redis集群的key会被转换为BusinessID_key,BusinessID在RedisClient类的构造函数中传入,这样每个key中都存储对应的BusinessID,后期可以按照BusinessID进行统计,以控制不同业务线对Redis集群容量的占用。

  支持异步mget

  RedisSentinelClient封装了异步的mget,以提高mget的性能。异步mget会把用户传入的keys按照映射的Redis实例进行分组,分别按照分组后的keys对相应Redis实例进行mget,执行完毕所有分组后的mget后,再把结果进行合并后返回。

  命令接口加入重试机制

  由于Redis实例会关闭一段时间空闲的连接,RedisSentinelClient中加入了重试机制,在命令执行失败后会重试一次,如果连接由于空闲一段时间被服务端关闭,则重试时会重新创建连接,以保证命令执行成功。

  采用连接池来提高并发性能

  RedisSentinelClient对Redis集群中的每个Master实例都建立了一个连接池,接口执行完命令后会把连接放回连接池,连接池维护对Redis实例的长连接,以提高RedisSentinelClient的并发性能。

  RedisSentinelClient的多语言支持

  RedisSentinelClient支持C++、Java、Python。

  设计架构

  RedisSentinelClient采用了三层架构设计, 分别为连接层、哈希层和接口层,另外还有Sentinel监控层来监控Sentinel服务的存活状态。连接层包含同步连接池,异步连接池和Sentinel的连接。哈希层采用优化后的Ketama算法来做一致性hash。接口层为提供给上层用户的对Redis的key相关的操作命令,详见下图。

标签:

责任编辑:admin
在线客服