淘宝分布式的文件系统TFS的原理及应用

jopen 10年前

TFS开源项目:http://code.taobao.org/p/tfs/wiki/index/

TFS是taobao filesystem的简称,是一个分布式的文件系统,目前最新的版本是TFS2.X

TFS和NAS相比,具有线性扩容好,高并发性能好。和HDFS相比更适合小文件,和FastDF相比支持自定义文件夹结构

其1.0的架构如下:

淘宝分布式的文件系统TFS的原理及应用


TFS2.0的架构如下:


淘宝分布式的文件系统TFS的原理及应用

其中,nameserver负责元数据的管理,文件的定位,写文件块的分配,dataserver的管理,数据备份监控,数据分布及负载均衡。以及操作日志的管理。

dataserver用来存储管理数据文件,处理客户端的文件访问,转发数据写入请求,复制和处理数据文件。

resourcecenter用来管理应用(权限和统计),集群的管理(扩容及应用透明化),计算距离实现就近访问

metaserver用来提供目录和自定义文件服务,也能用来做为后端数据库存储的缓存

rootserver用来刮泥metaserver并且分配metaserver的服务对象

下面是TFS1的写流程和读流程

淘宝分布式的文件系统TFS的原理及应用

淘宝分布式的文件系统TFS的原理及应用

下面是TFS2的读写流程


淘宝分布式的文件系统TFS的原理及应用


淘宝分布式的文件系统TFS的原理及应用

TFS有自己的读写API,包括JAVA,c++,python,php各种版本,使用非常简单,下面是我自己封装的一个Utils类


/**       * 获取tfsmanager       * @return       */      public static DefaultTfsManager getTfSManager(){          String CONF_TFS_RS_ADDRESS=ConfigManager.getConfigValue("tfs.rsAddr");          String CONF_TFS_APPKEY=ConfigManager.getConfigValue("tfs.appkey");          String CONF_TFS_IMG_SERVER=ConfigManager.getConfigValue("tfs.image.host");            DefaultTfsManager tfsManager = new DefaultTfsManager();          tfsManager.setRsAddr(CONF_TFS_RS_ADDRESS);  // 设置WebService Root Server地址,地址格式为 ip:port          tfsManager.setAppKey(CONF_TFS_APPKEY);  // 设置appkey          tfsManager.init();            return tfsManager;      }          /**       * 存储tfs文件       * @param inputStream       * @param fileName       * @return       */      public static String saveTfsFile(InputStream inputStream,String fileName){          try {              DefaultTfsManager tfsManager=getTfSManager();              byte[] fileBytes = FileUtils.inputStreamToByte(inputStream);                String fileExt=FileUtils.getFileExt(fileName);              String tfsfileName=tfsManager.saveFile(fileBytes,null,fileExt,true);                return tfsfileName;          } catch (IOException e) {              e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.              return "";          }      }          /**       * 获取tfs文件       * @param tfsFileName       * @return       */      public static OutputStream getTfsFile(String tfsFileName){          DefaultTfsManager tfsManager=getTfSManager();          OutputStream outputStream=new ByteArrayOutputStream();          Map fileInfor=new HashMap();          boolean result=tfsManager.fetchFile(tfsFileName,"",outputStream,fileInfor);            if(result){              return outputStream;          }else {              return null;          }      }

来自:http://my.oschina.net/zimingforever/blog/174879