2011年做過(guò)一個(gè)人物挖掘搜索的系統(tǒng)俏橘,當(dāng)時(shí)用C#寫(xiě)過(guò)一個(gè)爬蟲(chóng)框架,當(dāng)時(shí)對(duì)150多個(gè)學(xué)術(shù)網(wǎng)站采集了約3億網(wǎng)頁(yè)文件靴寂,零散的文件一開(kāi)始分散放置在不同的主機(jī)和移動(dòng)硬盤(pán)上百炬,后來(lái)管理與使用越來(lái)越難,索性自己基于MySQL + Solr寫(xiě)了一個(gè)分布式文件存儲(chǔ)系統(tǒng)庶弃。
2020年疫情期間賦閑在家無(wú)事可干德澈,多年技術(shù)管理已經(jīng)讓我忘記很多編程基礎(chǔ),正好用這個(gè)練手JAVA編程缴守,用當(dāng)下流行的Springboot + MyBatis + Redis + ElasticSearch + MySql + Vue + ElementUI 重新實(shí)現(xiàn)一個(gè)分布式文件存儲(chǔ)系統(tǒng)的前后端镇辉,項(xiàng)目暫且命名BlobGenius
。
1. 設(shè)計(jì)思想與概念
數(shù)據(jù)存儲(chǔ):支持數(shù)據(jù)庫(kù)或文件系統(tǒng)兩種方式鸡捐。數(shù)據(jù)庫(kù)采用MySQL或PostgreSQL等開(kāi)源數(shù)據(jù)庫(kù)麻裁,表獨(dú)立存儲(chǔ)(每個(gè)表一個(gè)存儲(chǔ)目錄煎源,每個(gè)表最大可存儲(chǔ)64TB),InnoDB等支持事物的存儲(chǔ)引擎歇僧;文件系統(tǒng)采用最原始的文件塊機(jī)制锋拖。
數(shù)據(jù)切塊:支持對(duì)大文件對(duì)象或小數(shù)據(jù)對(duì)象分塊存儲(chǔ),大文件采用256KB兽埃、512KB侥钳、1024KB或2048KB四種分塊尺寸,小數(shù)據(jù)對(duì)象采用256B柄错、1KB舷夺、2KB與4KB四種分塊尺寸苦酱,數(shù)據(jù)塊默認(rèn)采用SHA-256哈希算法計(jì)算數(shù)據(jù)校驗(yàn)碼。
數(shù)據(jù)引用:一個(gè)數(shù)據(jù)對(duì)象
DataObject
由多個(gè)數(shù)據(jù)塊DataBlob
組成给猾,一個(gè)數(shù)據(jù)塊也可以是多個(gè)數(shù)據(jù)對(duì)象的組成部分疫萤,兩者是M:N
關(guān)系敢伸,采用引用計(jì)數(shù)實(shí)現(xiàn)扯饶。
數(shù)據(jù)主鍵:數(shù)據(jù)塊
DataBlob
主鍵由SHA-256哈希算法
結(jié)合短碼算法
生成,由12個(gè)字符組成(可表達(dá)62^12個(gè)對(duì)象)详拙,基本可保證不同數(shù)據(jù)的哈希碰撞問(wèn)題帝际,同時(shí),解決相同數(shù)據(jù)重復(fù)存儲(chǔ)問(wèn)題饶辙。
數(shù)據(jù)處理:數(shù)據(jù)塊支持編碼蹲诀、加密與壓縮技術(shù),保障數(shù)據(jù)安全與存儲(chǔ)效率弃揽,加密默認(rèn)采用
AES對(duì)稱(chēng)加密
引擎脯爪,壓縮采用GZIP
算法。
數(shù)據(jù)備份:支持
主從(master-slave)復(fù)制
或對(duì)等復(fù)制
兩種機(jī)制矿微,默認(rèn)采用對(duì)等復(fù)制痕慢。
數(shù)據(jù)要素:數(shù)據(jù)三要素,數(shù)據(jù)對(duì)象-DataObject涌矢、數(shù)據(jù)塊-DataBlob掖举、數(shù)據(jù)引用-DataBlobRef。
DataObject
表達(dá)數(shù)據(jù)描述信息娜庇,包含對(duì)象名稱(chēng)塔次、路徑、大小名秀、擁有者励负、校驗(yàn)碼、創(chuàng)建/訪(fǎng)問(wèn)時(shí)間等信息匕得。
數(shù)據(jù)節(jié)點(diǎn):
DataNode
負(fù)責(zé)存儲(chǔ)DataObject继榆、DataBlobIds或DataBlob,塊數(shù)據(jù)可以采用數(shù)據(jù)庫(kù)或文件系統(tǒng)存儲(chǔ)汁掠,描述信息統(tǒng)一存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)略吨。每個(gè)節(jié)點(diǎn)DataNode
與一個(gè)MySQL
實(shí)例對(duì)應(yīng),一個(gè)物理主機(jī)
可配置多個(gè)MySQL實(shí)例
考阱。
數(shù)據(jù)資源:
DataResource
資源對(duì)象表示一種邏輯資源晋南,如圖片、視頻等羔砾,每種資源都有自己的數(shù)據(jù)三要素负间,一個(gè)數(shù)據(jù)要素由多個(gè)數(shù)據(jù)節(jié)點(diǎn)DataNode
負(fù)責(zé)數(shù)據(jù)存儲(chǔ)。
數(shù)據(jù)路由:數(shù)據(jù)三要素DataObject姜凄、DataBlob政溃、DataBlobRef都有主鍵,系統(tǒng)根據(jù)配置的路由規(guī)則將不同主鍵的記錄分發(fā)到不同的數(shù)據(jù)節(jié)點(diǎn)與數(shù)據(jù)表态秧,實(shí)現(xiàn)
分服務(wù)器與分表存儲(chǔ)
機(jī)制董虱。
對(duì)象搜索:采用
ElasticSearch
支持DataObject
的實(shí)時(shí)索引與全文搜索,解決分服務(wù)器與分表后的統(tǒng)一搜索問(wèn)題申鱼,實(shí)現(xiàn)存儲(chǔ)服務(wù)與搜索服務(wù)分離愤诱。
版本管理:版本管理采用GIT機(jī)制,采用master捐友、brunch與tag支持分支與版本管理淫半,不同分支采用不同目錄存儲(chǔ),同一個(gè)文件的多次提交保存歷史數(shù)據(jù)匣砖。
2. 系統(tǒng)架構(gòu)
2.1 數(shù)據(jù)邏輯
數(shù)據(jù)架構(gòu)包括數(shù)據(jù)資源-DataResource
科吭、映射規(guī)則-DataRule
,數(shù)據(jù)三要素?cái)?shù)據(jù)對(duì)象-DataObject
猴鲫、數(shù)據(jù)塊-DataBlob
对人、數(shù)據(jù)引用-DataBlobRef
,數(shù)據(jù)節(jié)點(diǎn)-DataNode
負(fù)責(zé)數(shù)據(jù)存儲(chǔ)拂共。關(guān)系結(jié)構(gòu)圖如下:
架構(gòu)分析
數(shù)據(jù)資源-
DataResource
牺弄。存儲(chǔ)一組數(shù)據(jù)需要定義一種數(shù)據(jù)資源,系統(tǒng)可以定義若干種數(shù)據(jù)資源宜狐。數(shù)據(jù)對(duì)象-
DataObject
势告。一種數(shù)據(jù)資源可以存儲(chǔ)若干個(gè)數(shù)據(jù)對(duì)象,數(shù)據(jù)對(duì)象可以存放到1個(gè)或若干個(gè)數(shù)據(jù)節(jié)點(diǎn)-DataNode
肌厨,分服務(wù)器或分表的路由規(guī)則由映射規(guī)則-DataRule
對(duì)象定義培慌。數(shù)據(jù)塊-
DataBlob
。數(shù)據(jù)對(duì)象被切分為若干個(gè)數(shù)據(jù)塊存儲(chǔ)柑爸,數(shù)據(jù)塊主鍵根據(jù)數(shù)據(jù)內(nèi)容的SHA-256哈希算法
與短碼算法
生成吵护。數(shù)據(jù)塊引用-
DataBlobRef
。定義數(shù)據(jù)對(duì)象-DataObject
與數(shù)據(jù)塊-DataBlob
的引用關(guān)系表鳍。數(shù)據(jù)節(jié)點(diǎn)-
DataNode
馅而。一個(gè)數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)MySQL實(shí)例,一個(gè)物理主機(jī)可以部署多個(gè)MySQL實(shí)例譬圣。映射規(guī)則-
DataRule
瓮恭。映射規(guī)則根據(jù)對(duì)象主鍵映射存儲(chǔ)的節(jié)點(diǎn)與數(shù)據(jù)表,數(shù)據(jù)三要素均可獨(dú)立定義自己的映射規(guī)則厘熟。
2.2 存儲(chǔ)結(jié)構(gòu)
物理服務(wù)器與數(shù)據(jù)節(jié)點(diǎn)是一對(duì)多關(guān)系屯蹦,數(shù)據(jù)節(jié)點(diǎn)支持?jǐn)?shù)據(jù)庫(kù)與文件系統(tǒng)兩種方式维哈,描述數(shù)據(jù)統(tǒng)一存儲(chǔ)到數(shù)據(jù)庫(kù),塊數(shù)據(jù)內(nèi)容可存儲(chǔ)到數(shù)據(jù)庫(kù)或文件系統(tǒng)登澜。
2.2.1 服務(wù)器
服務(wù)器可以是物理主機(jī)或虛擬主機(jī)阔挠,一個(gè)主機(jī)可以部署多個(gè)數(shù)據(jù)節(jié)點(diǎn),節(jié)點(diǎn)類(lèi)型分為數(shù)據(jù)庫(kù)節(jié)點(diǎn)與文件系統(tǒng)節(jié)點(diǎn)脑蠕。邏輯關(guān)系如下圖:
注意:一個(gè)服務(wù)器可以多少數(shù)據(jù)節(jié)點(diǎn)购撼,需要有CPU、內(nèi)存谴仙、存儲(chǔ)容量迂求、網(wǎng)絡(luò)流量等資源多種綜合因素決定,具體根據(jù)實(shí)際情況定義晃跺。
2.2.2 存儲(chǔ)設(shè)計(jì)
數(shù)據(jù)三要素DataObject揩局、DataBlob或DataBlobRef的描述數(shù)據(jù)統(tǒng)一存儲(chǔ)到數(shù)據(jù)庫(kù),塊數(shù)據(jù)可以選擇數(shù)據(jù)庫(kù)存儲(chǔ)或文件存儲(chǔ)兩種方式哼审。邏輯關(guān)系如下圖:
存儲(chǔ)分析
- 數(shù)據(jù)對(duì)象谐腰。描述一個(gè)文件或自定義對(duì)象,記錄只能存儲(chǔ)到數(shù)據(jù)庫(kù)節(jié)點(diǎn)涩盾。
- 數(shù)據(jù)塊引用十气。一個(gè)數(shù)據(jù)對(duì)象引用多個(gè)數(shù)據(jù)塊,記錄存儲(chǔ)到數(shù)據(jù)庫(kù)節(jié)點(diǎn)春霍。
- 數(shù)據(jù)塊砸西。包括描述數(shù)據(jù)與數(shù)據(jù)二進(jìn)制內(nèi)容,兩者可以統(tǒng)一存儲(chǔ)址儒,數(shù)據(jù)內(nèi)容也可以分離存儲(chǔ)到文件系統(tǒng)芹枷。
2.3 服務(wù)部署
服務(wù)節(jié)點(diǎn)包括接口服務(wù)與存儲(chǔ)服務(wù)。接口服務(wù)支撐REST API訪(fǎng)問(wèn)莲趣,實(shí)現(xiàn)系統(tǒng)集成與二次開(kāi)發(fā)鸳慈,提供對(duì)象管理、數(shù)據(jù)上傳與下載服務(wù)喧伞。存儲(chǔ)服務(wù)提供數(shù)據(jù)庫(kù)節(jié)點(diǎn)與文件系統(tǒng)節(jié)點(diǎn)訪(fǎng)問(wèn)服務(wù)走芋,數(shù)據(jù)庫(kù)節(jié)點(diǎn)通過(guò)MyBatis
訪(fǎng)問(wèn),文件系統(tǒng)節(jié)點(diǎn)通過(guò)TCP
連接訪(fǎng)問(wèn)潘鲫。部署示意圖如下:
2.3.1 對(duì)象管理
對(duì)象管理服務(wù)提供數(shù)據(jù)對(duì)象-DataObject
的增刪改查CRUD服務(wù)翁逞,以及對(duì)象搜索服務(wù),同時(shí)溉仑,數(shù)據(jù)對(duì)象引用若干數(shù)據(jù)塊挖函,服務(wù)提供數(shù)據(jù)塊引用DataBlobRef對(duì)象的增刪改查服務(wù),提供REST API接口服務(wù)浊竟。
2.3.2 上傳服務(wù)
數(shù)據(jù)上傳服務(wù)支持Multipart/form-data
格式的文件或數(shù)據(jù)塊兩種數(shù)據(jù)上傳方式怨喘。注意:完整文件的上傳受到系統(tǒng)限制津畸。數(shù)據(jù)塊上傳最大塊大小為2MB,多個(gè)數(shù)據(jù)塊構(gòu)成一個(gè)完整的數(shù)據(jù)對(duì)象必怜,塊數(shù)據(jù)上傳方式數(shù)據(jù)對(duì)象大小沒(méi)有限制洼畅,支持上傳超大文件,支持?jǐn)帱c(diǎn)續(xù)傳棚赔。
2.3.3 下載服務(wù)
數(shù)據(jù)下載服務(wù)支持application/octet-stream
格式的文件或數(shù)據(jù)塊兩種數(shù)據(jù)下載方式,兩種方式均支持?jǐn)帱c(diǎn)續(xù)傳徘郭。
2.3.4 搜索服務(wù)
對(duì)象搜索服務(wù)采用ElasticSearch實(shí)現(xiàn)對(duì)象實(shí)時(shí)索引與搜索服務(wù)靠益,輔助實(shí)現(xiàn)對(duì)象管理。
2.3.5 消息服務(wù)
消息服務(wù)采用Redis的發(fā)布-訂閱功能残揉,數(shù)據(jù)服務(wù)器存儲(chǔ)數(shù)據(jù)對(duì)象時(shí)胧后,發(fā)布消息通知索引服務(wù)提交ES索引。
2.3.6 文件服務(wù)
文件服務(wù)采用TCP Server抱环,實(shí)現(xiàn)內(nèi)網(wǎng)數(shù)據(jù)塊快速傳輸壳快,提供文件系統(tǒng)數(shù)據(jù)塊存取與管理服務(wù),支持文件塊的CRUD操作镇草。
2.3.7 數(shù)據(jù)庫(kù)服務(wù)
部署MySQL數(shù)據(jù)庫(kù)節(jié)點(diǎn)眶痰,存儲(chǔ)DataObject、DataBlob或DataBlobRef數(shù)據(jù)梯啤,根據(jù)映射規(guī)則-DataRule實(shí)現(xiàn)分服務(wù)器與分表路由規(guī)則竖伯。
2.4 系統(tǒng)設(shè)計(jì)
系統(tǒng)設(shè)計(jì)包括用戶(hù)層、接口層因宇、服務(wù)層七婴、中間層與存儲(chǔ)層。整體設(shè)計(jì)如下圖:
2.4.1 用戶(hù)層
用戶(hù)層包括分布式文件數(shù)據(jù)存儲(chǔ)系統(tǒng)后臺(tái)管理網(wǎng)站與JAVA Client API.
2.4.2 接口層
接口層提供節(jié)點(diǎn)服務(wù)察滑、對(duì)象服務(wù)打厘、上傳服務(wù)、下載服務(wù)與版本控制服務(wù)贺辰。
- 節(jié)點(diǎn)服務(wù)户盯。提供節(jié)點(diǎn)注冊(cè)、性能監(jiān)控魂爪、心跳監(jiān)測(cè)先舷、服務(wù)調(diào)度功能。
- 對(duì)象服務(wù)滓侍。提供數(shù)據(jù)對(duì)象創(chuàng)建蒋川、搜索、刪除與修改功能撩笆。
- 上傳服務(wù)捺球。提供文件與數(shù)據(jù)塊上傳功能缸浦,支持超大文件上傳與斷點(diǎn)續(xù)傳。
- 下載服務(wù)氮兵。提供文件與數(shù)據(jù)塊下載功能裂逐,支持客戶(hù)端數(shù)據(jù)塊錯(cuò)誤報(bào)告與檢查功能,支持大文件下載與斷點(diǎn)續(xù)傳泣栈。
- 版本控制卜高。提供項(xiàng)目創(chuàng)建、分支南片、刪除掺涛、提交、鎖定與解鎖疼进、遷出等功能薪缆。
2.4.3 服務(wù)層
服務(wù)層包括對(duì)象管理、對(duì)象存儲(chǔ)伞广、版本管理拣帽、節(jié)點(diǎn)管理、資源管理嚼锄、用戶(hù)管理减拭、權(quán)限管理與系統(tǒng)監(jiān)控等模塊。
2.4.4 中間層
中間層包括搜索服務(wù)灾票、緩存服務(wù)峡谊、路由服務(wù)、數(shù)據(jù)編碼刊苍、數(shù)據(jù)同步與數(shù)據(jù)備份等服務(wù)既们。
- 搜索服務(wù)。集成Elastic Search正什,提供分散在各服務(wù)器與數(shù)據(jù)表中的數(shù)據(jù)對(duì)象的統(tǒng)一搜索服務(wù)啥纸。
- 緩存服務(wù)。集成Redis婴氮,提供用戶(hù)對(duì)象斯棒、機(jī)構(gòu)對(duì)象、數(shù)據(jù)資源主经、系統(tǒng)配置等常用信息緩存荣暮,利用發(fā)布-訂閱功能實(shí)現(xiàn)數(shù)據(jù)實(shí)施索引,實(shí)現(xiàn)分布式鎖支持版本控制的訪(fǎng)問(wèn)沖突問(wèn)題解決罩驻。
- 路由服務(wù)穗酥。根據(jù)數(shù)據(jù)映射規(guī)則,將不同數(shù)據(jù)資源、記錄類(lèi)型與對(duì)象主鍵分發(fā)到不同數(shù)據(jù)節(jié)點(diǎn)砾跃,存儲(chǔ)到不同數(shù)據(jù)表或文件目錄骏啰。
- 數(shù)據(jù)編碼。數(shù)據(jù)存取時(shí)抽高,提供數(shù)據(jù)編碼判耕、加密、壓縮等數(shù)據(jù)處理功能翘骂,有效保障數(shù)據(jù)安全性與節(jié)省存儲(chǔ)空間壁熄。
- 數(shù)據(jù)同步。利用
線(xiàn)程池-ThreadPool
實(shí)現(xiàn)數(shù)據(jù)對(duì)象-DataObject碳竟、數(shù)據(jù)塊-DataBlob请毛、塊引用-DataBlobRef在不同數(shù)據(jù)節(jié)點(diǎn)同步。 - 數(shù)據(jù)備份瞭亮。支持?jǐn)?shù)據(jù)庫(kù)-數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)-文件系統(tǒng)的
備份-backup
與恢復(fù)-Restore
固棚。
2.4.5 存儲(chǔ)層
數(shù)據(jù)存儲(chǔ)支持?jǐn)?shù)據(jù)庫(kù)節(jié)點(diǎn)與文件系統(tǒng)節(jié)點(diǎn)统翩,數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)使用MyBatis接口,文件系統(tǒng)采用自實(shí)現(xiàn)TCP鏈接訪(fǎng)問(wèn)此洲。
3 發(fā)布計(jì)劃
發(fā)布地址:BlobGenius
4 后記
這個(gè)項(xiàng)目只是一個(gè)簡(jiǎn)單的文件存儲(chǔ)系統(tǒng)厂汗,用于JAVA編程練手,幫助找到以前的編程感覺(jué)呜师,同時(shí)也適合新手學(xué)習(xí)娶桦,后續(xù)有空會(huì)逐步整理部署文檔與API接口文檔。