1.FastDFS是什么
FastDFS是一款類Google FS的開源分布式文件系統,它用純C語言實現,支持Linux、FreeBSD、AIX等UNIX系統。它只能通過 專有API對文件進行存取訪問,不支持POSIX接口方式,不能mount使用。
准確地講,Google FS以及FastDFS、mogileFS、 HDFS、TFS等類Google FS都不是系統級的分布式文件系統,而是應用級的分布式文件存儲服務。
FastDFS的作者是余慶,現在淘寶網Java中間件團隊從事Java基礎平台研發工作。
以上文字引用自<<程序員>> 文章 <<分布式文件系統FastDFS架構剖析>> http://www.programmer.com.cn/tag/fastdfs-架構/
2.FastDFS的體系結構
3.FastDFS工作過程
1. Client詢問Tracker server上傳到的Storage server;
2. Tracker server返回一台可用的Storage server,返回的數據為該Storage server的IP地址和端口;
3. Client直接和該Storage server建立連接,進行文件上傳,Storage server返回新生成的文件ID,文件上傳結束。
1. Client詢問Tracker server可以下載指定文件的Storage server,參數為文件ID(包含組名和文件名);
2. Tracker server返回一台可用的Storage server;
3. Client直接和該Storage server建立連接,完成文件下載。
FastDFS從V1.20開始,支持通過HTTP協議下載文件。
1.用戶瀏覽器訪問Tracker server內置的Web Server,URL中包含文件ID(包含組名和文件名);
2.Tracker server將這個HTTP請求redirect到一台可用的Storage server的Web Server上(可以是apache或nginx);
3.用戶瀏覽器直接與Storage server的Web Serverr建立連接,完成文件下載。
4.客戶端訪問方式
有兩種客戶端訪問方式,一種直接訪問前端tracker server ,tracker_server將請求redirect到后端能提供服務的storage server,storage server收到請求后直接返回文件給客戶端
一種是客戶端直接訪問storage server請求得到結果,storage server 可以使用自己的簡單HTTP服務,也可以用fastdfs-nginx-module和nginx、apache整合提供HTTP服務。
5.服務器端目錄結構
FastDFS服務器端運行時目錄結構如下:
${base_path}
|__data:存放狀態文件
|__logs:存放日志文件
其中,${base_path}由配置文件中的參數“base_path”設定。
2.2.1 tracker server結構
tracker server目錄及文件結構:
${base_path}
|__data
| |__storage_groups.dat:存儲分組信息
| |__storage_servers.dat:存儲服務器列表
|__logs
|__trackerd.log:tracker server日志文件
數據文件storage_groups.dat和storage_servers.dat中的記錄之間以換行符(\n)分隔,字段之間以西文逗號(,)分隔。
storage_groups.dat中的字段依次為:
(1) group_name:組名
(2) storage_port:storage server端口號
storage_servers.dat中記錄storage server相關信息,字段依次為:
(1) group_name:所屬組名
(2) ip_addr:ip地址
(3) status:狀態
(4) sync_src_ip_addr:向該storage server同步已有數據文件的源服務器
(5) sync_until_timestamp:同步已有數據文件的截至時間(UNIX時間戳)
(6) stat.total_upload_count:上傳文件次數
(7) stat.success_upload_count:成功上傳文件次數
(8) stat.total_set_meta_count:更改meta data次數
(9) stat.success_set_meta_count:成功更改meta data次數
(10) stat.total_delete_count:刪除文件次數
(11) stat.success_delete_count:成功刪除文件次數
(12) stat.total_download_count:下載文件次數
(13) stat.success_download_count:成功下載文件次數
(14) stat.total_get_meta_count:獲取meta data次數
(15) stat.success_get_meta_count:成功獲取meta data次數
(16) stat.last_source_update:最近一次源頭更新時間(更新操作來自客戶端)
(17) stat.last_sync_update:最近一次同步更新時間(更新操作來自其他storage server的同步)
storage server
storage server目錄及文件結構:
${base_path}
|__data
| |__.data_init_flag:當前storage server初始化信息
| |__storage_stat.dat:當前storage server統計信息
| |__sync:存放數據同步相關文件
| | |__binlog.index:當前的binlog(更新操作日志)文件索引號
| | |__binlog.###:存放更新操作記錄(日志)
| | |__${ip_addr}_${port}.mark:存放向目標服務器同步的完成情況
| |
| |__一級目錄:256個存放數據文件的目錄,目錄名為十六進制字符,如:00, 1F
| |__二級目錄:256個存放數據文件的目錄,目錄名為十六進制字符,如:0A, CF
|__logs
|__storaged.log:storage server日志文件
.data_init_flag文件格式為ini配置文件方式,各個參數如下:
# storage_join_time:本storage server創建時間;
# sync_old_done:本storage server是否已完成同步的標志(源服務器向本服務器同步已有數據);
# sync_src_server:向本服務器同步已有數據的源服務器IP地址,沒有則為空;
# sync_until_timestamp:同步已有數據文件截至時間(UNIX時間戳);
storage_stat.dat文件格式為ini配置文件方式,各個參數如下:
# total_upload_count:上傳文件次數
# success_upload_count:成功上傳文件次數
# total_set_meta_count:更改meta data次數
# success_set_meta_count:成功更改meta data次數
# total_delete_count:刪除文件次數
# success_delete_count:成功刪除文件次數
# total_download_count:下載文件次數
# success_download_count:成功下載文件次數
# total_get_meta_count:獲取meta data次數
# success_get_meta_count:成功獲取meta data次數
# last_source_update:最近一次源頭更新時間(更新操作來自客戶端)
#last_sync_update:最近一次同步更新時間(更新操作來自其他storage server)
binlog.index中只有一個數據項:當前binlog的文件索引號
binlog.###,###為索引號對應的3位十進制字符,不足三位,前面補0。索引號基於0,最大為999。一個binlog文件最大為1GB。記錄之間以換行符(\n)分隔,字段之間以西文空格分隔。字段依次為:
(1)timestamp:更新發生時間(Unix時間戳)
(2)op_type:操作類型,一個字符
(3)filename:操作(更新)的文件名,包括相對路徑,如:5A/3D/FE_93_SJZ7pAAAO_BXYD.S
${ip_addr}_${port}.mark:ip_addr為同步的目標服務器IP地址,port為本組storage server端口。例如:10.0.0.1_23000.mark。文件格式為ini配置文件方式,各個參數如下:
# binlog_index:已處理(同步)到的binlog索引號
# binlog_offset:已處理(同步)到的binlog文件偏移量(字節數)
# need_sync_old:同步已有數據文件標記,0表示沒有數據文件需要同步
# sync_old_done:同步已有數據文件是否完成標記,0表示未完成,1表示已完成
# until_timestamp:同步已有數據截至時間點(UNIX時間戳)
# scan_row_count:已掃描的binlog記錄數
# sync_row_count:已同步的binlog記錄數
數據文件名由系統自動生成,包括三部分:當前時間(Unix時間戳)、文件大小(字節數)和隨機數。文件名長度為16字節。文件按照PJW Hash算法hash到65536(256*256,默認配置下)個目錄中分散存儲。