带着题目进修漫衍式体系之数据分片
可是,同等性hash方法在增进节点的时辰,只能分摊一个已存在节点的压力;同样,在个中一个节点挂掉的时辰,该节点的压力也会被所有转移到下一个节点。我们但愿的是“一方有难,八方增援”,因此必要在增删节点的时辰,已存在的全部节点都能参加相应,到达新的平衡状态。 因此,在现实工程中,一样平常会引入假造节点(virtual node)的观念。即不是将物理节点映射在hash换上,而是将假造节点映射到hash环上。假造节点的数量宏大于物理节点,因此一个物理节点必要认真多个假造节点的真实存储。操纵数据的时辰,先通过hash环找到对应的假造节点,再通过假造节点与物理节点的映射干厦魅找到对应的物理节点。 引入假造节点后的同等性hash必要维护的元数据也会增进:第一,假造节点在hash环上的题目,且假造节点的数量又较量多;第二,假造节点与物理节点的映射相关。但带来的甜头是明明的,当一个物理节点失效是,hash环上多个假造节点失效,对应的压力也就会发散到多个别的的假造节点,究竟上也就是多个别的的物理节点。在增进物理节点的时辰同样云云。 工程中,Dynamo、Cassandra都行使了同等性hash算法,且在较量高的版本中都行使了假造节点的观念。在这些体系中,必要思量综合思量数据漫衍方法和数据副本,当引入数据副本之后,同等性hash方法也必要做响应的调解, 可以介入cassandra的相干文档。 range based 简朴来说,就是凭证要害值分别成差异的区间,每个物理节点认真一个可能多个区间。其拭魅这种方法跟同等性hash有点像,可以领略为物理节点在hash环上的位置是动态变革的。 照旧以上面的数据举例,三个节点的数据区间别离是N0(0, 200], N1(200, 500], N2(500, 1000]。那么数据漫衍如下: ![]() 留意,区间的巨细不是牢靠的,每个数据区间的数据量与区间的巨细也是没有相关的。好比说,一部门数据很是齐集,那么区间巨细应该是较量小的,即以数据量的巨细为片断尺度。在现实工程中,一个节点每每认真多个区间,每个区间成为一个块(chunk、block),每个块有一个阈值,当到达这个阈值之后就会破碎成两个块。这样做的目标在于当有节点插手的时辰,可以快速到达平衡的目标。 不知道读者有没有发明,假如一个节点认真的数据只有一个区间,range based与没有假造节点观念的同等性hash很相同;假如一个节点认真多个区间,range based与有假造节点观念的同等性hash很相同。 range based的元数据打点相对伟大一些,必要记录每个节点的数据区间范畴,出格单个节点对付多个区间的环境。并且,在数据可修改的环境下,假如块举办破碎,那么元数据中的区间信息也必要同步修改。 range based这种数据分片方法应用很是普及,好比MongoDB, PostgreSQL, HDFS 小结: 在这里对三种分片方法(应该是四种,有没有virtual node的同等性hash算两种)举办简朴总结,首要是针对提出的几个题目: 上面的数据动态平衡,值得是上述题目的第4点,即假如某节点数据量变大,可否以及怎样将部门数据迁徙到其他负载较小的节点 分片特性值的选择 上面的三种方法都提到了对数据的分片是基于要害值、特性值的。这个特性值在差异的体系中有差异的叫法,好比MongoDB中的sharding key, Oracle中的Partition Key,不管怎么样,这个特性值的选择都长短常很是重要的。 那么。怎么选择这个特性值呢?《Distributed systems for fun and profit》给出了三言两语的尺度:
或许翻译为:基于最常用的会见模式。会见时包罗对数据的增编削查的。好比上面的列子,我们选择“id”作为分片的依据,那么就是默认对的数据增编削查都是通过“id”字段来举办的。 假如在应用中,大量的数据操纵都是通过这个特性值举办,那么数据分片就能提供两个特另外甜头:
假如大量操纵并没有行使到特性值,那么就很贫困了。好比在本文的例子中,假如用name去查询,而元数据记录的是怎样按照凭证id映射数据位置,那就忧伤了,必要到多有分片都去查一下,然后再做一个聚合! 其它一个题目,假如以单个字段为特性值(如id),那么不管凭证什么漫衍方法,在多条数据拥有沟通的特性值(如id)的环境下,这些数据必然城市漫衍到统一个节点上。在这种环境下有两个题目,一是不能到达节点间数据的平衡,二是假如数据高出了单个节点的存储手段怎么办?要害在于,纵然凭证漫衍式体系办理题目的通例步伐 -- 增进节点 --也是于事无补的。 在这个时辰,单个字段做特性值就不可了,也许得再增进一个字段作为“连系特性值”,相同数据库中的连系索引。好比,数据是用户的操纵日记,可以行使id和时刻戳一路作为hash函数的输入,然后算出特性值;但在这种环境下,假如还想以id为查询要害字来查询,那就得遍历全部节点了。 以是说没有最优的计划,只有最切合应用需求的计划。 下面以MongoDB中的sharding key为例,表明特性值选择的重要性以及对数据操纵的影响。假若稀有据库操纵基本,纵然没有行使过MongoDB,阅读下面的内容应该也没有题目。 以MongoDB sharding key为例 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |