seaweedfs中的名詞:
master: 存儲文件和fid映射關系
volumn:實際存儲文件
datacenter: 數據中心
rack: 機架。一個機架屬於特定的數據中心,一個數據中心可以包含多個機架。
collection: 一組volume的集合。如果在存儲文件的時候沒有指定collection,那么使用默認的""
weed-fs提供了若干種replication策略(rack – 機架,一個邏輯上的概念):
000 no replication, just one copy
001 replicate once on the same rack
010 replicate once on a different rack in the same data center
100 replicate once on a different data center
200 replicate twice on two other different data center
110 replicate once on a different rack, and once on a different data center
二,刪除文件
向master發起/delete操作,URL參數是fid。
master:
1)對每個fid,根據fid找出它所在的volume的信息(主要是url),然后通過向volume_server的URL的/delete發起刪除文件的操作,發起刪除的操作由一組goroutine並發執行
2)將刪除結果返回給客戶端
volume:
1)從該volume的needleMap中刪除這個file
2)將空的索引信息(key=id, offset=0, size=0)append到索引文件末尾
2)將空文件的信息append到dat文件末尾
可以看到,volume在刪除文件的時候,根本沒有動原來的文件,只是在needleMap中將這個文件刪除。
三,volume上的碎片回收
兩種途徑:1)master集群中的leader進程定時(15分鍾)做一次回收;2)通過向master發送/vol/vacuum的HTTP請求來回收
回收步驟:
master:
1)對每個Collection中的每個VolumeLayout,每個volumeLayout中的每個volume,通過向相應的volume_server的/admin/vacuum/check發起HTTP請求來批量監測它的是否需要回收,如果需要回收,到2),否則退出
2)將要compact的volume_id的狀態變成不可寫
3)通過向相應的volume_server的/admin/vacuum/compact發起HTTP請求來讓volume_server執行回收操作,如果回收操作成功,到4),否則退出
4)向相應的volume_server的/admin/vacuum/commit發起HTTP請求來提交本次回收操作,得到成功的響應后,將該volume_id的狀態變成可寫
volume:
1)收到/admin/vacuum/check發過來的監測是否回收的指令后,如果 碎片大小/總大小 < URL參數中的garbageThreshold,則返回false說明不需要回收,否則返回true說明需要回收
2)收到/admin/vacuum/compact發過來的壓縮指令后,在本目錄下面創建新文件vid.cpd和vid.cpx,分別代表壓縮后的數據文件和索引文件,接着掃描原來的vid.dat文件,將仍然使用的數據寫入到vid.cpd中,並將索引信息寫入到vid.cpx中,返回成功。需要注意的是,在掃描原來的vid.dat文件時,遇到一個文件如果它不在舊的needleMap中,說明這個文件已經被刪除了,不會將它寫入到新的vid.cpd文件中。
3)收到/admin/vacuum/commit發過來的提交壓縮指令后,用vip.cpd覆蓋vip.dat,vid.cpx覆蓋vip.idx,接着用vid.cpx中的內容更新內存中該volume的needleMap
一致性:
在分布式系統中,“一致性”是永恆的難題。weed-fs支持replication,其多副本的數據一致性需要保證。
weed-fs理論上采用了是一種“強一致性”的策略,即:
weedfs的replication的設計原則是由接受上傳的volume server 來做數據復制。
上傳文件時,會在本地寫完后,通過master獲取副本的其他volume server,然后本機發起向其他volume serer寫副本文件的操作。
刪除文件時,會在本地刪除完成后,通過master獲取副本的其他volume server,然后本機向其他volume server發起刪除副本的操作。
數據遷移
weed-fs提供數據遷移命令
上傳流程
1,向http://master/dir/assign發送HTTP請求,獲取該文件的fid,url,publicUrl等信息
2,批量上傳文件時,第一個文件fid是fid,其余的id是fid_1, fid_2, fid_3...
3,隨后向http://master/fid發起POST請求,將文件上傳至master。