介紹
Seaweedfs是一個(gè)簡單偷俭,高擴(kuò)展性的分布式文件系統(tǒng)抄淑,它的兩個(gè)目標(biāo)分別是:
存儲(chǔ)數(shù)十億級(jí)的文件
快速響應(yīng)文件衩婚。
seaweedfs選擇以鍵值對(duì)(key->file)的實(shí)現(xiàn)方式剔应,這有點(diǎn)像“NoSQL",你可以陳其為”NoFS“。
seaweedfs的中心節(jié)點(diǎn)(center master)并不會(huì)管理所有文件的元數(shù)據(jù)而僅僅管理文件卷(file volmume)熬拒,文件及其元數(shù)據(jù)的管理是由volume server實(shí)現(xiàn)的爷光。這可以緩解center master的并發(fā)壓力,并且將文件元數(shù)據(jù)分配到volume server可以實(shí)現(xiàn)更快的文件訪問(只需一次磁盤讀取操作)澎粟。
架構(gòu)
通常蛀序,分布式文件系統(tǒng)將每個(gè)文件拆分為塊,中央主服務(wù)器保持文件名活烙,到塊句柄的塊索引以及每個(gè)塊服務(wù)器具有的塊徐裸。
主要缺點(diǎn)是中央主服務(wù)器無法高效地處理許多小文件,并且由于所有讀請(qǐng)求都需要通過塊主服務(wù)器啸盏,所以對(duì)于許多并發(fā)用戶來說可能無法很好地?cái)U(kuò)展重贺。
SeaweedFS管理主服務(wù)器中的數(shù)據(jù)卷,而不是管理塊。每個(gè)數(shù)據(jù)卷大小為32GB气笙,并且可以容納大量文件次企。每個(gè)存儲(chǔ)節(jié)點(diǎn)可以有很多數(shù)據(jù)卷。所以主節(jié)點(diǎn)只需要存儲(chǔ)關(guān)于卷的元數(shù)據(jù)健民,這是相當(dāng)少量的數(shù)據(jù)抒巢,并且通常是穩(wěn)定的贫贝。
實(shí)際的文件元數(shù)據(jù)存儲(chǔ)在卷服務(wù)器上的每個(gè)卷中秉犹。由于每個(gè)卷服務(wù)器只管理自己磁盤上的文件的元數(shù)據(jù),每個(gè)文件的元數(shù)據(jù)只有16個(gè)字節(jié)稚晚,因此所有文件訪問都可以從內(nèi)存中讀取文件元數(shù)據(jù)崇堵,只需要一次磁盤操作即可實(shí)際讀取文件數(shù)據(jù)。
主服務(wù)器(master server)和卷服務(wù)器(volmue server)
該架構(gòu)非常簡單客燕。實(shí)際數(shù)據(jù)存儲(chǔ)在存儲(chǔ)節(jié)點(diǎn)的卷上鸳劳。一個(gè)卷服務(wù)器可以有多個(gè)卷,并且都可以支持基本認(rèn)證的讀寫訪問也搓。
所有卷由主服務(wù)器管理赏廓。主服務(wù)器包含卷ID到卷服務(wù)器映射。這是相當(dāng)靜態(tài)的信息傍妒,可以輕松緩存幔摸。
在每個(gè)寫入請(qǐng)求上,主服務(wù)器還會(huì)生成一個(gè)file key颤练,這是一個(gè)不斷增長的64位無符號(hào)整數(shù)既忆。由于寫入請(qǐng)求通常不如讀取請(qǐng)求頻繁,因此一臺(tái)主服務(wù)器應(yīng)該能夠很好地處理并發(fā)
讀寫文件
當(dāng)客戶端發(fā)送寫入請(qǐng)求時(shí)嗦玖,主服務(wù)器為該文件返回(volume id, file key, file cookie, volume node url)患雇。客戶端然后聯(lián)系卷節(jié)點(diǎn)并發(fā)送文件的內(nèi)容宇挫。
當(dāng)客戶端需要根據(jù)(volume id, file key, file cookie)讀取文件時(shí)苛吱,它可以通過卷標(biāo)id詢問主服務(wù)器(volume node url, volume node public url),或從緩存中檢索器瘪。然后客戶端可以獲取內(nèi)容翠储,或者只是在網(wǎng)頁上呈現(xiàn)URL并讓瀏覽器獲取內(nèi)容。
存儲(chǔ)大小
在當(dāng)前的實(shí)現(xiàn)中娱局,每個(gè)卷可以是8x2 ^ 32個(gè)字節(jié)(32GiB)彰亥。這是因?yàn)閷?nèi)容對(duì)齊到8個(gè)字節(jié)。通過更改2行代碼衰齐,可以輕松地將其增加到64G或128G任斋,或者更多,代價(jià)是由于對(duì)齊而導(dǎo)致的一些浪費(fèi)的填充空間。
可以有2 ^ 32卷废酷。因此總系統(tǒng)大小為8 x 2 ^ 32字節(jié)x 2 ^ 32 = 8 x 4GiB x 4Gi = 128EiB(2 ^ 67字節(jié)或128 exbibytes)瘟檩。
每個(gè)單獨(dú)的文件大小都受限于卷大小。
使用示例
本示例簡單搭建一個(gè)集群澈蟆,集群規(guī)劃如下
Master Server :
192.168.0.193
Volmue Server:
192.168.0.191
192.168.0.193
192.168.0.195
192.168.0.196
啟動(dòng)Master Server
./weed master -ip=192.168.0.193
啟動(dòng)Volume Server
./weed volume -dir=/weedfs_data -mserver=192.168.0.193:9333 -port=8083 -ip=`hostname -i`
文件寫入
要上傳文件:首先墨辛,向/ dir / assign發(fā)送HTTP POST,PUT或GET請(qǐng)求以獲取fid和卷服務(wù)器url
> curl -X POST http://192.168.0.193:9333/dir/assign
{"fid":"8,081df3da0dce77","url":"192.168.0.196:8083","publicUrl":"192.168.0.196:8083","count":1}
其次趴俘,要存儲(chǔ)文件內(nèi)容睹簇,請(qǐng)向響應(yīng)中的url +'/'+ fid發(fā)送HTTP多部分PUT或POST請(qǐng)求:
> curl -X PUT -F file=@./test.log http://192.168.0.196:8083/8,081df3da0dce77
{"name":"test.log","size":8}
更新文件,只需使用新的文件內(nèi)容再次發(fā)送一個(gè)PUT或POST請(qǐng)求寥闪。
刪除文件太惠,只需發(fā)送HTTP DELETE請(qǐng)求到相同的URL +'/'+ fid URL:
> curl -X DELETE http://192.168.0.196:8083/8,081df3da0dce77
文件讀取
首先通過文件的volumeId查找volume server
> curl -X get http://192.168.0.193:9333/dir/lookup?volumeId=8
{"volumeId":"8","locations":[{"url":"192.168.0.196:8083","publicUrl":"192.168.0.196:8083"}]}
現(xiàn)在您可以使用公共URL從卷服務(wù)器讀取
http://192.168.0.196:8083/8,081df3da0dce77
性能
使用weedfs自動(dòng)的命令對(duì)搭建的四個(gè)數(shù)據(jù)節(jié)點(diǎn)的集群進(jìn)行了簡單的性能測試
使用50萬大小為50KB的文件進(jìn)行讀寫操作,測試命令及結(jié)果如下:
在寫的過程中由于194節(jié)點(diǎn)磁盤滿了導(dǎo)致有極少一部分寫入請(qǐng)求失敗疲憋,不過不影響測試結(jié)果凿渊,各位就將就一下吧
./weed benchmark -size=51200 -n=500000 -server=192.168.0.193:9333
------------ Writing Benchmark ----------
Concurrency Level: 16
Time taken for tests: 278.368 seconds
Complete requests: 499520
Failed requests: 480
Total transferred: 25591146326 bytes
Requests per second: 1794.46 [#/sec]
Transfer rate: 89778.15 [Kbytes/sec]
Connection Times (ms)
min avg max std
Total: 0.7 8.8 18660.8 106.4
Percentage of the requests served within a certain time (ms)
50% 7.1 ms
66% 8.4 ms
75% 9.3 ms
80% 10.0 ms
90% 12.9 ms
95% 16.3 ms
98% 21.0 ms
99% 24.6 ms
100% 18660.8 ms
------------ Randomly Reading Benchmark ----------
Concurrency Level: 16
Time taken for tests: 196.642 seconds
Complete requests: 500000
Failed requests: 0
Total transferred: 25615722837 bytes
Requests per second: 2542.69 [#/sec]
Transfer rate: 127212.71 [Kbytes/sec]
Connection Times (ms)
min avg max std
Total: 0.2 6.2 219.8 4.2
Percentage of the requests served within a certain time (ms)
50% 5.8 ms
66% 7.5 ms
75% 8.2 ms
80% 8.7 ms
90% 10.7 ms
95% 14.0 ms
98% 16.8 ms
99% 18.6 ms
100% 219.8 ms
其他特性
- 可以選擇是否使用數(shù)據(jù)副本,以及副本的級(jí)別
- master servers失敗自動(dòng)漂移-杜絕但點(diǎn)故障
- 根據(jù)文件的mime類型自動(dòng)進(jìn)行g(shù)zip壓縮(linux查看文件的mime類型,file --mime-type)
- 刪除及更新操作之后通過壓縮實(shí)現(xiàn)自動(dòng)的磁盤空間回收
- 集群中的服務(wù)器之間可以存在不同的磁盤空間缚柳,文件系統(tǒng)埃脏,操作系統(tǒng)
- 添加/刪除服務(wù)不會(huì)導(dǎo)致數(shù)據(jù)的重新平衡
- 可選擇修復(fù)jpeg圖片的方向
以下特性還沒有研究,后期再補(bǔ)上吧 - Optional filer server provides "normal" directories and files via http
- Support Etag, Accept-Range, Last-Modified, etc.
- Support in-memory/leveldb/boltdb/btree mode tuning for memory/performance balance.