分布式存储系统

时间:2022-12-11 21:49:10

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二 数据分片 

数据分片--数据在多台机器上存储的技术,使得每台机器的数据量、请求量相似,并且扩容方便。

常见的数据分片算法:

1  将数据按照区域划分   比如整形按照大小 。优点是简单  缺点是数据量、请求量可能相差很多,扩容也只能倍数扩

2  哈希  优点数据量、请求量相似 缺点 扩容不方便

3  检索表  缺点 key与机器的映射并未实现 这个方案算是半成品。

4  一致性哈希  最好的数据分片方案

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一致性哈希:

     单调性:单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。即 数据迁移只能从旧到新,不能从旧到旧

 4.1 环形hash 空间  2^32 -1 

   4.2  object -> hash

   4.3  cache->hash

 4.4 在这个环形空间中,如果沿着顺时针方向从对象的 key 值出发,直到遇见一个 cache ,那么就将该对象存储在这个 cache 上,因为对象和 cache  hash 值是固定的,因此这个 cache 必然是唯一和确定的。这样不就找到了对象和 cache 的映射方法了吗?!

虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列

------------------------------------------------------------------------------------------------------------------------------

Jump Consistent Hash 算法

jump consistent hash是一种一致性哈希算法, 此算法零内存消耗均匀分配快速,并且只有5行代码

此算法适合使用在分shard的分布式存储系统中 。

此算法的作者是 Google 的 John Lamping 和 Eric Veach,论文原文在 http://arxiv.org/ftp/arxiv/papers/1406/1406.2294.pdf

完整代码:

JumpConsistentHash
1
2
3
4
5
6
7
8
9
int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) {//random. seed(key) ;  int64_t b = -1, j = 0; while (j < num_buckets) { b = j; //double r=random.next(); // 0<r<1.0 j = floor( (b+1) /r);  key = key * 2862933555777941757ULL + 1; //伪随机算法 j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1)); } return b;}

输入是一个64位的key,和桶的数量(一般对应服务器的数量),输出是一个桶的编号。