一、概述
MinIO
是在GNU Affero
通用公共許可證 v3.0 下發(fā)布的高性能對(duì)象存儲(chǔ)。它與 Amazon S3 云存儲(chǔ)服務(wù) API 兼容。使用 MinIO 為機(jī)器學(xué)習(xí)、分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載構(gòu)建高性能基礎(chǔ)架構(gòu)。
官方文檔:https://docs.min.io/
中文文檔:http://docs.minio.org.cn/docs/
GitHub 地址:https://github.com/minio/minio
特點(diǎn):
- 數(shù)據(jù)保護(hù)——分布式 Minio 采用 糾刪碼來防范多個(gè)節(jié)點(diǎn)宕機(jī)和位衰減 bit rot。分布式 Minio 至少需要 4 個(gè)硬盤,使用分布式 Minio 自動(dòng)引入了糾刪碼功能。
- 高可用——單機(jī) Minio 服務(wù)存在單點(diǎn)故障,相反,如果是一個(gè)有 N 塊硬盤的分布式 Minio,只要有 N/2 硬盤在線,你的數(shù)據(jù)就是安全的。不過你需要至少有 N/2+1 個(gè)硬盤來創(chuàng)建新的對(duì)象。
例如,一個(gè) 16 節(jié)點(diǎn)的 Minio 集群,每個(gè)節(jié)點(diǎn) 16 塊硬盤,就算 8 臺(tái)服務(wù)器宕機(jī),這個(gè)集群仍然是可讀的,不過你需要 9 臺(tái)服務(wù)器才能寫數(shù)據(jù)。
【溫馨提示】只要遵守分布式 Minio 的限制,你可以組合不同的節(jié)點(diǎn)和每個(gè)節(jié)點(diǎn)幾塊硬盤。比如,你可以使用 2 個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn) 4 塊硬盤,也可以使用 4 個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)兩塊硬盤,諸如此類。
MinIO 的優(yōu)點(diǎn)如下:
- 部署簡(jiǎn)單,一個(gè)二進(jìn)制文件(minio)即是一切,還可以支持各種平臺(tái)
- 支持海量存儲(chǔ),可以按 zone 擴(kuò)展,支持單個(gè)對(duì)象最大 5TB
- 低冗余且磁盤損壞高容忍,標(biāo)準(zhǔn)且最高的數(shù)據(jù)冗余系數(shù)為 2(即存儲(chǔ)一個(gè) 1M 的數(shù)據(jù)對(duì)象,實(shí)際占用磁盤空間為 2M)。但在任意 n/2 塊 disk 損壞的情況下依然可以讀出數(shù)據(jù)(n 為一個(gè)糾刪碼集合中的 disk 數(shù)量)。并且這種損壞恢復(fù)是基于單個(gè)對(duì)象的,而不是基于整個(gè)存儲(chǔ)卷的
- 讀寫性能優(yōu)異
二、MinIO 基礎(chǔ)概念
-
S3
——Simple Storage Service,簡(jiǎn)單存儲(chǔ)服務(wù),這個(gè)概念是 Amazon 在 2006 年推出的,對(duì)象存儲(chǔ)
就是從那個(gè)時(shí)候誕生的。S3 提供了一個(gè)簡(jiǎn)單 Web 服務(wù)接口,可用于隨時(shí)在 Web 上的任何位置存儲(chǔ)和檢索任何數(shù)量的數(shù)據(jù)。 -
Object
——存儲(chǔ)到 Minio 的基本對(duì)象,如文件、字節(jié)流,Anything… -
Bucket
——用來存儲(chǔ) Object 的邏輯空間。每個(gè) Bucket 之間的數(shù)據(jù)是相互隔離的。 -
Drive
——部署 Minio 時(shí)設(shè)置的磁盤,Minio 中所有的對(duì)象數(shù)據(jù)都會(huì)存儲(chǔ)在 Drive 里。 -
Set
——一組 Drive 的集合,分布式部署根據(jù)集群規(guī)模自動(dòng)劃分一個(gè)或多個(gè) Set ,每個(gè) Set 中的 Drive 分布在不同位置。- 一個(gè)對(duì)象存儲(chǔ)在一個(gè) Set 上
- 一個(gè)集群劃分為多個(gè) Set
- 一個(gè) Set 包含的 Drive 數(shù)量是固定的,默認(rèn)由系統(tǒng)根據(jù)集群規(guī)模自動(dòng)計(jì)算得出
- 一個(gè) SET 中的 Drive 盡可能分布在不同的節(jié)點(diǎn)上
Set /Drive 的關(guān)系
- Set /Drive 這兩個(gè)概念是 MINIO 里面最重要的兩個(gè)概念,一個(gè)對(duì)象最終是存儲(chǔ)在 Set 上面的。
- Set 是另外一個(gè)概念,Set 是一組 Drive 的集合,圖中,所有藍(lán)色、橙色背景的 Drive(硬盤)的就組成了一個(gè) Set。
三、糾刪碼(Erasure Code)
糾刪碼(Erasure Code)簡(jiǎn)稱 EC,是一種數(shù)據(jù)保護(hù)方法,它將數(shù)據(jù)分割成片段,把冗余數(shù)據(jù)塊擴(kuò)展、編碼,并將其存儲(chǔ)在不同的位置,比如磁盤、存儲(chǔ)節(jié)點(diǎn)或者其它地理位置。
- 糾刪碼是一種恢復(fù)丟失和損壞數(shù)據(jù)的數(shù)學(xué)算法,目前,糾刪碼技術(shù)在分布式存儲(chǔ)系統(tǒng)中的應(yīng)用主要有三類,陣列糾刪碼(Array Code: RAID5、RAID6 等)、RS(Reed-Solomon)里德-所羅門類糾刪碼和LDPC(LowDensity Parity Check Code)低密度奇偶校驗(yàn)糾刪碼。
- Erasure Code 是一種編碼技術(shù),它可以將 n 份原始數(shù)據(jù),增加 m 份校驗(yàn)數(shù)據(jù),并能通過 n+m 份中的任意 n 份原始數(shù)據(jù),還原為原始數(shù)據(jù)。
- 即如果有任意小于等于 m 份的校驗(yàn)數(shù)據(jù)失效,仍然能通過剩下的數(shù)據(jù)還原出來。
- Minio 采用 Reed-Solomon code 將對(duì)象拆分成 N/2 數(shù)據(jù)和 N/2 奇偶校驗(yàn)塊。
- 在同一集群內(nèi),MinIO 自己會(huì)自動(dòng)生成若干糾刪組(Set),用于分布存放桶數(shù)據(jù)。一個(gè)糾刪組中的一定數(shù)量的磁盤發(fā)生的故障(故障磁盤的數(shù)量小于等于校驗(yàn)盤的數(shù)量),通過糾刪碼校驗(yàn)算法可以恢復(fù)出正確的數(shù)據(jù)。
四、MinIO
1)單主機(jī),單硬盤模式
該模式下,Minio 只在一臺(tái)服務(wù)器上搭建服務(wù),且數(shù)據(jù)都存在單塊磁盤上,該模式存在單點(diǎn)風(fēng)險(xiǎn),主要用作開發(fā)、測(cè)試等使用
2)單主機(jī),多硬盤模式
該模式下,Minio 在一臺(tái)服務(wù)器上搭建服務(wù),但數(shù)據(jù)分散在多塊(大于 4 塊)磁盤上,提供了數(shù)據(jù)上的安全保障。
3)多主機(jī)、多硬盤模式(分布式)
該模式是 Minio 服務(wù)最常用的架構(gòu),通過共享一個(gè) access_key 和 secret_key,在多臺(tái)服務(wù)器上搭建服務(wù),且數(shù)據(jù)分散在多塊(大于 4 塊,無上限)磁盤上,提供了較為強(qiáng)大的數(shù)據(jù)冗余機(jī)制(Reed-Solomon 糾刪碼)。
五、MinIO 環(huán)境部署(分布式)
1)環(huán)境準(zhǔn)備
|????????主機(jī)名????????|???????IP????????|??????????????????data???????????????????|
|-------------------|-----------------|-----------------------------------------|
|?local-168-182-110?|?192.168.182.110?|?/opt/bigdata/minio/data/export{1,2,3,4}?|
|?local-168-182-111?|?192.168.182.111?|?/opt/bigdata/minio/data/export{1,2,3,4}?|
|?local-168-182-112?|?192.168.182.112?|?/opt/bigdata/minio/data/export{1,2,3,4}?|
2)下載
mkdir?-p?/opt/bigdata/minio?;?cd?/opt/bigdata/minio
#?下載rpm包進(jìn)行部署
#wget?https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20220802235916.0.0.x86_64.rpm?-O?minio.rpm
#?yum?-y?install?minio.rpm
#?下載二進(jìn)制包部署
wget?https://dl.min.io/server/minio/release/linux-amd64/minio
chmod?+x?/opt/bigdata/minio
#?加在/etc/profile
export?PATH=$PATH:/opt/bigdata/minio
minio?--help
3)每臺(tái)新加四塊磁盤
#?不重啟,直接刷新磁盤數(shù)據(jù)總線,獲取新加的磁盤
for?host?in?$(ls?/sys/class/scsi_host)?;?do?echo?"-?-?-"?>?/sys/class/scsi_host/$host/scan;?done
lsblk
#?格式化
mkfs.ext4?/dev/sdb
mkfs.ext4?/dev/sdc
mkfs.ext4?/dev/sdd
mkfs.ext4?/dev/sde
#?掛載
mount?/dev/sdb?/opt/bigdata/minio/data/export1
mount?/dev/sdc?/opt/bigdata/minio/data/export2
mount?/dev/sdd?/opt/bigdata/minio/data/export3
mount?/dev/sde?/opt/bigdata/minio/data/export4
【溫馨提示】磁盤大小必須>1G,這里我添加的是 4*2G 的盤
4)配置
Minio 默認(rèn)9000
端口,在配置文件中加入–address “127.0.0.1:9029” 可更改端口
-
MINIO_ACCESS_KEY
:用戶名,長(zhǎng)度最小是 5 個(gè)字符 -
MINIO_SECRET_KEY
:密碼,密碼不能設(shè)置過于簡(jiǎn)單,不然 minio 會(huì)啟動(dòng)失敗,長(zhǎng)度最小是 8 個(gè)字符 -
–config-dir
:指定集群配置文件目錄 -
–address
:api 的端口,默認(rèn)是9000
-
--console-address
:web 端口,默認(rèn)隨機(jī)
編寫啟動(dòng)腳本(/opt/bigdata/minio/run.sh
)
#!/bin/bash
#?創(chuàng)建日志存儲(chǔ)目錄
mkdir?-p?/opt/bigdata/minio/logs
#?分別在三個(gè)節(jié)點(diǎn)上創(chuàng)建存儲(chǔ)目錄
mkdir?-p?/opt/bigdata/minio/data/export{1,2,3,4}
#?創(chuàng)建配置目錄
mkdir?-p?/etc/minio
export?MINIO_ROOT_USER=admin
export?MINIO_ROOT_PASSWORD=admin123456
#?在三臺(tái)機(jī)器上都執(zhí)行該文件,即以分布式的方式啟動(dòng)了MINIO
#?--address?"0.0.0.0:9000"?掛載9001端口為api端口(如Java客戶端)訪問的端口
#?--console-address ":9000"?掛載9000端口為web端口;
/opt/bigdata/minio/minio?server?--address?0.0.0.0:9000?--console-address?0.0.0.0:9001?--config-dir?/etc/minio?
http://local-168-182-110/opt/bigdata/minio/data/export1?
http://local-168-182-110/opt/bigdata/minio/data/export2?
http://local-168-182-110/opt/bigdata/minio/data/export3?
http://local-168-182-110/opt/bigdata/minio/data/export4?
http://local-168-182-111/opt/bigdata/minio/data/export1?
http://local-168-182-111/opt/bigdata/minio/data/export2?
http://local-168-182-111/opt/bigdata/minio/data/export3?
http://local-168-182-111/opt/bigdata/minio/data/export4?
http://local-168-182-112/opt/bigdata/minio/data/export1?
http://local-168-182-112/opt/bigdata/minio/data/export2?
http://local-168-182-112/opt/bigdata/minio/data/export3?
http://local-168-182-112/opt/bigdata/minio/data/export4?>?/opt/bigdata/minio/logs/minio_server.log
【溫馨提示】下面腳本復(fù)制時(shí) 后不要有空格,還有就是上面的目錄是對(duì)應(yīng)的一塊磁盤,而非簡(jiǎn)單的在/opt/bigdata/minio/data 目錄下創(chuàng)建四個(gè)目錄,要不然會(huì)報(bào)如下錯(cuò)誤,看提示以為是 root 權(quán)限問題。
part of root disk, will not be used (*errors.errorString)
5)啟動(dòng)服務(wù)
#?在三臺(tái)機(jī)器上都執(zhí)行該文件,即以分布式的方式啟動(dòng)了MINIO
sh?/opt/bigdata/minio/run.sh
添加或修改 minio.service,通過 systemctl 啟停服務(wù)(推薦)
-
WorkingDirectory
:二進(jìn)制文件目錄 -
ExecStart
:指定集群?jiǎn)?dòng)腳本
#?如果使用rpm安裝,minio.service就會(huì)自動(dòng)生成,只要修改就行
cat?>?/usr/lib/systemd/system/minio.service?<
修改文件權(quán)限
chmod?+x?/usr/lib/systemd/system/minio.service?&&?chmod?+x?/opt/bigdata/minio/minio?&&?chmod?+x?/opt/bigdata/minio/run.sh
#?將文件copy其它節(jié)點(diǎn)local-168-182-111,local-168-182-112
scp?-r?/usr/lib/systemd/system/minio.servicee?local-168-182-111:/usr/lib/systemd/system/minio.service
scp?-r?/opt/bigdata/minio?local-168-182-111:/opt/bigdata/
scp?-r?/usr/lib/systemd/system/minio.service?local-168-182-112:/usr/lib/systemd/system/minio.service
scp?-r?/opt/bigdata/minio?local-168-182-112:/opt/bigdata/
啟動(dòng)集群
?#重新加載服務(wù)
systemctl?daemon-reload
#啟動(dòng)服務(wù)
systemctl?start?minio
#加入自啟動(dòng)
systemctl?enable?minio
訪問 MinIO,三個(gè)節(jié)點(diǎn)都可以訪問
http://local-168-182-110:9001/
http://local-168-182-111:9001/
http://local-168-182-112:9001/
賬號(hào)密碼:admin/admin123456
6)使用 nginx 負(fù)載均衡
單獨(dú)對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行訪問顯然不合理,通過使用 nginx 代理,進(jìn)行負(fù)載均衡則很有必要。簡(jiǎn)單的配置如下:
#?安裝nginx
yum?install?epel-release?-y
yum?install?nginx?-y
systemctl?start?nginx
systemctl?status?nginx
systemctl?enable?nginx
添加配置文件,配置內(nèi)容如下:
vi??/etc/nginx/conf.d/minio.conf
upstream?minio_api?{
????server?192.168.182.110:9000;
????server?192.168.182.111:9000;
????server?192.168.182.112:9000;
}
upstream?minio_console?{
????server?192.168.182.110:9001;
????server?192.168.182.111:9001;
????server?192.168.182.112:9001;
}
server{
????listen???????19000;
????server_name??192.168.182.110;
????ignore_invalid_headers?off;
????client_max_body_size?0;
????proxy_buffering?off;
????location?/?{
????????proxy_set_header???X-Forwarded-Proto?$scheme;
????????proxy_set_header???Host??????????????$http_host;
????????proxy_set_header???X-Real-IP?????????$remote_addr;
????????proxy_connect_timeout?300;
????????proxy_http_version?1.1;
????????chunked_transfer_encoding?off;
????????proxy_ignore_client_abort?on;
????????proxy_pass?http://minio_api;
????}
}
server{
????listen???????19001;
????server_name??192.168.182.110;
????ignore_invalid_headers?off;
????client_max_body_size?0;
????proxy_buffering?off;
????location?/?{
????????proxy_set_header???X-Forwarded-Proto?$scheme;
????????proxy_set_header???Host??????????????$http_host;
????????proxy_set_header???X-Real-IP?????????$remote_addr;
????????proxy_connect_timeout?300;
????????proxy_http_version?1.1;
????????chunked_transfer_encoding?off;
????????proxy_ignore_client_abort?on;
????????proxy_pass?http://minio_console;
????}
}
重啟加載配置
nginx?-t
nginx?-s?reload
#或者
systemctl?reload?nginx
訪問:http://local-168-182-110:19001
六、MinIO 客戶端 ( mc)
- MinIO Client mc 命令行工具為 UNIX 命令(如 ls、cat、cp、mirror 和)提供了一種現(xiàn)代替代方案,并 diff 支持文件系統(tǒng)和兼容 Amazon S3 的云存儲(chǔ)服務(wù)。
- mc 命令行工具是為與 AWS S3 API 兼容而構(gòu)建的,并針對(duì)預(yù)期的功能和行為測(cè)試了 MinIO 和 AWS S3。
- MinIO 不為其他與 S3 兼容的服務(wù)提供任何保證,因?yàn)樗鼈兊?S3 API 實(shí)現(xiàn)是未知的,因此不受支持。雖然 mc 命令可以按文檔說明工作,但任何此類使用都需要您自擔(dān)風(fēng)險(xiǎn)。
1)下載
cd?/opt/bigdata/minio/
wget?https://dl.min.io/client/mc/release/linux-amd64/mc
chmod?+x?mc
./mc?--help
2)添加 MinIO 存儲(chǔ)服務(wù)
MinIO 服務(wù)器顯示 URL,訪問權(quán)和秘密密鑰。
【用法】
mc?config?host?add???[YOUR-ACCESS-KEY]?[YOUR-SECRET-KEY]
【示例】
cd?/opt/bigdata/minio/
#?明文輸入
./mc?config?host?add?minio?http://local-168-182-110:19000?admin?admin123456
#?密文輸入(推薦)
./mc?config?host?add?minio?http://local-168-182-110:19000
Enter?Access?Key:?admin
Enter?Secret?Key:?admin123456
3)測(cè)試
cd?/opt/bigdata/minio/
#?獲取已配置別名“?minio”的MinIO服務(wù)器信息
./mc?admin?info?minio
#?添加外殼別名以獲取信息,以便恢復(fù)。
alias?minfo='/opt/bigdata/minio/mc?admin?info'
alias?mheal='/opt/bigdata/minio/mc?admin?heal'
更多示例操作,可以參考官方文檔:http://docs.minio.org.cn/docs/master/minio-admin-complete-guide
【溫馨提示】如果有條件,也可以使用騰訊云的
cos(Cloud Object Storage:云對(duì)象存儲(chǔ))
和阿里云的oss(Object Storage Service:對(duì)象存儲(chǔ)服務(wù))
等公有云產(chǎn)品。
到這里 MinIO 的基本概念和環(huán)境部署就到這結(jié)束了,后續(xù)會(huì)更新 MinIO 的實(shí)戰(zhàn)操作,請(qǐng)小伙伴耐心等待,有疑問的小伙伴歡迎給我留言哦~
審核編輯:湯梓紅
評(píng)論
查看更多