一个 TFS 集群由两个 NameServer 节点(一主一备)和多个 DataServer 节点组成, NameServer 通过心跳对 DataSrver 的状态进行监测。NameServer 相当于 GFS 中的 Master,DataServer 相当于 GFS 中的 ChunkServer 。NameServer 区分为主 NameServer 和备 NameServer ,只有主 NameServer 提供服务,当主 NameServer 出现故障时,能够被心跳守护进程检测到,并将服务切换到备 NameServer 。每个 DataServer 上会运行多个 dsp 进程,一个 dsp 对应一个挂载点,这个挂载点一般对应一个独立磁盘,从而管理多块磁盘。
在 TFS 中,将大量的小文件(实际数据文件)合并成一个大文件(这一点比 HDFS 有优化和改进),这个大文件称为块( Block ),每个 Block 拥有在集群内唯一的编号(块 ID ),通过<块 ID ,块内偏移>可以唯一确定一个文件。TFS 中 Block 的实际数据都存储在 DataServer 中,大小一般为 64MB ,默认存储三份,相当于 GFS 中的 chunk 。应用客户端是 TFS 提供给应用程序的访问接口,应用客户端不缓存文件数据,只缓存 NameServer 的元数据。
3、 Fackbook Haystack 文件系统
到 2014 年, Facebook 大概有超 4000 亿张图片,总大小为 30PB ,通过计算可以得出每张照片的平均大小为 30PB/260GB ,约为 100KB 。用户每周新增照片数为 10 亿(总大小为 60TB ),平均每秒新增的照片数为 109/7/40000 (按每天 40000s 计),约为每秒 3800 次写操作,读操作峰值可以达到每秒百万次。
Facebook 相册后端早期采用基于 NAS 的存储,通过 NFS 挂载 NAS 中的照片文件来提供服务。后来出于性能和成本考虑,自主研发了 Facebook Haystack 存储相册数据。
和 TFS 类似, Facebook Haystack 新架构主要解决图片存取 IO 次数过多的文件,主要的思路是多个逻辑文件共享同一个物理文件。Haystack 架构及读请求处理流程图如下

Haystack 架构主要有三个部分:Haystack Directory , Haystack Store 以及 Haystack Cache 。Haystack Store 是物理存储节点,以物理卷轴 (physical volume) 的形式组织存储空间,每个物理卷轴一般很大,比如 100GB ,这样 10TB 的数据也只有 100 个物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元信息都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴 (logical volume) ,用于备份。Haystack Directory 存放逻辑卷轴和物理卷轴的对应关系,假设每个卷轴的大小为 100GB ,对应关系的条数为 20PB / 100GB = 0.2MB ,占用的内存可以忽略。Haystack cache 主要用于解决对 CDN 提供商过于依赖的问题,提供最近增加的图片的缓存服务。
Haystack 图片读取请求大致流程为:用户访问一个页面时, Web Server 请求 Haystack Directory 构造一个 URL :http:// < CDN > / < Cache > / < Machine id > / < Logical volume,Photo > ,后续根据各个部分的信息依次访问 CDN , Cache 和后端的 Haystack Store 存储节点。Haystack Directory 构造 URL 时可以省略 部分从而使得用户直接请求 Haystack Cache 而不必经过 CDN 。Haystack cache 收到的请求包含两个部分:用户 Browser 的请求及 CDN 的请求, Haystack cache 只缓存用户 Browser 发送的请求且要求请求的 Haystack Store 存储节点是可写的。一般来说, Haystack Store 的存储节点写一段时间以后达到容量上限变为只读,因此,可写节点的图片为最近增加的图片,是热点数据。
Haystack 的写请求 ( 图片上传 ) 处理流程为:Web Server 首先请求 Haystack Directory 获取图片的 id 和可写的逻辑卷轴,接着将数据写入对应的每一个物理卷轴 ( 备份数一般为 3) 。
Facebook Haystack 及 Taobao TFS 这样的文件系统一般称为 Blob 文件系统。它们都是解决大量的小图片文件的问题,因此架构很类似,不同点包括
(1) 逻辑卷轴大小的选择,比如 Haystack 选择 100GB 的逻辑卷轴大小, TFS 中 block 大小一般为 64MB ;
(2) Haystack 使用 RAID 6 ,且底层文件系统使用性能更好的 XFS ,淘宝后期摈除了 RAID 机制,文件系统使用 Ext3 ;
(3) Haystack 使用了 Akamai & Limelight 的 CDN 服务,而 Taobao 已经使用自建的 CDN ,当然, Facebook 也在考虑自建 CDN 。
4、 CDN 内容分发网络
CDN 的全称是 Content Delivery Network ,即内容分发网络。其目的是通过在现有的 Internet 中增加一层新的网络架构,将网站的内容发布到最接近用户的网络 ” 边缘 ” 。实现如下三个目的