带着题目进修漫衍式体系之数据分片
副问题[/!--empirenews.page--]
正文 在前文中,提出了漫衍式体系(尤其是漫衍式存储体系)必要办理的两个最首要的题目,即数据分片和数据冗余,下面这个图片(来历)形象活跃的表明白其观念和区别: ![]() 个中数据即A、B属于数据分片,原始数据被拆分成两个正交子集漫衍在两个节点上。而数据集C属于数据冗余,统一份完备的数据在两个节点都有存储。虽然,在现实的漫衍式体系中,数据分片和数据冗余一样平常都是共存的。 本文首要接头数据分片的三个题目:
所谓漫衍式体系,就是操作多个独立的计较机来办理单个节点(计较机)无法处理赏罚的存储、计较题目,这长短常典范的分而治之的头脑。每个节点只认真原题目(即整个体系必要完成的使命)的一个子集,那么原题目怎样拆分到多个节点?在漫衍式存储体系中,使命的拆分即数据分片。 作甚数据分片(segment,fragment, shard, partition),就是凭证必然的法则,将数据集分别成彼此独立、正交的数据子集,然后将数据子集漫衍到差异的节点上。留意,这里提到,数据分片必要凭证必然的法则,差异的漫衍式应用有差异的法则,但都遵循同样的原则:凭证最首要、最频仍行使的会见方法来分片。 三种数据分片方法 起首先容三种分片方法:hash方法,同等性hash(consistent hash),凭证数据范畴(range based)。对付任何方法,都必要思索以下几个题目:
为了后头说明差异的数据分片方法,假设有三个物理节点,编号为N0, N1, N2;有以下几笔记录:
hash方法: 哈希表(散列表)是最为常见的数据布局,按照记录(可能工具)的要害值将记录映射到表中的一个槽(slot),便于快速会见。绝大大都编程说话都有对hash表的支持,如python中的dict, C++中的map,Java中的Hashtable, Lua中的table等等。在哈希表中,最为简朴的散列函数是 mod N(N为表的巨细)。即起首将要害值计较出hash值(这里是一个整型),通过对N取余,余数即在表中的位置。 数据分片的hash方法也是这个头脑,即凭证数据的某一特性(key)来计较哈希值,并将哈希值与体系中的节点成立映射相关,从而将哈希值差异的数据漫衍到差异的节点上。 我们选择id作为数据分片的key,那么各个节点认真的数据如下: ![]() 由此可以看到,凭证hash方法做数据分片,映射相关很是简朴;必要打点的元数据也很是之少,只必要记录节点的数量以及hash方法就行了。 但hash方法的弱点也很是明明:当插手可能删除一个节点的时辰,大量的数据必要移动。好比在这里增进一个节点N3,因此hash方法变为了mod 4,数据的迁徙如下: ![]() 在这种方法下,是不满意单调性(Monotonicity)的:假如已经有一些内容通过哈希分配到了响应的缓冲中,又有新的缓冲插手到体系中。哈希的功效应可以或许担保原有已分派的内容可以被映射到原有的可能新的缓冲中去,而不会被映射到旧的缓冲荟萃中的其他缓冲区。 在工程中,为了镌汰迁徙的数据量,节点的数量可以成倍增添,这样概率上来讲至多有50%的数据迁徙。 hash方法尚有一个弱点,即很难办理数据不平衡的题目。有两种环境:原始数据的特性值漫衍不匀称,导致大量的数据齐集到一个物理节点上;第二,对付可修改的记录数据,单笔记录的数据变大。在这两种环境下,城市导致节点之间的负载不平衡,并且在hash方法下很难办理。 同等性hash 同等性hash是将数据凭证特性值映射到一个首尾相接的hash环上,同时也将节点(凭证IP地点可能呆板名hash)映射到这个环上。对付数据,从数据在环上的位置开始,顺时针找到的第一个节点即为数据的存储节点。这里如故以上述的数据为例,假设id的范畴为[0, 1000],N0, N1, N2在环上的位置别离是100, 400, 800,那么hash环表示图与数据的漫衍如下: ![]() ![]() 可以看到对比于上述的hash方法,同等性hash方法必要维护的元数据特殊包括了节点在环上的位置,但这个数据量也长短常小的。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |