淘寶分布式的文件系統TFS的原理及應用

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!