4.4 解决任意扩容的问题
我们从上面的一致性哈希算法可以看到,数据服务器的key实际上定义了一个区间界值,然后数据key去比对这个界值,然后决定导向哪台服务器。那么定义这个区间界值的不一定是哈希值,也可以是其他信息。
Fourinone通过生成含有日期信息的key,并对集群扩容增加日期配置,通过key和集群配置的日期匹配计算出覆盖范围的机器数,再用取模的方式准确得到负载的计算机,对于集群的任意数量的扩容都不会受到影响。
原理如图4-15所示。
图4-15 日期key取模
算法过程如下:
1)首先生成的key是包含日期信息的,根据该key的时间点去计算覆盖集群计算机的范围。
2)集群的计算机有个统一的配置表,它包括每台计算机的IP、端口等信息,除此外,还包括每台计算机加入集群的日期信息。当一个包括日期信息的key路由时,会计算集群中比key包含日期小的范围,然后得到这个范围的计算机数量。对于一个新生成的key,它的时间是当前时间,也就是会覆盖集群中所有的计算机,因为计算机加入集群的时间是一个过去时。
在Fourinone的实现中,通过config.xml中的cache部分配置可以看到:
- <GROUP>
- localhost:2000,localhost:2001@2010-01-01;localhost:2002,localhost:2003@2010-05-01;localhost:2004,localhost:2005@2010-05-01
- </GROUP>
这里定义了3组CacheServer,用“;”间隔分开:
- localhost:2000,localhost:2001@2010-01-01;
- localhost:2002,localhost:2003@2010-05-01;
- localhost:2004,localhost:2005@2010-05-01
上面的“localhost:2000,localhost:2001”被“@”间隔开,代表一组主备两台的CacheServer,“@”后的2010-01-01代表这组CacheServer加入集群的时间,key路由时会将自己生成的时间跟CacheServer加入集群的时间做对比,找到属于这个时间范围的所有CacheServer。
然后key再对这个范围的计算机数量取余,就得到集群中对应序号的计算机,也就是路由目标。