zoukankan      html  css  js  c++  java
  • TFS

    TFS(Taobao FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

    TFS的总体结构

    一个TFS集群由两个nameserver节点(一主一备)和多个dataserver节点组成。这些服务程序都是作为一个用户级的程序运行在普通Linux机器上的。

    在TFS中,将大量的小文件(实际数据文件)合并成为一个大文件,这个大文件称为块(Block), 每个Block拥有在集群内唯一的编号(Block Id), Block Id在nameserver在创建Block的时候分配, nameserver维护block与dataserver的关系。Block中的实际数据都存储在dataserver上。而一台dataserver服务器一般会有多个独立dataserver进程存在,每个进程负责管理一个挂载点,这个挂载点一般是一个独立磁盘上的文件目录,以降低单个磁盘损坏带来的影响。

    nameserver主要功能是: 管理维护Block和dataserver相关信息,包括dataserver加入,退出, 心跳信息, block和dataserver的对应关系建立,解除。正常情况下,一个块会在dataserver上存在, 主nameserver负责Block的创建,删除,复制,均衡,整理, nameserver不负责实际数据的读写,实际数据的读写由dataserver完成。

    dataserver主要功能是: 负责实际数据的存储和读写。

    同时为了考虑容灾,nameserver采用了HA结构,即两台机器互为热备,同时运行,一台为主,一台为备,主机绑定到对外vip,提供服务;当主机器宕机后,迅速将vip绑定至备份nameserver,将其切换为主机,对外提供服务。图中的HeartAgent就完成了此功能。

    整体结构图

    TFS的块大小可以通过配置项来决定,通常使用的块大小为64M。TFS的设计目标是海量小文件的存储,所以每个块中会存储许多不同的小文件。dataserver进程会给Block中的每个文件分配一个ID(File ID,该ID在每个Block中唯一),并将每个文件在Block中的信息存放在和Block对应的Index文件中。这个Index文件一般都会全部load在内存,除非出现dataserver服务器内存和集群中所存放文件平均大小不匹配的情况。

    另外,还可以部署一个对等的TFS集群,作为当前集群的辅集群。辅集群不提供来自应用的写入,只接受来自主集群的写入。当前主集群的每个数据变更操作都会重放至辅集群。辅集群也可以提供对外的读,并且在主集群出现故障的时候,可以接管主集群的工作。

    平滑扩容

    原有TFS集群运行一定时间后,集群容量不足,此时需要对TFS集群扩容。此时只需要将相应数量的新dataserver服务器部署好应用程序并启动即可。这些dataserver服务器会向nameserver进行汇报。nameserver会根据dataserver容量的比率和dataserver的负载决定新数据写往哪台dataserver的服务器。根据写入策略,容量较小,负载较轻的服务器新数据写入的概率会比较高。同时,在集群负载比较轻的时候,nameserver会对dataserver上的Block进行均衡,使所有dataserver的容量尽早达到均衡。

    进行均衡计划时,首先计算每台机器应拥有的blocks平均数量,然后将机器划分为两堆,一堆是超过平均数量的,作为移动源;一类是低于平均数量的,作为移动目的。

    移动目的的选择:首先一个block的移动的源和目的,应该保持在同一网段内,也就是要与另外的block不同网段;另外,在作为目的的一定机器内,优先选择同机器的源到目的之间移动,也就是同台dataserver服务器中的不同dataserver进程。
    当有服务器故障或者下线退出时(单个集群内的不同网段机器不能同时退出),不影响TFS的服务。此时nameserver会检测到备份数减少的Block,对这些Block重新进行数据复制。

    在创建复制计划时,一次要复制多个block, 每个block的复制源和目的都要尽可能的不同,并且保证每个block在不同的子网段内。因此采用轮换选择(roundrobin)算法,并结合加权平均。

    数据块管理

    TFS以块的方式组织文件的存储。在nameserver节点中存储了所有的Block的信息,一个Block存储于多个dataserver中以保证数据的冗余。对于数据读写请求,均先由nameserver选择合适的dataserver节点返回给客户端,再在对应的dataserver节点上进行数据操作。nameserver需要维护Block信息列表,以及Block与dataserver之间的映射关系,其存储的元数据结构如下:

    nameserver元数据

    在dataserver节点上,在挂载目录上会有很多物理块,物理块以文件的形式存在磁盘上,并在dataserver部署前预先分配,以保证后续的访问速度和减少碎片产生。为了满足这个特性,DataServer?现一般在EXT4文件系统上运行。物理块分为主块和扩展块,一般主块的大小会远大于扩展块,使用扩展块是为了满足文件更新操作时文件大小的变化。每个Block在文件系统上以“主块+扩展块”的方式存储。每一个Block可能对应于多个物理块,其中包括一个主块,多个扩展块。

    TFS文件名的结构

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

    文件名组成

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

    TFS性能数据

    1. 软件环境描述
    【测试机软件情况描述】
    (1) Red Hat Enterprise Linux AS release 4 (Nahant Update 8) 
    (2) gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11) 
    (3) 部署了TFS客户端程序 
    【服务器软件情况描述】
    (1) Red Hat Enterprise Linux Server release 5.4 (Tikanga) 
    (2) gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-9) 
    (3) 部署了2台dataserver程序。
    【服务器软件情况描述】
    (1) Red Hat Enterprise Linux Server release 5.4 (Tikanga) 
    (2) gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46) 
    (3) 部署了2台nameserver(HA)程序。
    2. 硬件环境描述
    【测试机硬件情况描述】
    (1) 一枚八核Intel(R) Xeon(R) CPU E5520 @ 2.27GHz 
    (2) 内存总数8299424 kB 
    【服务器硬件情况描述】cpu/memory等
    (1) 一枚八核Intel(R) Xeon(R) CPU E5520 @ 2.27GHz 
    (2) 内存总数8165616 kB
    3. 随机读取1K~50K大小的文件性能

    读文件性能

    Read的TPS随着线程数的增加而增加,增长逐渐趋缓,到90线程的时候达到第一个高峰,此时再增加读线程,则TPS不再稳定增长。
    4. 随机写入1K~50K大小的文件

    写文件性能

    Write的TPS在线程数60左右达到高峰,此时再增加写入线程,TPS不再稳定增长。
    5. 在不同线程写压力下的读文件性能

    压力测试


    压力测试

    可以看出随着写压力的增加,读文件的TPS会大幅下滑。当写压力达到一定程度时读文件TPS趋缓。

    同时,对平均大小为20K的文件进行了测试,测试中读:写:更新:删除操作的比率为100:18:1:1时,在dataserver服务器磁盘util访问达到80%以上时,响应时间如下:

    TYPE SUCCCOUNT FAILCOUNT AVG(us) MIN(us) MAX(us) read 100000 0 20886 925 1170418 write 18000 0 17192 2495 1660686 update 1000 0 48489 5755 1205119 delete 1000 0 14221 382 591651

  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/Huayuan/p/2647075.html
Copyright © 2011-2022 走看看