javazx 发表于 2017-3-3 20:41:09

《大规模分布式存储系统》 第5章 分布式键值系统【5.2】

5.2 淘宝Tair
Tair是淘宝开发的一个分布式键/值存储引擎。Tair分为持久化和非持久化两种使
用方式:非持久化的Tair可以看成是一个分布式缓存,持久化的Tair将数据存放于磁
盘中。为了解决磁盘损坏导致数据丢失,Tair可以配置数据的备份数目,Tair自动将
一份数据的不同备份放到不同的节点上,当有节点发生异常,无法正常提供服务的
时候,其余的节点会继续提供服务。
5.2.1 系统架构
Tair作为一个分布式系统,是由一个中心控制节点和若干个服务节点组成。其
中,中心控制节点称为Config Server,服务节点称为Data Server。Config Server负责
管理所有的Data Server,维护其状态信息;Data Server对外提供各种数据服务,并以
心跳的形式将自身状况汇报给Config Server。Config Server是控制点,而且是单点,
目前采用一主一备的形式来保证可靠性,所有的Data Server地位都是等价的。
图5-5是Tair的系统架构图。客户端首先请求Config Server获取数据所在的Data
Server,接着往Data Server发送读写请求。Tair允许将数据存放到多台Data Server,以
实现异常容错。
图 5-5 Tair系统架构
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-6 Data Server内部结构
Tair存储引擎有一个抽象层,只要满足存储引擎需要的接口,就可以很方便地替
换Tair底层的存储引擎。Tair默认包含两个存储引擎:Mdb和Fdb,此外,还支持
Berkerly DB、Tokyo Cabinet、InnoDB、Leveldb等各种存储引擎。
5.2.3 讨论
Amazon Dynamo采用P2P架构,而在Tair中引入了中心节点Config Server。这种方
式很容易处理数据的一致性,不再需要向量时钟、数据回传、Merkle树、冲突处理
等复杂的P2P技术。另外,中心节点的负载很低。笔者认为,分布式键值系统的整体
架构应该参考Tair,而不是Dynamo。
当然,Tair最主要的用途在于分布式缓存,持久化存储起步比较晚,在实现细节
上也有一些不尽如人意的地方。例如,Tair持久化存储通过复制技术来提高可靠性,
然而,这种复制是异步的。因此,当有Data Server发生故障时,客户有可能在一定时
间内读不到最新的数据,甚至发生最新修改的数据丢失的情况。


页: [1]
查看完整版本: 《大规模分布式存储系统》 第5章 分布式键值系统【5.2】