1.FastDFS 是什么
??? FastDFS是一款類Google?FS的開源分布式文件系統(tǒng),它用純C語言實現(xiàn),支持Linux、FreeBSD、AIX等UNIX系統(tǒng)。它只能通過 專有API對文件進行存取訪問,不支持POSIX接口方式,不能mount使用。
??? 準確地講,Google?FS以及FastDFS、mogileFS、 HDFS、TFS等類Google?FS都不是系統(tǒng)級的分布式文件系統(tǒng),而是應用級的分布式文件存儲服務。
??? FastDFS的作者是余慶,現(xiàn)在淘寶網(wǎng)Java中間件團隊從事Java基礎(chǔ)平臺研發(fā)工作。
以上文字引用自<<程序員>> 文章 <<分布式文件系統(tǒng)FastDFS架構(gòu)剖析>> http://www.programmer.com.cn/tag/fastdfs- 架構(gòu)/
?
2.FastDFS 的體系結(jié)構(gòu)
?
?
3.FastDFS 工作過程
1.?Client詢問Tracker?server上傳到的Storage?server;
2.?Tracker?server返回一臺可用的Storage?server,返回的數(shù)據(jù)為該Storage?server的IP地址和端口;
3.?Client直接和該Storage?server建立連接,進行 文件上傳 ,Storage?server返回新生成的文件ID, 文件上傳 結(jié)束。
?
?
1.?Client詢問Tracker?server可以下載指定文件的Storage?server,參數(shù)為文件ID(包含組名和文件名);
2.?Tracker?server返回一臺可用的Storage?server;
3.?Client直接和該Storage?server建立連接,完成文件下載。
?
?
FastDFS從V1.20開始,支持通過HTTP協(xié)議下載文件。
1.用戶瀏覽器訪問Tracker?server內(nèi)置的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請求得到結(jié)果,storage server 可以使用自己的簡單HTTP服務,也可以用fastdfs-nginx-module和nginx、apache整合提供HTTP服務。
?
5.
服務器端目錄結(jié)構(gòu)
FastDFS服務器端運行時目錄結(jié)構(gòu)如下:
${base_path}
????? |__data:存放狀態(tài)文件
?? ?? |__logs:存放日志文件
其中,${base_path}由配置文件中的參數(shù)“base_path”設定。
2.2.1 tracker server結(jié)構(gòu)
tracker server目錄及文件結(jié)構(gòu):
${base_path}
??? |__data
?? ?? |???? |__storage_groups.dat:存儲分組信息
?? ?? |???? |__storage_servers.dat:存儲服務器列表
?? ???? |__logs
???????????? |__trackerd.log:tracker server日志文件
數(shù)據(jù)文件storage_groups.dat和storage_servers.dat中的記錄之間以換行符(\n)分隔,字段之間以西文逗號(,)分隔。
storage_groups.dat中的字段依次為:
(1) group_name:組名
(2) storage_port:storage server端口號
storage_servers.dat中記錄storage server相關(guān)信息,字段依次為:
(1) group_name:所屬組名
?? (2) ip_addr:ip地址
?? (3) status:狀態(tài)
(4) sync_src_ip_addr:向該storage server同步已有數(shù)據(jù)文件的源服務器
(5) sync_until_timestamp:同步已有數(shù)據(jù)文件的截至時間(UNIX時間戳)
(6) stat.total_upload_count:上傳文件次數(shù)
(7) stat.success_upload_count:成功上傳文件次數(shù)
(8) stat.total_set_meta_count:更改meta data次數(shù)
(9) stat.success_set_meta_count:成功更改meta data次數(shù)
(10) stat.total_delete_count:刪除文件次數(shù)
(11) stat.success_delete_count:成功刪除文件次數(shù)
(12) stat.total_download_count:下載文件次數(shù)
(13) stat.success_download_count:成功下載文件次數(shù)
(14) stat.total_get_meta_count:獲取meta data次數(shù)
(15) stat.success_get_meta_count:成功獲取meta data次數(shù)
(16) stat.last_source_update:最近一次源頭更新時間(更新操作來自客戶端)
(17) stat.last_sync_update:最近一次同步更新時間(更新操作來自其他storage server的同步)
storage server
storage server目錄及文件結(jié)構(gòu):
${base_path}
??? |__data
??? |???? |__.data_init_flag:當前storage server初始化信息
??? |???? |__storage_stat.dat:當前storage server統(tǒng)計信息
??? |???? |__sync:存放數(shù)據(jù)同步相關(guān)文件
??? |???? |???? |__binlog.index:當前的binlog(更新操作日志)文件索引號
??? |???? |???? |__binlog.###:存放更新操作記錄(日志)
??? |???? |???? |__${ip_addr}_${port}.mark:存放向目標服務器同步的完成情況
??? |???? |
??? |???? |__一級目錄:256個存放數(shù)據(jù)文件的目錄,目錄名為十六進制字符,如:00, 1F
??? |?????????? |__二級目錄:256個存放數(shù)據(jù)文件的目錄,目錄名為十六進制字符,如:0A, CF
??? |__logs
????????? |__storaged.log:storage server日志文件
.data_init_flag文件格式為ini配置文件方式,各個參數(shù)如下:
?? # storage_join_time:本storage server創(chuàng)建時間;
# sync_old_done:本storage server是否已完成同步的標志(源服務器向本服務器同步已有數(shù)據(jù));
# sync_src_server:向本服務器同步已有數(shù)據(jù)的源服務器IP地址,沒有則為空;
# sync_until_timestamp:同步已有數(shù)據(jù)文件截至時間(UNIX時間戳);
storage_stat.dat文件格式為ini配置文件方式,各個參數(shù)如下:
# total_upload_count:上傳文件次數(shù)
# success_upload_count:成功上傳文件次數(shù)
# total_set_meta_count:更改meta data次數(shù)
# success_set_meta_count:成功更改meta data次數(shù)
# total_delete_count:刪除文件次數(shù)
# success_delete_count:成功刪除文件次數(shù)
# total_download_count:下載文件次數(shù)
# success_download_count:成功下載文件次數(shù)
# total_get_meta_count:獲取meta data次數(shù)
# success_get_meta_count:成功獲取meta data次數(shù)
# last_source_update:最近一次源頭更新時間(更新操作來自客戶端)
#last_sync_update:最近一次同步更新時間(更新操作來自其他storage server)
binlog.index中只有一個數(shù)據(jù)項:當前binlog的文件索引號
binlog.###,###為索引號對應的3位十進制字符,不足三位,前面補0。索引號基于0,最大為999。一個binlog文件最大為1GB。記錄之間以換行符(\n)分隔,字段之間以西文空格分隔。字段依次為:
(1)timestamp:更新發(fā)生時間(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配置文件方式,各個參數(shù)如下:
# binlog_index:已處理(同步)到的binlog索引號
# binlog_offset:已處理(同步)到的binlog文件偏移量(字節(jié)數(shù))
# need_sync_old:同步已有數(shù)據(jù)文件標記,0表示沒有數(shù)據(jù)文件需要同步
# sync_old_done:同步已有數(shù)據(jù)文件是否完成標記,0表示未完成,1表示已完成
?? # until_timestamp:同步已有數(shù)據(jù)截至時間點(UNIX時間戳)
# scan_row_count:已掃描的binlog記錄數(shù)
# sync_row_count:已同步的binlog記錄數(shù)
數(shù)據(jù)文件名由系統(tǒng)自動生成,包括三部分:當前時間(Unix時間戳)、文件大小(字節(jié)數(shù))和隨機數(shù)。文件名長度為16字節(jié)。文件按照PJW Hash算法hash到65536(256*256,默認配置下)個目錄中分散存儲。
?
?
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

