一新博、分布式文件系統(tǒng)fastDFS-設(shè)計(jì)原理
FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng),由跟蹤服務(wù)器(tracker server)、存儲(chǔ)服務(wù)器(storage server)和客戶端(client)三個(gè)部分組成,
主要解決了海量數(shù)據(jù)存儲(chǔ)問題懈玻,特別適合以中小文件(建議范圍:4KB< file_size <500MB)為載體的在線服務(wù)。
1乾颁、Storage server
Storage server(后簡(jiǎn)稱storage)以組(卷涂乌,group或volume)為單位組織,一個(gè)group內(nèi)包含多臺(tái)storage機(jī)器英岭,數(shù)據(jù)互為備份湾盒,存儲(chǔ)空間以group內(nèi)容量最小的storage為準(zhǔn),所以建議group內(nèi)的多個(gè)storage盡量配置相同诅妹,以免造成存儲(chǔ)空間的浪費(fèi)历涝。
以group為單位組織存儲(chǔ)能方便的進(jìn)行應(yīng)用隔離、負(fù)載均衡、副本數(shù)定制(group內(nèi)storage server數(shù)量即為該group的副本數(shù))荧库,比如將不同應(yīng)用數(shù)據(jù)存到不同的group就能隔離應(yīng)用數(shù)據(jù)堰塌,同時(shí)還可根據(jù)應(yīng)用的訪問特性來將應(yīng)用分配到不同的group來做負(fù)載均衡;缺點(diǎn)是group的容量受單機(jī)存儲(chǔ)容量的限制分衫,同時(shí)當(dāng)group內(nèi)有機(jī)器壞掉時(shí)场刑,數(shù)據(jù)恢復(fù)只能依賴group內(nèi)的其他機(jī)器,使得恢復(fù)時(shí)間會(huì)很長(zhǎng)蚪战。
group內(nèi)每個(gè)storage的存儲(chǔ)依賴于本地文件系統(tǒng)牵现,storage可配置多個(gè)數(shù)據(jù)存儲(chǔ)目錄,比如有10塊磁盤邀桑,分別掛載在/data/disk1-/data/disk10瞎疼,則可將這10個(gè)目錄都配置為storage的數(shù)據(jù)存儲(chǔ)目錄。
storage接受到寫文件請(qǐng)求時(shí)壁畸,會(huì)根據(jù)配置好的規(guī)則(后面會(huì)介紹)贼急,選擇其中一個(gè)存儲(chǔ)目錄來存儲(chǔ)文件。為了避免單個(gè)目錄下的文件數(shù)太多捏萍,在 storage第一次啟動(dòng)時(shí)太抓,會(huì)在每個(gè)數(shù)據(jù)存儲(chǔ)目錄里創(chuàng)建2級(jí)子目錄,每級(jí)256個(gè)令杈,總共65536個(gè)文件走敌,新寫的文件會(huì)以hash的方式被路由到其中某個(gè)子目錄下,然后將文件數(shù)據(jù)直接作為一個(gè)本地文件存儲(chǔ)到該目錄中逗噩。
2掉丽、Tracker server
Tracker是FastDFS的協(xié)調(diào)者,負(fù)責(zé)管理所有的storage server和group异雁,每個(gè)storage在啟動(dòng)后會(huì)連接Tracker捶障,告知自己所屬的group等信息,并保持周期性的心跳片迅,tracker根據(jù) storage的心跳信息残邀,建立group==>[storage server list]的映射表皆辽。
Tracker需要管理的元信息很少柑蛇,會(huì)全部存儲(chǔ)在內(nèi)存中;另外tracker上的元信息都是由storage匯報(bào)的信息生成的驱闷,本身不需要持久化任何數(shù)據(jù)耻台,這樣使得tracker非常容易擴(kuò)展,直接增加tracker機(jī)器即可擴(kuò)展為tracker cluster來服務(wù)空另,cluster里每個(gè)tracker之間是完全對(duì)等的盆耽,所有的tracker都接受stroage的心跳信息,生成元數(shù)據(jù)信息來提供讀寫服務(wù)。
3摄杂、Uploadfile
FastDFS向使用者提供基本文件訪問接口坝咐,比如upload、download墨坚、append、delete等泽篮,以客戶端庫(kù)的方式提供給用戶使用柑船。
選擇tracker server
當(dāng)集群中不止一個(gè)tracker server時(shí)帽撑,由于tracker之間是完全對(duì)等的關(guān)系,客戶端在upload文件時(shí)可以任意選擇一個(gè)tracker鞍时。
選擇存儲(chǔ)的group
當(dāng)tracker接收到upload file的請(qǐng)求時(shí),會(huì)為該文件分配一個(gè)可以存儲(chǔ)該文件的group专筷,支持如下選擇group的規(guī)則:
1.Round robin,所有的group間輪詢
2.Specifiedgroup蒸苇,指定某一個(gè)確定的group
3.Load balance磷蛹,剩余存儲(chǔ)空間多的group優(yōu)先
選擇storage server
當(dāng)選定group后,tracker會(huì)在group內(nèi)選擇一個(gè)storage server給客戶端溪烤,支持如下選擇storage的規(guī)則:
1.Round robin,在group內(nèi)的所有storage間輪詢
2.First server ordered by ip槽驶,按ip排序
3.First server ordered by priority鸳兽,按優(yōu)先級(jí)排序(優(yōu)先級(jí)在storage上配置)
選擇storage path
當(dāng)分配好storage server后,客戶端將向storage發(fā)送寫文件請(qǐng)求揍异,storage將會(huì)為文件分配一個(gè)數(shù)據(jù)存儲(chǔ)目錄,支持如下規(guī)則:
1.Round robin衷掷,多個(gè)存儲(chǔ)目錄間輪詢
2.剩余存儲(chǔ)空間最多的優(yōu)先
生成Fileid(文件名)
選定存儲(chǔ)目錄之后戚嗅,storage會(huì)為文件生一個(gè)Fileid枢舶,由storage server ip替久、文件創(chuàng)建時(shí)間、文件大小蚯根、文件crc32和一個(gè)隨機(jī)數(shù)拼接而成,
然后將這個(gè)二進(jìn)制串進(jìn)行base64編碼吼具,轉(zhuǎn)換為可打印的字符串矩距。
選擇兩級(jí)目錄
當(dāng)選定存儲(chǔ)目錄之后,storage會(huì)為文件分配一個(gè)fileid锥债,每個(gè)存儲(chǔ)目錄下有兩級(jí)256*256的子目錄哮肚,storage會(huì)按文件fileid進(jìn)行兩次hash(猜測(cè)),
路由到其中一個(gè)子目錄允趟,然后將文件以fileid為文件名存儲(chǔ)到該子目錄下。
生成文件名(訪問url:路徑+文件名)
當(dāng)文件存儲(chǔ)到某個(gè)子目錄后涣楷,即認(rèn)為該文件存儲(chǔ)成功抗碰,接下來會(huì)為該文件生成一個(gè)文件名狮斗,
文件名由group弧蝇、存儲(chǔ)目錄、兩級(jí)子目錄沙峻、fileid鹃觉、文件后綴名(由客戶端指定睹逃,主要用于區(qū)分文件類型)拼接而成祷肯。
4疗隶、Download file
客戶端upload file成功后,會(huì)拿到一個(gè)storage生成的文件名蒋纬,接下來客戶端根據(jù)這個(gè)文件名即可訪問到該文件坚弱。
跟upload file一樣,在download file時(shí)客戶端可以選擇任意tracker server碾阁。
tracker發(fā)送download請(qǐng)求給某個(gè)tracker些楣,必須帶上文件名信息,tracke從文件名中解析出文件的group愁茁、大小、創(chuàng)建時(shí)間等信息嘶居,然后為該請(qǐng)求選擇一個(gè)storage用來服務(wù)讀請(qǐng)求促煮。由于group內(nèi)的文件同步時(shí)在后臺(tái)異步進(jìn)行的,所以有可能出現(xiàn)在讀到時(shí)候樱报,文件還沒有同步到某些storage server上泞当,為了盡量避免訪問到這樣的storage,tracker按照如下規(guī)則選擇group內(nèi)可讀的storage盗飒。
- 該文件上傳到的源頭storage -源頭storage只要存活著陋桂,肯定包含這個(gè)文件,源頭的地址被編碼在文件名中嗜历。
- 文件創(chuàng)建時(shí)間戳==storage被同步到的時(shí)間戳且(當(dāng)前時(shí)間-文件創(chuàng)建時(shí)間戳)>文件同步最大時(shí)間(如5分鐘)-文件創(chuàng)建后抖所,
認(rèn)為經(jīng)過最大同步時(shí)間后痕囱,肯定已經(jīng)同步到其他storage了鞍恢。 - 文件創(chuàng)建時(shí)間戳< storage被同步到的時(shí)間戳。-同步時(shí)間戳之前的文件確定已經(jīng)同步了
4.(當(dāng)前時(shí)間-文件創(chuàng)建時(shí)間戳)>同步延遲閥值(如一天)帮掉。-經(jīng)過同步延遲閾值時(shí)間,認(rèn)為文件肯定已經(jīng)同步了警绩。
image.png
5肩祥、文件同步
寫文件時(shí)缩膝,客戶端將文件寫至group內(nèi)一個(gè)storage server即認(rèn)為寫文件成功,storage server寫完文件后疾层,會(huì)由后臺(tái)線程將文件同步至同group內(nèi)其他的storage server。
每個(gè)storage寫文件后予弧,同時(shí)會(huì)寫一份binlog湖饱,binlog里不包含文件數(shù)據(jù),只包含文件名等元信息蚓庭,這份binlog用于后臺(tái)同步仅仆,storage會(huì)記錄向group內(nèi)其他storage同步的進(jìn)度,以便重啟后能接上次的進(jìn)度繼續(xù)同步墓拜;進(jìn)度以時(shí)間戳的方式進(jìn)行記錄咳榜,所以最好能保證集群內(nèi)所有server的時(shí)鐘保持同步爽锥。
storage的同步進(jìn)度會(huì)作為元數(shù)據(jù)的一部分匯報(bào)到tracker上授舟,tracke在選擇讀storage的時(shí)候會(huì)以同步進(jìn)度作為參考
http://my.oschina.net/denglz/blog/488339
原文地址:https://blog.csdn.net/u010558660/article/details/52353481