由于公司将来的项目可能需要用到Amazon的DynamoDB数据库,所以,最近想花时间好好研究研究下DynamoDB, 而Amazon在发布DynamoDB前,曾向SISO提交了一篇Dynamo论文,而DynamoDB就是基于这篇论文而实现的,所以,为了对Dynamo有个更深刻的了解,我决定好好看看这篇论文,了解了解论文里的相关算法。
这篇博客,就是基于我对这篇论文的理解,描述了论文中的算法之一,即Dynamo数据划分算法。
先解释解释数据划分的概念,大家也许都知道,DynamoDB是一个分布式Nosql数据库,既然是分布式,那么要发挥它的威力,肯定要使用集群(多台机器搭建)了,既然是使用集群,我们肯定要考虑如何将数据合理的、高效的存放到各台机器上,才能保证各台机器负载的均衡性等问题。而数据划分算法就是一种描述数据如何被合理的划分到集群中各台机器上的算法,它也是目前AmazonDB中采用的一种数据划分算法。
在详细描述Dynamo数据划分算法前,我们先了解一些常见的分布式数据划分算法:
算法一:在一个分布式环境中,假如有N台机器, 最常见的,也是最简单的数据划分算法就是,我们根据数据的Key(数据的一个唯一标识)的哈希值,进行取模运算,根据计算结果决定将该数据存放在哪一台机器上。 例:假如 N=4, 数据A的key的Hash值为 11,则数据A存放在标识为 3(11%4=3)的机器上。
存在的问题:在分布式系统中,横向扩展、容错性是很重要的指标,也就是说,在分布式系统中,可以根据系统的业务量随意的从集群中添加或移除机器。同时,机器出现异常也是常有的事,好的分布式系统必须保证,集群中的某台机器出现故障不会影响到整个系统的运行。 假如,由于业务量增大了,你需要往集群中增加一台或多台机器,以支撑业务的增张,此时由于机器N的变化,为了保证能采用方法顺利的读取到先