国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢(xún) 在線咨詢(xún)
18143453325 在線咨詢(xún)
所在位置: 首頁(yè) > 營(yíng)銷(xiāo)資訊 > 網(wǎng)站運(yùn)營(yíng) > (很干)Gitee 圖床又崩了?手把手教你搭建一個(gè)自己的文件系統(tǒng)并開(kāi)源

(很干)Gitee 圖床又崩了?手把手教你搭建一個(gè)自己的文件系統(tǒng)并開(kāi)源

時(shí)間:2023-04-30 13:30:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-04-30 13:30:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

(很干)Gitee 圖床又崩了?手把手教你搭建一個(gè)自己的文件系統(tǒng)并開(kāi)源:

前言

前段時(shí)間Gitee圖床突然"暴雷",導(dǎo)致許多寫(xiě)作者筆記、博客、網(wǎng)站等圖片全部無(wú)法訪問(wèn),一時(shí)間哀怨四起,大家也紛紛意識(shí)到圖片備份的重要性,博主也在上面許多作者的行列中,花費(fèi)了一天時(shí)間恢復(fù)博客、以及個(gè)人網(wǎng)站的圖片,同時(shí)遷移到騰訊OSS上,也開(kāi)始著手搭建個(gè)人的文件系統(tǒng)平臺(tái)。

在日常業(yè)務(wù)開(kāi)發(fā)中,文件存儲(chǔ)無(wú)處不在,小到圖片存儲(chǔ)訪問(wèn),大到svg、zip、視頻、音頻等文件上傳下載,如何將這些文件進(jìn)行存儲(chǔ),并提供訪問(wèn)呢?此時(shí)就離不開(kāi)文件系統(tǒng)了。

本篇文章內(nèi)容:「詳細(xì)介紹如何在海量文件系統(tǒng)中選擇合適的文件系統(tǒng)、完成自己的文件系統(tǒng)搭建、并使用程序完成文件的上傳下載功能。」

「閱讀說(shuō)明:」 如果只是了解如何搭建和使用程序?qū)崿F(xiàn)文件上傳、下載,可直接通過(guò)目錄跳轉(zhuǎn)到對(duì)應(yīng)章節(jié),無(wú)需閱讀完全文。

微信圖片_20220326213321

數(shù)據(jù)類(lèi)型劃分

在引入文件系統(tǒng)之前,先來(lái)認(rèn)識(shí)下相關(guān)的概念,可以更好地幫助了解后續(xù)的文件系統(tǒng)。「在計(jì)算機(jī)世界中,數(shù)據(jù)可以簡(jiǎn)單分為:結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù)三大類(lèi)?!?/b>

結(jié)構(gòu)化數(shù)據(jù):

「指的是能夠根據(jù)預(yù)定義的模型結(jié)構(gòu)化或者預(yù)定義的方式組織的數(shù)據(jù)?!?/b> 簡(jiǎn)單來(lái)說(shuō),能夠?qū)⑿畔⑹褂媚撤N統(tǒng)一的結(jié)構(gòu)(如數(shù)字、文字、符號(hào)等)加以表示,該種數(shù)據(jù)可以被稱(chēng)為結(jié)構(gòu)化數(shù)據(jù)。

通常結(jié)構(gòu)化數(shù)據(jù)可以通過(guò)關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)和管理,具體表現(xiàn)為二維形式,以行為單位,每行可以表示一個(gè)實(shí)體的信息,每行的數(shù)據(jù)屬性都是相同的。

示例圖片:

image-20220730184544980

非結(jié)構(gòu)化數(shù)據(jù):

「與結(jié)構(gòu)化數(shù)據(jù)相反,該類(lèi)型的數(shù)據(jù)沒(méi)有一定預(yù)定義好的數(shù)據(jù)模型或者沒(méi)有一個(gè)預(yù)定義的方式來(lái)組織的數(shù)據(jù)」,如音頻、視頻、圖片、郵件等。「該種類(lèi)型的數(shù)據(jù)沒(méi)有一個(gè)固定的結(jié)構(gòu),格式可能是多種多樣的。」

示例圖片:

image-20220730185035874

半結(jié)構(gòu)化數(shù)據(jù):

