hash算法,就是将一个数据,通过某种hash算法,比如md5,将其转换成一个新值。在密码学里也叫hash摘要,摘要算法。或者叫hash散列。在程序开发设计中,通常是将某一类数据,找出数据的特征值,比如ID,进行hash,然后通过hash和原值绑定映射起来,便于候选的筛选和比较。在分布式存储里,通常可以将数据进行hash算法,映射到不同存储节点里,比如数据库分库,或者其他数据的分片存储。
分布式存储hash算法具体实现过程这里以电商系统订单数据分库存储为例,比如某宝订单数据非常多,特别是双十一等大促活动,订单数据不分片肯定支持不了那么大高并发,假如数据存储在mysql库,单库压力非常大,肯定扛不住,必须分片即分库。可以通过hash算法,比如开发或者选用某个hash函数,将订单ID进行hash出一个整数值,假如准备的有m台数据库进行存储,将hash出来整数值,对m取模,不同的订单,进入不同的库。查询时,由于hash算法特点,同一个key,hash出来的值肯定相同,肯定能路由到正确的库,查询到数据。这样对订单数据进行分库存储,大大提高了订单业务的并发能力。
分布式存储hash算法存在的问题还是以某宝订单通过hash分库存储为例,假如某宝订单量越来越大,已有的m个库,已经无法满足高并发请求了,需要增加数据库分担压力,数据库总数增大到n,但是通过上面的数据hash路由过程,由于m变成了n,将导致已经存储的数据 部分或者全部都无法查询的局面。解决办法,可以将原来的数据重新哈希,这过程太艰难,将使得系统长时间不可用。一致性hash算法可以解决此问题。还有,hash算法肯能会出现数据切斜,某个数据库数据特别多,其他数据库相对较少的问题,这样某个库的压力就较大,影响系统整体的性能和可用性。
一致性hash算法还是以上面某宝电商系统订单数据分库存储为例,假定当前订单库有m个,假设有个环,这m个库映射到环上的m个点,就把环分成m个弧段,也即hash环。当订单要存储时,也是通过hash算法,映射到环上的某个点,从这个点顺时针开始找,找到最近的数据库所在的位置,将此数据存储在这个库上,查询也一样。若对数据库扩容,增加数据库,将这个库插入已有的两个库之间的位置,这样原来数据查询,只有一个弧段的部分数据存在问题,这可以通过新库插入点的数据备份到新库中解决,因为最多备份一个弧段的数据,大大减小了备份时间,提供了系统可用性,并可扩展。但是一致性has算法
带虚拟节点一致性hash算法由于普通一直hash算法,未解决hash倾斜问题,实际上可以增加一层虚拟节点,数据映射到虚拟节点,虚拟节点可以多些,把hash环等分的非常多,其实就是极限思想,这样存在hash切斜的可能性大大降低。还是以某宝为例,订单数据,先hash到虚拟节点,然后再根据虚拟节点映射到具体的数据库节点,进行存储。当然带虚拟节点的一致hash算法,可以解决扩容问题。



