在 分布式缓存系统TAIR代码分析<一>中,介绍了configserver初始化后的工作状况。本文将详细介绍configserver如何创建对照表。
2.5 创建对照表策略:
2.5.1 概述
在Tair系统中,对照表是一个非常重要的概念。Tair使用改进后的一致性hash算法来确保数据在数据服务器上趋于均匀分布,同时获取良好的可扩展性。Tair将数据按bucket为单位,存放在存储节点上,每一个节点可以存储多个bucket.对于每一个bucket而言,可能会存在多个备份。若在多备份的情况下,其中一个bucket称为master bucket, 其他的称为slave bucket. 客户端会拿到一张表,该表记录了每一个bucket存储的节点的地址。那么,对于一个<key, value>而言,通过对hash(key)%count_of_bucket运算,获取具体的bucket, 通过表,查找backet所在的地址。接下来的事情,就是客户端将这个KV存储到这个地址对应的节点中对应的bucket中。而这个表,就称为对照表。
实际上,对照表建立了Key与其存储位置之间的映射。当作为存储数据的节点发生变化的时候,就必须重建对照表。
在tair的配置文件中,有对照表创建策略的配置项,即_build_strategy 。configserver根据_build_strategy的取值不同,而执行不同的创建对照表策略。目前提供两种策略. 配置为1 则是负载均衡优先, 分配的时候尽量让各个 data server 的负载均衡. 配置为 2 的时候, 是位置安全优先, 会尽量将一份数据的不同备份分配到不同机架的机器上. 配置为3的时候,如果服务器分布在多个机器上,那么会优先使用位置安全优先,即策略2. 如果服务器只在一个机架上,那么退化成策略1,只按负载分布[1].
实际上,Tair提供了2中构建对照表的方法。对于每一种方法,构建对照表的流程是相同的。对于不同构建策略,每一个节点上分配的bucket数量的分配方式是不同的。这一点很容易理解。另外,对于一个给定的buket, 为其选择一个合适的存储节点的策略也是不同的。例如,考虑位置安全优先的对照表构建策略中,buket和其备份bucket应该尽可能分布在不同机房。
本文先详细叙述在负载均衡优先的构建对照表策略下,configserver如何构建对照表。然后,在叙述位置安全优先构建策略的不同之处。
2.5.2 负载均衡优先策略
在该策略下,构建出的对照表期望达到的效果——使得每一个节点分配的bucket数量尽可能的均衡。假设共有B个bucket, 有N个节点, 那么在负载均衡优先的策略下,每个节点最少负责的bucket的个数为:B/N;若B%N 不为0,那么将有B%N个节点将负载B/N+1个bucket。若B%N为0,那就再好不过了,每个节点分配了相同数量的bucket。由此可见,在这种模式下,任意两个节点负责的bucket数量至多相差1。
configserver通过以下步骤来构建对照表:
1)根据当前对照表,统计出每一个alive节点上存储的bucket数量。假设有节点A,B,C和D, 则形成数据如下的map:
| A , Xa |
| B, Xb |
| C, Xc |