介于結(jié)構(gòu)化(如關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù))和非結(jié)構(gòu)數(shù)據(jù)(音頻、視頻、圖片等)之間的一種數(shù)據(jù),**它可以是自描述的(即結(jié)構(gòu)可以是自定義,格式并不固定,如相同的鍵值下存儲(chǔ)的數(shù)據(jù)可能是數(shù)值、字符、列表等,結(jié)構(gòu)和內(nèi)容是混在一起的,無(wú)明顯區(qū)分)**,常見(jiàn)的如JSON、XML,HTML文檔等。

示例圖片:

image-20220730185349057

分布式文件系統(tǒng)

在上文談到了數(shù)據(jù)類(lèi)型的劃分,「通常結(jié)構(gòu)性數(shù)據(jù)都可以通過(guò)關(guān)系型數(shù)據(jù)進(jìn)行存儲(chǔ)和管理,而如果想管理非結(jié)構(gòu)性數(shù)據(jù),則需要使用到文件系統(tǒng)?!?/b>

文件系統(tǒng)又可以分為:「一般(本地)文件系統(tǒng)和分布式文件系統(tǒng),具體特點(diǎn)如下:」

image-20220730191343614
「根據(jù)存儲(chǔ)需求,我們還可以將文件系統(tǒng)簡(jiǎn)單劃分為“第三方文件系統(tǒng)”和“己方文件系統(tǒng)”。」

「“第三方文件系統(tǒng)”:即可以通過(guò)購(gòu)買(mǎi)第三方廠商已經(jīng)搭建好的文件系統(tǒng),實(shí)現(xiàn)非結(jié)構(gòu)類(lèi)型數(shù)據(jù)存儲(chǔ),常見(jiàn)的有阿里云的OSS、騰訊云的OSS等」,這種類(lèi)型特點(diǎn)就是簡(jiǎn)單,能夠購(gòu)買(mǎi)即可使用,缺點(diǎn)就是數(shù)據(jù)需要存儲(chǔ)在第三方,對(duì)于一些敏感數(shù)據(jù)可能會(huì)存在風(fēng)險(xiǎn)。

「“己方文件系統(tǒng)”:即可以通過(guò)開(kāi)源或者第三方組件,在自己服務(wù)器中搭建屬于自己的文件系統(tǒng),常見(jiàn)用于搭建文件系統(tǒng)的框架有:Seaweedfs、FastDfs、MinIO、Ceph、HDFS、TFS等?!?/b> 這類(lèi)型的特點(diǎn)就是數(shù)據(jù)能夠存儲(chǔ)在自己的服務(wù)器,能夠最大程度控制安全問(wèn)題,許多國(guó)企項(xiàng)目有這種強(qiáng)制要求,缺點(diǎn)就是搭建過(guò)程比直接購(gòu)買(mǎi)第三方的服務(wù)更復(fù)雜,需要成本更高,且需要自己維護(hù)。

「兩種類(lèi)型對(duì)比:」

image-20220730193952854
簡(jiǎn)單地對(duì)文件系統(tǒng)類(lèi)型進(jìn)行了分析后,「下面就開(kāi)始對(duì)搭建“己方文件系統(tǒng)”時(shí)技術(shù)選型因素做一個(gè)詳細(xì)介紹,以便最大程度選擇適合自己的文件系統(tǒng)組件。」

技術(shù)選型

在搭建文件系統(tǒng)時(shí),主要考慮了以下幾個(gè)緯度指標(biāo)進(jìn)行技術(shù)選型:

  • 「易用性:」 該文件系統(tǒng)主要用于博客圖片等海量小文件存儲(chǔ),對(duì)應(yīng)文件系統(tǒng)應(yīng)該是輕量級(jí)的,且易于搭建和管理
  • 「可靠性:」 使用文件系統(tǒng)進(jìn)行統(tǒng)一文件管理,那么就要保證考慮單點(diǎn)故障問(wèn)題,保障文件的高可用性
  • 「拓展性:」 隨著時(shí)間積累,小文件的累計(jì)也會(huì)變成"大文件",因此文件系統(tǒng)的是否易于拓展也是選型中一重要考慮指標(biāo)
  • 「社區(qū)活躍度:」 社區(qū)活躍度高的第三方組件,社區(qū)的文檔、采坑經(jīng)驗(yàn)、更新迭代等會(huì)更加完善,能夠幫助快速集成,定位問(wèn)題,減少風(fēng)險(xiǎn)。
  • 「節(jié)約成本:」 存儲(chǔ)海量文件,占用的磁盤(pán)空間大小、訪問(wèn)時(shí)需要的資源也不容小覷,節(jié)約成本也是選型需要考慮的又一重要因素

