4.5 解决扩容后数据均匀的问题

我们从上面基于日期key的取模可以解决扩容前后的读写路由问题,但是当集群一下子扩容了多台机器后,我们希望能保证数据均匀分布,让新的数据更地散落到新扩容的机器上存储,减少已有集群机器的存储压力,在Fourinone中是采用日期分组策略去完成的。

我们可以在config.xml配置文件中看到以下关于缓存分组的内容:

  1. <PROPSROW DESC="CACHEGROUP">
  2. <STARTTIME>2010-01-01</STARTTIME>
  3. <GROUP>localhost:2000,localhost:2001@2010-01-01;localhost:2002,localhost:200 3@2010-05-01;localhost:2004,localhost:2005@2010-05-01</GROUP>
  4. </PROPSROW>
  5. <PROPSROW DESC="CACHEGROUP">
  6. <STARTTIME>2018-05-01</STARTTIME>
  7. <GROUP>localhost:2008,localhost:2009@2018-05-01;localhost:2010,localhost:201 1@2018-05-01</GROUP>
  8. </PROPSROW>

上面分成了两个组,“<STARTTIME>2010-01-01</STARTTIME>”代表这组CacheServer是2010-01-01后加入集群的,截至到2018-05-01;“<STARTTIME>2018-05-01</STARTTIME>”代表另一组CacheServer是2018-05-01后加入集群的,这里时间发生在未来只是为了方便举例),我们可以根据集群实际扩容时间进行分组记录。

4.5 解决扩容后数据均匀的问题 - 图1提示

计算的思路是,在判断key时,会先找到key所在的分组,然后在分组内找到取模所在的服务器。我们再对比一下和一致性哈希算法的区别,一致性哈希算法实际上通过服务器的key划分出一个个区间,然后匹配数据key属于哪个区间;而这里通过记录了集群扩容的时间分组信息,再结合key的时间信息做匹配,看归属哪个时间组里的哪台服务器。

日期时间信息冲突怎么办?曾经有使用者问过,取时间信息可能会出现相同的情况。如果数据key的时间和服务器扩容的时间出现冲突怎么办?按日期时间取模方式会不会出问题?

实际上在集群负载的场景下有个特点,就是服务器的扩容时间是粗粒度的,它不需要也不会精确到秒,因为服务器不会每秒都扩容,一般一年、半年才扩容一次;而数据key的时间是个细粒度的,因此很准确就能匹配到属于哪个粗粒度的时间范围,而不会发生冲突。