码迷,mamicode.com
首页 > Web开发 > 详细

淘宝TFS分布式文件系统内部实现

时间:2015-07-07 19:04:59      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

TFS文件名的结构

TFS的文件名由块号和文件号通过某种对应关系组成,最大长度为18字节。文件名固定以T开始,第二字节为该集群的编号(可以在配置项中指定,取值范围 1~9)。余下的字节由Block ID和File ID通过一定的编码方式得到。文件名由客户端程序进行编码和解码,它映射方式如下图:
技术分享


TFS客户程序在读文件的时候通过将文件名转换为BlockID和FileID信息,然后可以在!NameServer取得该块所在!DataServer信息(如果客户端有该Block与!DataServere的缓存,则直接从缓存中取),然后与!DataServer进行读取操作。

 

TFS写操作数据流

TFS系统中,nameserver会保证一个文件有多个副本存储于不同的dataserver上以保证冗余。当由于dataserver服务器宕机或由于其他原因退出系统导致某些文件副本数量下降时,nameserver将会调度新的dataserver节点存储文件备份。同样为了保证数据一致性,当写入一个文件时,只有所有参与的dataserver均写入成功时,该操作才算成功。TFS的写操作数据流图如下所示:

技术分享

客户端首先向nameserver发起写请求,nameserver需要根据dataserver上的可写块,容量和负载加权平均来选择一个可写的block。并且在该block所在的多个dataserver中选择一个作为写入的master,这个选择过程也需要根据dataserver的负载以及当前作为master的次数来计算,使得每个dataserver作为master的机会均等。master一段选定,除非master宕机,不会更换,一旦master宕机,需要在剩余的dataserver中选择新的master。返回一个dataserver列表。
客户端向master dataserver开始数据写入操作。master server将数据传输为其他的dataserver节点,只有当所有dataserver节点写入均成功时,master server才会向nameserver和客户端返回操作成功的信息。

 

获得Block ID和File ID

根据TFS文件名解析出Block ID和block中的File ID.

获取dataserver地址

nameserver发送查询请求得到Block ID所在的dataserver地址。

由于nameserver中维护了block和dataserver的对应关系,所以nameserver能够提供相应的信息。

Note: 由于TFS是把大量小文件放在一个block里面,

所以TFS的文件复制是基于block的,而且复制出来的block的block id应该是一致的

请求文件

通过发送Block_ID、File_ID和offset为参数的读请求到对应的dataserver,得到文件内容。

dataserver会根据本地记录的信息来得到File ID所在block的偏移量,从而读取到正确的文件内容.

技术分享

 

TFS 在2.0版本增加了一个server, 叫做 rcserver. 这个 server 主要是为了淘宝内部管理使用 TFS 的各个应用. 我们给每个应用分配一个唯一的 AppKey. TFS 客户端使用这个 AppKey 登录到 rcserver, 取得自己应该访问的 TFS 集群信息. 客户端还会定期把自己的一些统计值发送给 rcserver. 具体信息可以参看源码中 doc 目录下的关于 rcserve 的文档.

淘宝TFS分布式文件系统内部实现

标签:

原文地址:http://www.cnblogs.com/gw811/p/4627673.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!