Seaweedfs

「一款A(yù)pache基金會(huì)開(kāi)源項(xiàng)目,基于go語(yǔ)言開(kāi)發(fā)的高度可拓展開(kāi)源的分布式存儲(chǔ)系統(tǒng)、它支持基于Restful API風(fēng)格進(jìn)行增、刪、查操作,非常適用于處理小文件。」 設(shè)計(jì)之初是為了對(duì)Facebook的一篇論文的實(shí)現(xiàn),用于優(yōu)化內(nèi)部圖片的存儲(chǔ)和獲取,后來(lái)在此基礎(chǔ)上進(jìn)行不同迭代,從而得出seaweedfs產(chǎn)品。

官方描述,它具有以下特點(diǎn):

  • 存儲(chǔ)數(shù)十億的文件(storeage billions of files)
  • 快速獲取文件(serve the files fast)
  • O(1)磁盤(pán)讀取速度
image-20220730200529947

Seaweedfs組成

說(shuō)明:圖源網(wǎng)絡(luò)(侵聯(lián)刪)

seaweedfs架構(gòu)

Seaweedfs核心概念介紹

  • 「Node:」 系統(tǒng)抽象節(jié)點(diǎn),具體實(shí)現(xiàn)有DataCenter、Rack、DataNode,可以理解成編程語(yǔ)言中的接口。
  • 「DataCenter:」 數(shù)據(jù)中心,對(duì)應(yīng)現(xiàn)實(shí)生活中的機(jī)房,可以存在多個(gè)。
  • 「Rack:」 機(jī)架,對(duì)應(yīng)現(xiàn)實(shí)生活中機(jī)房存放服務(wù)器的機(jī)架,一個(gè)DataCenter中可以存在多個(gè)Rack,但是一個(gè)Rack只能屬于一個(gè)DataCenter。
  • 「DataNode:」 具體的存儲(chǔ)節(jié)點(diǎn),用于管理、存儲(chǔ)邏輯卷(Volume)
  • 「Master:」 用于管理文件卷與服務(wù)器磁盤(pán)的映射(即管理存儲(chǔ)文件和fid之間的映射關(guān)系)
  • 「Volume:」 邏輯卷,存儲(chǔ)的邏輯結(jié)構(gòu),在它之下是使用Needle來(lái)存儲(chǔ)具體的文件
  • 「Needle:」 邏輯卷中實(shí)際的存儲(chǔ)對(duì)象,存儲(chǔ)真實(shí)文件
  • 「Collection:」 文件集,可以分布在多個(gè)邏輯卷上,如果在存儲(chǔ)文件的時(shí)候沒(méi)有指定collection,則默認(rèn)使用""
image-20220730214816053

Seaweedfs特點(diǎn)分析

  • 「易用性:」 Seaweedfs支持使用二進(jìn)制(解壓運(yùn)行即可)、Docker、編譯源碼等方式部署,支持Restful API風(fēng)格完成增刪改等操作,簡(jiǎn)單方便,且提供了可視化界面,方便運(yùn)維和管理。
  • 「可靠性:」 Seaweedfs支持多Master節(jié)點(diǎn)和備份機(jī)制,能夠有效避免單點(diǎn)故障
  • 「拓展性:」 Seaweedfs一個(gè)Master節(jié)點(diǎn)下可掛載多個(gè)Volume節(jié)點(diǎn),空間不足時(shí),可以添加磁盤(pán)或者機(jī)器啟動(dòng)新的Volume實(shí)現(xiàn)拓展存儲(chǔ)。
  • 「社區(qū)活躍性:」 Seaweedfs作為Apache基金會(huì)下的開(kāi)源項(xiàng)目,在Github上已經(jīng)14.9K的star,且官方提供了詳細(xì)的項(xiàng)目介紹文檔和部署文檔,社區(qū)活躍度相比同類(lèi)產(chǎn)品也是非常不錯(cuò)。
  • 「節(jié)約成本:」 Seaweedfs官方描述,每個(gè)文件的元數(shù)據(jù)只有40字節(jié)的磁盤(pán)存儲(chǔ)開(kāi)銷(xiāo)。O(1)磁盤(pán)讀取,且對(duì)大數(shù)據(jù)量的小文件存儲(chǔ)進(jìn)行了優(yōu)化,意味著能用更少的空間存儲(chǔ)更多的資源,節(jié)省開(kāi)支成本。
