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

TFS文件名的结构

TFS的文件名由块号和文件号经过某种对应关系组成,最大长度为18字节。文件名固定以T开始,第二字节为该集群的编号(能够在配置项中指定,取值范围 1~9)。余下的字节由Block ID和File ID经过必定的编码方式获得。文件名由客户端程序进行编码和解码,它映射方式以下图:
淘宝TFS分布式文件系统 <wbr>内部实现


TFS客户程序在读文件的时候经过将文件名转换为BlockID和FileID信息,而后能够在!NameServer取得该块所在!DataServer信息(若是客户端有该Block与!DataServere的缓存,则直接从缓存中取),而后与!DataServer进行读取操做。
html

 

TFS写操做数据流

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

http://code.taobao.org/p/tfs/file/392/process.png

客户端首先向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里面,url

因此TFS的文件复制是基于block的,并且复制出来的block的block id应该是一致的spa

请求文件

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

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

http://code.taobao.org/p/tfs/file/364/tfs_read.png

 

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

 

ZOOM 云视频会议网站:http://www.zoomonline.cn/

相关文章
相关标签/搜索