简介
TFS主要针对海量非结构化(结构化的数据是指像mysql中的数据,非结构化就是像NOSQL中的数据)的小数据,通常的文件大小不超过1M,可以满足对小文件存储的需求.
采用了HA架构:HA架构就是高可用的缩写,有一个活动节点和备份节点,当活动节点挂了的时候,备份节点会监测到,然后代替活动节点进行工作.
平滑扩容: 下面会说到
扁平化数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能
TFS的总体结构
一个TFS集群由两个NameServer节点(一主一备),和多个DataServer节点组成.这些服务程序都是作为一个用户级的普通程序运行在Linux虚拟机上的
在TFS中.将大量的小文件(就是传过来的图片之类的)合并成一个大文件,这个大文件称为Block(块),每个Block块拥有一个集群内唯一的BlockId 这是由NameServer创建Block时分配的,NameServer负责维护Block和DataServer的关系,Block的信息(Block元文件)都储存在NameServer上,而Block实际的数据都储存在DataServer上.每台DataServer服务器上基本都会有很多DataServer进程,他们通常挂载在一个独立的磁盘文件目录(分区),以降低磁盘损坏带来的影响.
NameServer的主要功能:
管理维护Block和DataServer相关信息,包括!DataServer加入,退出, 心跳信息, block和!DataServer的对应关系建立,解除。
正常情况下,一个块会在!DataServer上存在, 主NameServer负责Block的创建,删除,复制,均衡,整理, NameServer不负责实际数据的读写,实际数据的读写由!DataServer完成。
NameServer的主机绑定对外VIP(就是主机的IP) 提供服务,当主机宕机之后,迅速将VIP绑定至备份NameServer 将其切换为主机,对外提供服务,HeartAgent完成此功能
DataServer主要功能: 负责实际数据的存储和读写。
理解了上图中所有组件的作用
HeartAgent 负责监听NameServer(主机) 和Slave NameServer(从机) 主机从机之间
Sync Data 同步数据 NameServer 中关于Block的信息都储存在内存中,所以速度很快
app访问NameServer主机.然后NameServer主机给app分配DataServer和Block 然后app在上面读和写
TFS的块大小可以通过配置项来决定,通常使用的块大小为64M。TFS的设计目标是海量小文件的存储,所以每个块中会存储许多不同的小文件。
DataServer进程会给Block中的每个文件分配一个ID(File ID,该ID在每个Block中唯一),并将每个文件在Block中的信息存放在和Block对应的Index文件中。这个Index文件一般都会全部load在内存,除非出现DataServer服务器内存和集群中所存放文件平均大小不匹配的情况(这句话还没理解)。
TFS还支持跨集群同步
可以再创建一个和TFS对等的集群,由主集群负责写入这个集群 和同步数据 这个集群只对外提供读的功能, 当主机群挂了的时候,这个集群会自动顶上去.
平滑扩容:
由于NameServer和DataServer 之间是通过心跳机制来通信的,如果集群需要扩容,只需要将新的DataServer服务器部署好,然后启动即可.这些DataServer服务器会像NameServer发送心跳汇报 . NameServer的写入策略是 在容量较小,负载较轻的服务器写入新数据的概率会比较高, 同时.在集群负载较轻的时候, NameServer 会对所有的DataServer 和Block进行均衡. 使所有的DataServer容器尽早达到均衡.
均衡移动的原理和过程(感觉不是很重要,直接看了一遍然后copy过来)
进行均衡计划时,首先计算每台机器应拥有的blocks平均数量,然后将机器划分为两堆,一堆是超过平均数量的,作为移动源;一类是低于平均数量的,作为移动目的。
移动目的的选择:首先一个block的移动的源和目的,应该保持在同一网段内,也就是要与另外的block不同网段;另外,在作为目的的一定机器内,优先选择同机器的源到目的之间移动,也就是同台!DataServer服务器中的不同!DataServer进程。
当有服务器故障或者下线退出时(单个集群内的不同网段机器不能同时退出),不影响TFS的服务。此时!NameServer会检测到备份数减少的Block,对这些Block重新进行数据复制。
在创建复制计划时,一次要复制多个block, 每个block的复制源和目的都要尽可能的不同,并且保证每个block在不同的子网段内。因此采用轮换选择(roundrobin)算法,并结合加权平均。
由于DataServer之间的通信是主要发生在数据写入转发的时候和数据复制的时候,集群扩容基本没有影响。假设一个Block为64M,数量级为1PB。那么NameServer上会有 1 * 1024 * 1024 * 1024 / 64 = 16.7M个block。假设每个Block的元数据大小为0.1K,则占用内存不到2G。
容错机制(高可用):
TFS有四重容错机制(我觉得应该算四层,官方文档里面是三层)
1.集群容错:(已了解,直接copy过来,不知道我们会不会部署多个集群呢0.0)
TFS可以配置主辅集群,一般主辅集群会存放在两个不同的机房。主集群提供所有功能,辅集群只提供读。主集群会把所有操作重放到辅集群。这样既提供了负载均衡,又可以在主集群机房出现异常的情况不会中断服务或者丢失数据。
2.NameServer容错:
NameServer采用了HA结构,一主一备,主NameServer上的操作会重放至备NameServer。如果主NameServer出现问题,可以实时切换到备NameServer。
另外: NameServer 与DataServer之间也有心跳机制.DataServer 会将他的Block的信息定时发送到NameServer上, NameServer会根据这些信息重建Block和DataServer的关系(这里高版本的TFS已经不将这个功能放到心跳机制里了,心跳机制只用来检查DataServer是否还活着,以及有没有其他的DataServer加入).
3.DataServer容错:
TFS采用备份多个Block来实现DataServer容错,每个Block 在集群中存在多份,并且他们分别部署在不同网段的不同DataServer上,一般为3份,我记得可以通过配置max_Block....来修改,正是因为这样,如果你只有一台DataServer的时候,那么你的这个属性就要改为1 否则不能启动TFS
对于每一个写入请求.必须等待所有的Block备份完成之后才算写入成功.当出现磁盘损坏或者DataServer宕机的时候,TFS会启动复制流程,通过心跳机制获得这些DataServer上Block的信息,把那备份数小于3的Block尽快复制到其他的DataServer上去.
4.对单个文件的容错:
TFS对每一个文件会记录校验crc ,当客户端访问这个文件的时候发现crc和文件内容不匹配的时候,会自动切换到一个好的Block上去读取.此后客户端会修复单个文件损坏的情况.
并发机制:
对同一个文件来说,TFS支持并发的读 ,但是不支持并发的写入,其实单个Block块也是不支持并发的写入
TFS文件结构:
TFS的文件名由块号和文件号通过某种对应关系组成,最大长度为18字节。文件名固定以T开始,第二字节为该集群的编号(可以在配置项中指定,取值范围 1~9)。余下的字节由Block ID和File ID通过一定的编码方式得到。文件名由客户端程序进行编码和解码