image-20220730214008110
綜上分析,「可以發(fā)現(xiàn)Seaweedfs具有的特點(diǎn)能夠完美契合我們?cè)诩夹g(shù)選型時(shí)考慮的因素,因此,使用Seaweedfs框架搭建文件系統(tǒng)是相對(duì)合適的,下面就開(kāi)始實(shí)戰(zhàn)篇章-完成對(duì)Seaweedfs的搭建和使用?!?/b>

實(shí)戰(zhàn)-使用Seaweedfs搭建文件服務(wù)器

在開(kāi)始搭建之前,先簡(jiǎn)單介紹下Seaweedfs中不同模塊的具體作用:

  • 「Weed master :」 開(kāi)啟一個(gè)master服務(wù)器
  • 「Weed volume :」 開(kāi)啟一個(gè)volume 服務(wù)器
  • 「Weed filer :」 開(kāi)啟一個(gè)指向一個(gè)或多個(gè)master服務(wù)器的file服務(wù)器
  • 「Weed upload:」 上傳一個(gè)或多個(gè)文件
  • 「Weed server:」 啟動(dòng)一個(gè)服務(wù)器,包括一個(gè)volume服務(wù)器和自動(dòng)選舉一個(gè)master服務(wù)器

搭建Seaweedfs文件服務(wù)器

說(shuō)明:Seaweedfs是基于Go語(yǔ)言開(kāi)發(fā),它支持通過(guò)weed進(jìn)行源碼編譯安裝(需有g(shù)o環(huán)境,該方式主要是對(duì)seaweedfs有自定義拓展的時(shí)候使用),同時(shí)它也提供已經(jīng)編譯好的二級(jí)制包,可以直接解壓使用(無(wú)需依賴(lài)Go環(huán)境,演示使用該種方式)

本次演示的Seaweedfs版本為:0.99,目的是方便后續(xù)使用JAVA程序集成Seaweedfs,因?yàn)槭褂肧eaweedfs較高的版本,第三方提供的Seaweedfs客戶(hù)端會(huì)有一些問(wèn)題。

「一、上傳壓縮包并解壓」

  • rz -be xx.seaweedfs.tar.gz 上傳文件
  • tar -zxvf seaweedfs-0.99.tar.gz 解壓文件
image-20220730220244681
「二、啟動(dòng)Master和Volume服務(wù)」

說(shuō)明:因?yàn)楸酒恼缕^長(zhǎng),所以不在此處詳細(xì)介紹啟動(dòng)參數(shù)的具體含義,有需要的可以參考官方網(wǎng)站或者下面這篇博客,都已經(jīng)描述得非常清楚。

  • /usr/local/seaweedfs0.99/seaweedfs/sbin/weed master -mdir=/usr/local/seaweedfs0.99/seaweedfs/data/master -port=9333 -defaultReplication=000 -ip=xxx主服務(wù)IP地址 啟動(dòng)master主服務(wù)
  • /usr/local/seaweedfs0.99/seaweedfs/sbin/weed volume -dataCenter=dataCenter1 -rack=rack1 -dir=/usr/local/seaweedfs0.99/seaweedfs/data/volume -max=5 -mserver=主服務(wù)IP地址:9333(端口) -port=9040 -ip=服務(wù)ip地址- 啟動(dòng)volume服務(wù)
image-20220730220735729
「三、瀏覽器訪問(wèn)可視化界面」

  • http://ip地址:9333/
image-20220730220844566

JAVA程序集成Seaweedfs完成程序操作文件系統(tǒng)

說(shuō)明:因?yàn)槲淖制?,演示只放部分核心代碼,全部源碼已經(jīng)開(kāi)發(fā)到【輪子之王】開(kāi)源項(xiàng)目中,歡迎大家到下面地址訪問(wèn)獲取(如有幫助,可給star哦)。

  • Gitee地址:輪子之王
  • Github地址:輪子之王
「一、引入客戶(hù)端依賴(lài)和配置」

