MySQL数据库⽔平分表策略--⼀致性hash
⼀致性hash算法缘起
⼀致性哈希算法在1997年由⿇省理⼯学院提出的⼀种分布式哈希(DHT)实现算法,设计⽬标是为了解决因特⽹中的热点(Hot spot)问题,初衷和CARP⼗分类似。⼀致性哈希修正了CARP使⽤的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应⽤。
⼀致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:
mysql是什么系统
1. 平衡性(Balance):
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利⽤。很多哈希算法都能够满⾜这⼀条件。
web前端培训一般多少钱
网页技术外贸网站源码是什么2. 单调性(Monotonicity):
单调性是指如果已经有⼀些内容通过哈希分派到了相应的缓冲中,⼜有新的缓冲加⼊到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,⽽不会被映射到旧的缓冲集合中的其他缓冲区。
3. 分散性(Spread):
易语言源码怎么编译
在分布式环境中,终端有可能看不到所有的缓冲,⽽是只能看到其中的⼀部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从⽽导致哈希的结果不⼀致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发⽣的严重程度。好的哈希算法应能够尽量避免不⼀致的情况发⽣,也就是尽量降低分散性。
4. 负载(Load):
负载问题实际上是从另⼀个⾓度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于⼀个特定的缓冲区⽽⾔,也可能被不同的⽤户映射为不同的内容。与分散性⼀样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
在分布式集中,对机器的添加删除,或者机器故障后⾃动脱离集这些操作是分布式集管理最基本的功能。如果采⽤常⽤的
hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就⽆法到了,这样严重的违反了单调性原则。
⼀致性hash算法介绍
⼀致性哈希是⼀种特殊的哈希⽅式。传统的哈希⽅式在当节点数⽬发⽣变化时,会引起⼤量的数据迁移,⽽使⽤⼀致性哈希则不会产⽣这种问题。⼀致性哈希最早是⼀个分布式缓存(Distributed Caching)系统的放置算法(现在很热门的Memcached就⽤的是⼀致性哈希)。但是现在它已经被⼴泛应⽤到了其它各个领域。对于任何⼀个哈希函数,其输出值都有⼀个取值范围,我们可以将这个取值区间画成⼀个环,如下图所⽰:
通过哈希函数,每个节点都会被分配到环上的⼀个位置,每个键值也会被映射到环上的⼀个位置。这个键值最终被放置在距离该它的位置最近的,且位置编号⼤于等于该值的节点上⾯,即放置到顺时针
的下⼀个节点上⾯。下图形象的表⽰了这种放置⽅案,其中Node 0上⾯放置Range 0上⾯的数据,以此类推。
由于采⽤的哈希函数通常是与输⼊⽆关的均匀函数,因此当键值和节点都⾮常的多的时候,⼀致性哈希可以达到很好的分布式均匀性。并且
由于特殊的放置规则,⼀致性哈希在节点数据发⽣变动时可以将影响控制在局部区间内,从⽽保证⾮常少的数据迁移(接近理论上的最⼩值)。当增加⼀个节点时,只有这个节点所在的区间内的数据需要被重新划分,如下图中,只需要将range 2上⾯的数据会从node 1中迁移到node 3上⾯。当删除⼀个节点时,只需要将这个节点上⾯的数据迁移到下⼀个节点上⾯,⽐如删除node 3,只把range 2上⾯的数据迁移到node 1上⾯就可以并,⽽其它的数据是不需要迁移变动的。alerting
⼀致性哈希有⾮常⼴泛的应⽤,Key-Value系统,⽂档数据库或者分布式关系数据库都可以使⽤。Amazon的NoSQL系统Dynamo应⽤采⽤的就是⼀种改进的⼀致性哈希算法。在这个系统中⼜引⼊了虚拟节点的概念,使得这个算法的load balance更加的好,并且同时考虑了复制技术。环上的点就变成了虚拟节点,然后再采⽤其它的⽅式将这些虚拟节点映射到实际的物理节点上⾯去。这使得系统有很好的可扩展性和可⽤性。
⼀致性ha sh算法实现:
参考⽂章: