如果有3台服务器作为分布式存储的负载均衡节点(我们这里不谈备份),三台机子各村一部分数据,理想情况下,各存1/3

 

存入数据的时候,数据取hash,然后模3,得到0-2,分别对应三台服务器。

查询的时候,同样计算出hash,取模,取对应的机子上取数据。

 

如果三台机子快满了,需要扩容怎么办?如果数据分布不均匀,我们需要在指定地方加入一台机子来分档压力怎么办?

 

明显,任意节点的变动都需要全量数据的重新分配,重新计算hash,必须停服。

 

 

怎么解决这个问题?

  第一种方式,即便我只有3 台服务器,我算hash 的时候依旧取模3W,然后,0-1W分一台,1-2W分一台,2-3W分一台 (一致性哈希算法)

    扩容的时候,我把0-5000分给新的机器,5000-1W给原来的机器。加入这台机子以后大部分服务是可用的。只有0-5000的算计短时间内无法查询和写入,只有等加入的机制同步完成0-5000的数据才能使用,影响小了很多。

  第二种方式:算出来的哈希我在做一个区间映射表,1000范围一份,共计30 份,然后分别按照三台服务器的性能,指定每一份应该存储到那台计算机上,比如A服务器比较牛逼,我吧其中的任意15 份给它,B一般给10 份,C很差给5份。后面如果要扩容也是只需要在  映射表里里面吧指定服务器的压力分给新的服务器就行了,也是部分服务暂停就行了。