// 依賴(lài) <dependency> <groupId>org.lokra.seaweedfs</groupId> <artifactId>seaweedfs-client</artifactId> <version>0.7.3.RELEASE</version> </dependency> // seaweedfs文件服務(wù)器信息seaweedfs: host: 127.0.0.1 port: 9333「二、封裝操作系統(tǒng)工具類(lèi)」

/** * @description: 上傳單個(gè)文件到文件服務(wù)器 * @param: file * @return: 文件的fid + 文件的請(qǐng)全訪問(wèn)地址 * @author: it */ public String uploadFile(MultipartFile file) throws Exception { FileSource fileSource = getFileSource(); FileTemplate fileTemplate = new FileTemplate(fileSource.getConnection()); // 上傳文件 FileHandleStatus handleStatus = fileTemplate.saveFileByStream(file.getOriginalFilename(), file.getInputStream(), contentType); // 獲取上傳文件的訪問(wèn)地址 String fileUrl = fileTemplate.getFileUrl(handleStatus.getFileId()); // 關(guān)閉當(dāng)前連接 fileSource.shutdown(); return handleStatus.getFileId() + StrUtil.DASHED + fileUrl; } /** * @description: 根據(jù)文件ID刪除文件 * @author: it */ public void deleteFileByFid(String fileId) throws Exception { FileSource fileSource = getFileSource(); FileTemplate fileTemplate = new FileTemplate(fileSource.getConnection()); fileTemplate.deleteFile(fileId); fileSource.shutdown(); } /** * @description: 根據(jù)文件下載文件 * @param: fid * @param: response * @param: fileName * @author: it */ public void downloadFileByFid(HttpServletResponse response, HttpServletRequest request, String fid, String fileName) throws Exception { FileSource fileSource = getFileSource(); FileTemplate fileTemplate = new FileTemplate(fileSource.getConnection()); StreamResponse fileStream = fileTemplate.getFileStream(fid); // 設(shè)置響應(yīng)頭 response.setContentType(CommonConstant.CONTENT_TYPE); response.setCharacterEncoding(CommonConstant.UTF_8); String encodeFileName = buildingFileNameAdapterBrowser(request, fileName); response.setHeader(CommonConstant.CONTENT_DISPOSITION, CommonConstant.ATTACHMENT_FILENAME + encodeFileName); // 讀取并寫(xiě)入到響應(yīng)輸出 InputStream inputStream = fileStream.getInputStream(); byte[] fileByte = new byte[inputStream.available()]; inputStream.read(fileByte); response.getOutputStream().write(fileByte); response.getOutputStream().flush(); fileSource.shutdown(); }「三、測(cè)試結(jié)果」

說(shuō)明:每次文件成功上傳后都會(huì)給對(duì)應(yīng)的文件生成唯一的fid,對(duì)文件的刪、查都通過(guò)該fid實(shí)現(xiàn)。

1、上傳文件

image-20220730221931335
2、下載文件

image-20220730222053104
3、刪除文件

image-20220730222126731

寫(xiě)在最后

至此,從文件系統(tǒng)的選型、搭建到程序集杭州已完成,「但該文件系統(tǒng)與第三方OSS服務(wù)還有一個(gè)小的區(qū)別,就是無(wú)法使用類(lèi)似PicGo的工具將它做成對(duì)應(yīng)的圖床,這個(gè)有需要的話后續(xù)再研究做個(gè)開(kāi)源插件吧。」

"冰凍三尺非一日之寒",從了解一門(mén)技術(shù)到真正使用它,需要用非常多的時(shí)間去認(rèn)識(shí)熟悉。「寫(xiě)作也是如此,希望后續(xù)能夠輸出更多優(yōu)質(zhì)的文章幫助大家,大家有任何想法也可以在文章下方留言,如果覺(jué)得文章有幫助,歡迎給博主點(diǎn)贊、關(guān)注?!?/b>

文章中所有源碼已開(kāi)源到輪子之王項(xiàng)目,有需要者可通過(guò)下方鏈接跳轉(zhuǎn):

  • Gitee地址:輪子之王
  • Github地址:輪子之王

關(guān)鍵詞:文件,系統(tǒng),把手

74
73
25
news
  • 網(wǎng)站
  • 營(yíng)銷(xiāo)
  • 設(shè)計(jì)
  • 運(yùn)營(yíng)
  • 優(yōu)化
  • 效率
  • 專(zhuān)注
  • 電商
  • 方案
  • 推廣
為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