论文部分内容阅读
作为提升数据中心或者应用的数据访问速度的重要手段,分布式Key-Value系统,如Redis、Memcached等,已经成为了很多数据中心中关键基础设施的重要组成部分,它们的性能将直接影响到很多大规模服务的QoS,因此提升分布式Key-Value系统的性能具有很重大的意义和价值,近些年来也受到了工业界和学术界的广泛关注。分布式Key-Value系统通常采用了比较简单的数据模型,并提供了类似于哈希表的快速查找能力,但这些系统往往在网络处理、并行控制或Key-Value数据处理等方向存在着性能瓶颈,近些年来,无论是工业界和学术界都花费了很大的努力去提高它们的性能。作为目前著名的开源Key-Value系统之一的Redis,已经是目前所有Key-Value系统中使用最多的系统,但Redis在分布式集群方案和网络处理等方面仍存在着不足,导致Redis性能的损失。鉴于此,本文主要的创新工作如下:(1)本文在Redis的基础上,研究分析了Redis集群常用的数据分片方案的不足,提出了一个基于Zoo Keeper的支持集群动态扩缩容和数据自动迁移的数据分片优化方案。方案通过Zoo Keeper提供可靠的一致性服务统一维护集群的数据分片信息,去掉了现有主流方案所采用的代理层,并对客户端进行优化,得到一个吞吐量更高,延迟更低的Redis集群方案。(2)在基于ZooKeeper的数据分片优化方案的基础上,本文进一步研究了分布式Redis集群的高可用方案,结合数据分片方案,提出了一个基于ZooKeeper和Redis-Sentinel的分布式Redis集群高可用方案。方案利用Redis的复制能力,启动多个备节点对主节点进行复制,并用Redis-Sentinel集群监控Redis主备节点的状态,当某个主节点发生故障下线的时候,Redis-Sentinel会从其所有备节点中选择一个作为新的主节点,并通过ZooKeeper将切换信息通知给客户端,从而实现集群的故障自动迁移,保证集群的可用性。(3)针对分布式Key-Value系统需要处理大量小数据请求的特点,本文还研究分析了Redis网络I/O模型在处理大量小数据请求的时候存在的不足,并提出和实现了分布式Redis集群下的Pipeline等批量操作来进一步优化Redis集群的查询性能。Redis所采用的传统的网络I/O模型,在处理大量小数据包的时候存在着大量的系统调用、上下文切换和中断等开销,通过Pipeline等批量操作命令,可以让Redis客户端向Redis集群一次发送多条命令,从而降低Redis集群的网络开销,进一步提高其性能。最后,本文通过测试并与目前主流的基于代理的Redis集群方案进行性能对比,验证了本文提出的优化方案不仅保证了集群的高可用性,而且支持集群动态扩缩容和数据自动迁移。同时,集群的性能也有了很大的提升,集群的吞吐量相比目前主流的分布式Redis集群方案最多有了200%左右的提升,而延迟相比基于代理的主流方案则降低了一半以上。