Cassandra 分布式hashtable(DHT) 和 Locator
DHT是什么?
DHT(Distributed Hash Table,分布式哈希表)类似Tracker的根据种子特征码返回种子信息的网络.DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法。为什么分布式存储需要DHT呢?
举个例子,有10亿条数据,分别存储在10台不同的NOSql服务器中,那么用户请求一个Key的时候如何找到相应的Value呢?最笨的方法就是在每台服务器上都做查询,最后得出一条用户查询的value。但这无形中增加了服务器的压力。如果只用一台服务器去找是不是更好呢?当然如此。DHT就是它的一种解决方案,DHT是通过将key进行散列(Hash)后,快速定位到定位到其所在的如服务器的做法;在 DHT 里面,负责存储的节点以及数据对象都被分配一个 token。token 只能在一定的范围内取值,比如说如果用 MD5 作为 token 的话,那么取值范围就是 [0, 2^128-1]。存储节点以及对象根据 token 的大小排列成一个环,即最大的 token 后面紧跟着最小的 token,比如对 MD5 而言,token 2^128-1 的下一个 token 就是 0。下面我们对Cassandra进行分析。
?
Cassandra 使用以下算法来分布数据
首先,每个存储节点被分配一个随机的 token(涉及数据分区策略),该 token 代表它在 DHT 环上的位置;
然后,用户为数据对象指定一个 key(即 row-key),Cassandra 根据这个 key 计算一个哈希值作为 token,再根据 token 确定对象在 DHT 环上的位置;
最后,该数据对象由环上拥有比该对象的 token 大的最小的 token 的节点来负责存储;
根据用户在配置时指定的备份策略(涉及网络拓扑策略),将该数据对象备份到另外的 N-1 个节点上。网络中总共存在该对象的 N 个副本。
因此,每个存储节点最起码需要负责存储在环上位于它与它的前一个存储节点之间的那些数据对象,而且这些对象都会被备份到相同的节点上。我们把 DHT 环上任何两点之间的区域称为一个 range,那么每个存储节点需要存储它与前一个存储节点之间的 range。
因为 Cassandra 以 range 为单位进行备份,所以每个节点需要定期检查与它保存了相同的 range 的节点,看是否有不一致的情况,这涉及到数据一致性策略。
另外,Cassandra的一个特点是写速度大于读速度,这都归功于它的存储策略。
本文总结了Cassandra中使用的各种策略,包括数据分局策略,数据备份策略,网络拓扑策略,数据一致性策略和存储策略等。
?
这一部分的代码在org.apache.cassandra.dht包下。
具体代码分析日后更新。