5.2.2 关键问题

(1)数据分布

根据数据的主键计算哈希值后,分布到Q个桶中,桶是负载均衡和数据迁移的基本单位。Config Server按照一定的策略把每个桶指派到不同的Data Server上。因为数据按照主键计算哈希值,所以可以认为每个桶中的数据基本是平衡的,只要保证桶分布的均衡性,就能够保证数据分布的均衡性。根据Dynamo论文中的实验结论,Q取值需要远大于集群的物理机器数,例如Q取值10240。

(2)容错

当某台Data Server故障不可用时,Config Server能够检测到。每个哈希桶在Tair中存储多个副本,如果是备副本,那么Config Server会重新为其指定一台Data Server,如果是持久化存储,还将复制数据到新的Data Server上。如果是主副本,那么ConfigServer首先将某个正常的备副本提升为主副本,对外提供服务。接着,再选择另外一台Data Server增加一个备副本,确保数据的备份数。

(3)数据迁移

机器加入或者负载不均衡可能导致桶迁移,迁移的过程中需要保证对外服务。当迁移发生时,假设Data Server A要把桶3、4、5迁移到Data Server B。迁移完成前,客户端的路由表没有变化,客户端对3、4、5的访问请求都会路由到A。现在假设3还没开始迁移,4正在迁移中,5已经迁移完成。那么如果对3访问,A直接服务;如果对5访问,A会把请求转发给B,并且将B的返回结果返回给用户;如果对4访问,由A处理,同时如果是对4的修改操作,会记录修改日志,等到桶4迁移完成时,还要把修改日志发送到B,在B上应用这些修改操作,直到A和B之间数据完全一致迁移才真正完成。

(4)Config Server

客户端缓存路由表,大多数情况下,客户端不需要访问Config Server,Config Server宕机也不影响客户端正常访问。每次路由的变更,Config Server都会将新的配置信息推给Data Server。在客户端访问Data Server的时候,会发送客户端缓存的路由表的版本号。如果Data Server发现客户端的版本号过旧,则会通知客户端去Config Server获取一份新的路由表。如果客户端访问某台Data Server发生了不可达的情况(该Data Server可能宕机了),客户端会主动去Config Server获取新的路由表。

(5)Data Server

Data Server负责数据的存储,并根据Config Server的要求完成数据的复制和迁移工作。Data Server具备抽象的存储引擎层,可以很方便地添加新存储引擎。Data Server还有一个插件容器,可以动态加载/卸载插件,如图5-6所示。

5.2.2 关键问题 - 图1

图 5-6 Data Server内部结构

Tair存储引擎有一个抽象层,只要满足存储引擎需要的接口,就可以很方便地替换Tair底层的存储引擎。Tair默认包含两个存储引擎:Mdb和Fdb,此外,还支持Berkerly DB、Tokyo Cabinet、InnoDB、Leveldb等各种存储引擎。