一.什么是分布式文件系統(tǒng)及拓展知識(shí)
分布式文件系統(tǒng)(Distributed file system创千,DFS),或是網(wǎng)絡(luò)文件系統(tǒng)(Network File System)入偷,是一種允許文件透過(guò)網(wǎng)絡(luò)在多臺(tái)主機(jī)上分享的文件系統(tǒng)签餐,可讓多機(jī)器上的多用戶分享文件和存儲(chǔ)空間。分布式文件系統(tǒng)解決的最大的問(wèn)題是資源共享的問(wèn)題盯串,因此分布式文件系統(tǒng)最大的特點(diǎn)是多個(gè)客戶端可以訪問(wèn)相同的服務(wù)端。
1.存儲(chǔ)方式
塊存儲(chǔ)戒良、文件存儲(chǔ)体捏、對(duì)象存儲(chǔ)
1.1 塊存儲(chǔ)
就好比硬盤一樣,直接掛在到主機(jī)糯崎, 一般用于主機(jī)的直接存儲(chǔ)空間和數(shù)據(jù)庫(kù)應(yīng)用(MySQL)的存儲(chǔ)
塊存儲(chǔ)(DAS/SAN)通常應(yīng)用在某些專有的系統(tǒng)中几缭,這類應(yīng)用要求很高的隨機(jī)讀寫性能和高可靠性,上面搭載的通常是 Oracle/DB2 這種傳統(tǒng)數(shù)據(jù)庫(kù)沃呢,連接通常是以 FC 光纖(8Gb/16Gb)為主年栓,走光纖協(xié)議。如果要求稍低一些薄霜,也會(huì)出現(xiàn)基于千兆/萬(wàn)兆以太網(wǎng)的連接方式某抓,MySQL 這種數(shù)據(jù)庫(kù)就可能會(huì)使用 IP SAN,走 iSCSI 協(xié)議
通常使用塊存儲(chǔ)的都是系統(tǒng)而非用戶惰瓜,并發(fā)訪問(wèn)不會(huì)很多否副,經(jīng)常出現(xiàn)一套存儲(chǔ)只服務(wù)一個(gè)應(yīng)用系統(tǒng),例如如交易系統(tǒng)崎坊,計(jì)費(fèi)系統(tǒng)备禀。典型行業(yè)如金融,制造奈揍,能源曲尸,電信等
1.2 文件存儲(chǔ)
文件存儲(chǔ)(NAS)相對(duì)來(lái)說(shuō)就更能兼顧多個(gè)應(yīng)用和更多用戶訪問(wèn),同時(shí)提供方便的數(shù)據(jù)共享手段
在 PC 時(shí)代男翰,數(shù)據(jù)共享也大多是用文件的形式另患,比如常見(jiàn)的的 FTP 服務(wù),NFS 服務(wù)奏篙,Samba 共享這些都是屬于典型的文件存儲(chǔ)柴淘。幾十個(gè)用戶甚至上百用戶的文件存儲(chǔ)共享訪問(wèn)都可以用 NAS 存儲(chǔ)加以解決
在中小企業(yè)市場(chǎng)迫淹,一兩臺(tái) NAS 存儲(chǔ)設(shè)備就能支撐整個(gè) IT 部門了。CRM 系統(tǒng)为严,SCM 系統(tǒng)敛熬,OA 系統(tǒng),郵件系統(tǒng)都可以使用 NAS 存儲(chǔ)統(tǒng)統(tǒng)搞定第股。甚至在公有云發(fā)展的早幾年应民,用戶規(guī)模沒(méi)有上來(lái)時(shí),云存儲(chǔ)的底層硬件也有用幾套 NAS 存儲(chǔ)設(shè)備就解決的夕吻,甚至云主機(jī)的鏡像也有放在 NAS 存儲(chǔ)上的例子
文件存儲(chǔ)的廣泛兼容性和易用性诲锹,是這類存儲(chǔ)的突出特點(diǎn),但是從性能上來(lái)看涉馅,相對(duì) SAN 就要低一些归园。NAS 存儲(chǔ)基本上是以太網(wǎng)訪問(wèn)模式,普通千兆網(wǎng)稚矿,走 NFS/CIFS 協(xié)議
1.3 對(duì)象存儲(chǔ)
前面說(shuō)到的塊存儲(chǔ)和文件存儲(chǔ)庸诱,基本上都還是在專有的局域網(wǎng)絡(luò)內(nèi)部使用,而對(duì)象存儲(chǔ)的優(yōu)勢(shì)場(chǎng)景卻是互聯(lián)網(wǎng)或者公網(wǎng)晤揣,主要解決海量數(shù)據(jù)桥爽,海量并發(fā)訪問(wèn)的需求
基于互聯(lián)網(wǎng)的應(yīng)用才是對(duì)象存儲(chǔ)的主要適配(當(dāng)然這個(gè)條件同樣適用于云計(jì)算,基于互聯(lián)網(wǎng)的應(yīng)用最容易遷移到云上)昧识,基本所有成熟的公有云都提供了對(duì)象存儲(chǔ)產(chǎn)品钠四,不管是國(guó)內(nèi)還是國(guó)外
對(duì)象存儲(chǔ)常見(jiàn)的適配應(yīng)用如網(wǎng)盤、媒體娛樂(lè)跪楞,醫(yī)療 PACS缀去,氣象,歸檔等數(shù)據(jù)量超大而又相對(duì) 冷數(shù)據(jù) 和非在線處理的應(yīng)用類型习霹,這類應(yīng)用單個(gè)數(shù)據(jù)大朵耕,總量也大,適合對(duì)象存儲(chǔ)海量和易擴(kuò)展的特點(diǎn)
網(wǎng)盤類應(yīng)用也差不多淋叶,數(shù)據(jù)總量很大阎曹,另外還有并發(fā)訪問(wèn)量也大,支持 10 萬(wàn)級(jí)用戶訪問(wèn)這種需求就值得單列一個(gè)項(xiàng)目了煞檩。歸檔類應(yīng)用只是數(shù)據(jù)量大的 冷數(shù)據(jù)处嫌,并發(fā)訪問(wèn)的需求倒是不太突出
另外基于移動(dòng)端的一些新興應(yīng)用也是適合的,智能手機(jī)和移動(dòng)互聯(lián)網(wǎng)普及的情況下斟湃,所謂 UGD(用戶產(chǎn)生的數(shù)據(jù)熏迹,手機(jī)的照片視頻)總量和用戶數(shù)都是很大挑戰(zhàn)。畢竟直接使用 HTTP get/put 就能直接實(shí)現(xiàn)數(shù)據(jù)存取凝赛,對(duì)移動(dòng)應(yīng)用來(lái)說(shuō)還是有一定吸引力的
對(duì)象存儲(chǔ)的訪問(wèn)通常是在互聯(lián)網(wǎng)注暗,走 HTTP 協(xié)議坛缕,性能方面,單獨(dú)看一個(gè)連接的是不高的(還要解決掉線斷點(diǎn)續(xù)傳之類的可靠性問(wèn)題)捆昏,主要強(qiáng)大的地方是支持的并發(fā)數(shù)量赚楚,聚合起來(lái)的性能帶寬就非常可觀了
1.4 性能對(duì)比
- 塊存儲(chǔ)就像超跑骗卜,根本不在意能不能多載幾個(gè)人宠页,要的就是極限速度和高速下的穩(wěn)定性和可靠性,各大廠商出新產(chǎn)品都要去紐北賽道刷個(gè)單圈最快紀(jì)錄寇仓,千方百計(jì)就為提高一兩秒举户。塊存儲(chǔ)容量也不大,TB 這個(gè)數(shù)量級(jí)遍烦,支持的應(yīng)用和適用的環(huán)境也比較專業(yè)(FC+Oracle)俭嘁,在乎的都是 IOPS 的性能值
- 文件存儲(chǔ)像集卡,普適各種場(chǎng)合服猪,又能裝數(shù)據(jù)(數(shù)百TB)兄淫,而且兼容性好,只要你是文件蔓姚,各種貨物都能往里塞,在不超過(guò)性能載荷的前提下慨丐,能拉動(dòng)常見(jiàn)的各種系統(tǒng)坡脐。標(biāo)準(zhǔn) POXIS 接口,后車門打開(kāi)就能裝卸房揭”赶校卡車也不挑路,不像塊存儲(chǔ)非要上賽道才能開(kāi)捅暴,普通的千兆公路就能暢通無(wú)阻恬砂。速度雖然沒(méi)有塊存儲(chǔ)超跑那么塊,但跑個(gè) 80/100 碼還是穩(wěn)穩(wěn)當(dāng)當(dāng)
- 對(duì)象存儲(chǔ)就像海運(yùn)貨輪蓬痒,應(yīng)對(duì)的是"真·海量"泻骤,幾十上百 PB 的數(shù)據(jù),以集裝箱 /container(桶/bucket)為單位碼得整整齊齊梧奢,里面裝滿各種對(duì)象數(shù)據(jù)狱掂,十萬(wàn)客戶發(fā)的貨(數(shù)據(jù)),一條船就都處理得過(guò)來(lái)亲轨,按照鍵值(KeyVaule)記得清清楚楚趋惨。海運(yùn)速度慢是慢點(diǎn),有時(shí)候遇到點(diǎn)網(wǎng)絡(luò)風(fēng)暴還不穩(wěn)定惦蚊,但支持?jǐn)帱c(diǎn)續(xù)傳器虾,最終還是能安全送達(dá)的讯嫂,對(duì)大宗貨物尤其是非結(jié)構(gòu)化數(shù)據(jù),整體上來(lái)看是最快捷便利的
1.5 訪問(wèn)方式
- 塊存儲(chǔ)通常都是通過(guò)光纖網(wǎng)絡(luò)連接兆沙,服務(wù)器/小機(jī)上配置 FC 光纖 HBA 卡欧芽,通過(guò)光纖交換機(jī)連接存儲(chǔ)(IP SAN 可以通過(guò)千兆以太網(wǎng),以 iSCSI 客戶端連接存儲(chǔ))挤悉,主機(jī)端以邏輯卷(Volume)的方式訪問(wèn)渐裸。連接成功后,應(yīng)用訪問(wèn)存儲(chǔ)是按起始地址装悲,偏移量 Offset 的方法來(lái)訪問(wèn)的
- 文件存儲(chǔ)通常只要是局域網(wǎng)內(nèi)昏鹃,千兆/百兆的以太網(wǎng)環(huán)境皆可。網(wǎng)線連上诀诊,服務(wù)器端通過(guò)操作系統(tǒng)內(nèi)置的 NAS 客戶端洞渤,如 NFS/CIFS/FTP 客戶端掛載存儲(chǔ)成為一個(gè)本地的文件夾后訪問(wèn),只要符合 POXIS 標(biāo)準(zhǔn)属瓣,應(yīng)用就可以用標(biāo)準(zhǔn)的 open载迄,seek,write/read抡蛙,close 這些方法對(duì)其訪問(wèn)操作
- 對(duì)象存儲(chǔ)不在乎網(wǎng)絡(luò)护昧,而且它的訪問(wèn)比較有特色,只能存取刪(put/get/delete)粗截,不能打開(kāi)修改存盤惋耙。只能取下來(lái)改好后上傳,去覆蓋原對(duì)象
2. 文件系統(tǒng)
開(kāi)源分布式存儲(chǔ)系統(tǒng)對(duì)比熊昌,還有很多其他绽榛,這里只列舉這幾款
存儲(chǔ)系統(tǒng) | Ceph | Swift | HDFS | FastDFS | Ambry | MinIO |
---|---|---|---|---|---|---|
開(kāi)發(fā)語(yǔ)言 | C++ | Python | Java | C | Java | Go |
開(kāi)源協(xié)議 | LGPL | Apache | Apache | GPL3 | Apache | Apache |
存儲(chǔ)方式 | 對(duì)象/文件/塊 | 對(duì)象 | 文件 | 文件/塊 | 對(duì)象 | 對(duì)象 |
在線擴(kuò)容 | 支持 | 支持 | 支持 | 支持 | 支持 | - |
冗余備份 | 支持 | 支持 | 支持 | 支持 | 支持 | - |
單點(diǎn)故障 | 不存在 | 不存在 | 存在 | 不存在 | 不存在 | - |
易用性 | 一般 | 一般 | 一般 | 簡(jiǎn)單 | 簡(jiǎn)單 | 簡(jiǎn)單 |
跨集群 | 不支持 | - | 不支持 | 部分支持 | 不支持 | - |
適用場(chǎng)景 | 大中小文件 | 大中小文件 | 大中文件 | 中小文件 | 大中小文件 | 大中小文件 |
對(duì)比了 Github 的 Star,MinIO 增長(zhǎng)的很快婿屹,而且官方還有中文文檔提供灭美,中小企業(yè)使用不錯(cuò)
二. docker安裝Minio
2.1 拉取Minio docker鏡像
docker pull minio //這里我是拉取的最新的鏡像
2.2 運(yùn)行鏡像
docker run -p 9000:9000 -p 9090:9090 --name minio \
-d --restart=always \
-e MINIO_ACCESS_KEY=minio \
-e MINIO_SECRET_KEY=minio@123 \
-v /usr/local/minio/data:/data \
-v /usr/local/minio/config:/root/.minio \
minio/minio server /data --console-address ":9000" --address ":9090"
9000是minio控制臺(tái)端口
9090是api交互端口
三. JavaSDK使用
3.1 上傳文件
minioClient = MinioClient.builder().endpoint(Url).credentials(AccessKey,SecretKey).build();
// Make 'asiatrip' bucket if not exist.
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket(Bucket).build());
if (!found) {
// Make a new bucket called 'asiatrip'.
//minioClient.makeBucket(MakeBucketArgs.builder().bucket("asiatrip").build());
System.out.println("不存在!!!");
} else {
System.out.println("Bucket already exists.");
}
// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
// 'asiatrip'.
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket(Bucket)
.object("筆記.zip")
.filename("/Users/woods/candaoCodes/woodsTest/src/main/resources/筆記.zip")
.build());
3.2 下載文件
minioClient = MinioClient.builder().endpoint(Url).credentials(AccessKey,SecretKey).build();
String presignedObjectUrl = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(Bucket)
.object("筆記.zip")
.expiry(10000)
.build());
System.out.println(presignedObjectUrl); //下載鏈接