分布式存储系统学习笔记(三)—分布式键值系统(2)—淘宝Tair

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kevin_zhao_zl/article/details/79304172

0.    前言

Tair是淘宝开发的一个分布式键值存储引擎。Tair分为持久化和非持久化两种使用方式:

非持久化的Tair可以看成是一个分布式缓存,持久化的Tair将数据存放与磁盘中。为了解决磁盘损坏导致数据丢失,Tair可以配置数据的备份数目,Tair自动将一份数据的不同备份放到不同的节点上,当有节点发生异常,无法正常提供服务时,其余的节点会继续提供服务。

1.    系统架构

Tair作为一个分布式系统,是由一个中心控制节点和若干个服务节点组成。其中,中心控制节点成为Config Server,服务节点称为Data Server。Config Server负责管理所有的Data Server,维护其状态信息;Data Server对外提供各种数据服务,并以心跳的形式将自身的状况汇报给ConfigServer。Config Server是控制点,而且是单点,目前采用一主一备的形式来保证可靠性,所有的Data Server地位都是等价的。

如上图,客户端首先请求Config Server获取数据所在的DataServer,接着往Data Server发送读写请求,Tair允许将数据存放到多台Data Server,以实现异常容错。

2.    关键问题

a)     数据分布

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

b)     容错

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

c)     数据迁移

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

d)     Config Server

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

e)     Data Server

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

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

3.    总结

Amazon Dynamo采用P2P架构,而在Tair中引入了中心节点Config Server。这种方式很容易处理数据的一致性,不再需要向量时钟,数据回传,Merkle树,冲突处理等复杂的P2P技术。另外中心节点负载很低。整体架构有参考意义

Tair主要的用途在于分布式缓存,持久化存储起步较晚,在实现细节上也有不足。比如Tair持久化存储通过复制技术来提高可靠性,然而这种复制是异步的,因此当有Data Server发生故障时,客户有可能在一定时间内读不到最新的数据,甚至发生最新修改的数据丢失的情况。

猜你喜欢

转载自blog.csdn.net/kevin_zhao_zl/article/details/79304172