一、简介
TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统。主要针对海量的非结构化数据。
它构建在Linux机器集群上,可为外部提供高可靠、高并发的存储访问。TFS为淘宝提供了海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求。
1、TFS采用了HA架构:有一个活动节点和备份节点,当活动节点挂了,备份节点会检测到,并顶上。
2、平滑扩容
二、TFS总体结构
一个TFS集群由两个NameServer节点(一主一备),和多个DataServer节点组成,这些服务程序都是作为一个用户级的普通程序运行在Linux虚拟机上的。
在TFS中,将大量的小文件(如图片)合并成一个大文件,这个大文件称为Block(块),每个block块拥有一个集群内唯一的BlockID, 这是由NameServer创建Block时分配的,NameServer负责维护Block和DataServer的关系,Block信息(Block元文件)都存储在NameServer上,而Block实际的数据都存储在DataServer上,每台DataServer服务器上基本都会有很多DataServer进程,他们通常挂载一个独立的磁盘文件目录,以降低磁盘损坏带来的影响。
2.1、NameServer的主要功能
NameServer负责管理维护Block和DataServer相关信息,包括DataServer加入、退出、心跳等信息,Block和DataServer的对应关系建立、解除。
正常情况下,一个block会在DataServer上存在,主NameServer负责Block的创建、删除、复制、均衡、整理,NameServer不负责实际数据的读写,实际数据的读写有DataServer完成。
NameServer主机绑定对外VIP(也就是主机的IP)提供服务,当主宕机后,迅速将VIP绑定到备份NameServer,并将其切换为主机对外提供服务,HeartAgent完成此功能。
2.2、DataServer的主要功能
DataServer主要负责实际数据的存储和读写
在上图中:
1)HeartAgent:负责监听NameServer和Slave NameServer
2)sync data:同步数据NameServer中关于Block信息都存储在内存中,所以快。
APP访问NameServer主机,然后NameServer主机给APP分配DataServer和Block,然后APP在上面读写。
TFS块的大小,可配置,通常块大小为64M。
FTS的设计目标是海量小文件的存储,所以每个块中会存储许多不同的小文件。
DataServer进程会给Block中的每个文件分配一个ID(File ID, 该ID在每个Block中唯一),并将每个文件在Block中的信息存放在Block对应的index文件中。这个index文件一般都会全部load在内存,触发出现DataServer服务器内存不够。
2.3、TFS还支持跨集群同步
可以再创建一个和TFS对等的集群,由主集群负责写入这个集群,和同步数据,这个集群只对外提供读功能,当主集群挂了,这个集群会顶上。
2.4、平滑扩容
由于NameServer和DataServer直接通过心跳机制来通信的,如果集群要扩容,只需要将新的DataServer服务器部署好,然后启动即可。这些DataServer服务器会想NameServer发送心跳。
NameServer的写入策略是给容量小、负载低的DataServer分配写请求。
三、TFS的容错机制
3.1、集群容错
TFS可配置主从集群,会放在不同的机房,主集群提供所有功能,从集群只提供读。主集群挂了,从集群可顶上。
3.2、NameServer容错
NameServer采用了HA结构,一主一备。主NameServer操作会同步到备NameServer。如果主NameServer挂了,备NameServer顶上。
另外,NameServer和DataServer之间有心跳机制。DataServer会将他的Block信息定时发送到NameServer上,NameServer会根据这些信息重建Block和DataServer的关系。
3.3、DataServer容错
TFS采用备份多个BLock来实现DataServer容错,每个Block在集群中存了多份,并且他们分别部署在不同网段的不同DataServer上,一般存3份(可配置)
对于写入请求,必须等待所有的Block备份完成后,才算写入成功。当出现磁盘损坏或DataServer宕机时,TFS会启动复制流程,通过心跳机制获得这些DataServer上BLock的信息,把那备份数小于3的block尽快复制到其他DataServer上去。
3.4、对单个文件的容错
TFS对每个文件会记录校验crc,当客户端访问这个文件的时候发现crc和文件不匹配的时候,会自动切换到一个好的Block上去读取,伺候客户端会修复单个文件损坏的情况
四、TFS的并发机制
对于同一个文件,TFS支持并发的读,但不支持并发的写,其实单个Block也不支持并发的写。
五、TFS文件结构
TFS的文件名由块号和文件号通过某种对应关系组成,最大长度为18字节,文件名固定以T开始,第二字节为该机器的变换(1~9),余下的字节由Block ID和File ID通过一定的编码方式得到,文件名由客户端程序进行编码和解码。
对象存储要考虑的点:
- 单个DataServer/NameServer挂了,怎样保证高可用?
- 存储原理是什么?怎样保证数据不丢失?
- DataServer/NameServer怎样扩容?
- 集群宕机和单个服务宕机怎样处理?
- 磁盘损坏,怎样保证高可用?
- 阿里某个可用区挂了,会怎样?
- 怎样保证的高吞吐?