一、概述
MinIO
是在GNU Affero
通用公共許可證 v3.0 下發(fā)布的高性能對象存儲。它與 Amazon S3 云存儲服務 API 兼容。使用 MinIO 為機器學習、分析和應用程序數(shù)據(jù)工作負載構建高性能基礎架構。
官方文檔:https://docs.min.io/
中文文檔:http://docs.minio.org.cn/docs/
GitHub 地址:https://github.com/minio/minio
特點:
- 數(shù)據(jù)保護——分布式 Minio 采用 糾刪碼來防范多個節(jié)點宕機和位衰減 bit rot。分布式 Minio 至少需要 4 個硬盤,使用分布式 Minio 自動引入了糾刪碼功能。
- 高可用——單機 Minio 服務存在單點故障,相反,如果是一個有 N 塊硬盤的分布式 Minio,只要有 N/2 硬盤在線,你的數(shù)據(jù)就是安全的。不過你需要至少有 N/2+1 個硬盤來創(chuàng)建新的對象。
例如,一個 16 節(jié)點的 Minio 集群,每個節(jié)點 16 塊硬盤,就算 8 臺服務器宕機,這個集群仍然是可讀的,不過你需要 9 臺服務器才能寫數(shù)據(jù)。
【溫馨提示】只要遵守分布式 Minio 的限制,你可以組合不同的節(jié)點和每個節(jié)點幾塊硬盤。比如,你可以使用 2 個節(jié)點,每個節(jié)點 4 塊硬盤,也可以使用 4 個節(jié)點,每個節(jié)點兩塊硬盤,諸如此類。
MinIO 的優(yōu)點如下:
- 部署簡單,一個二進制文件(minio)即是一切,還可以支持各種平臺
- 支持海量存儲,可以按 zone 擴展,支持單個對象最大 5TB
- 低冗余且磁盤損壞高容忍,標準且最高的數(shù)據(jù)冗余系數(shù)為 2(即存儲一個 1M 的數(shù)據(jù)對象,實際占用磁盤空間為 2M)。但在任意 n/2 塊 disk 損壞的情況下依然可以讀出數(shù)據(jù)(n 為一個糾刪碼集合中的 disk 數(shù)量)。并且這種損壞恢復是基于單個對象的,而不是基于整個存儲卷的
- 讀寫性能優(yōu)異
二、MinIO 基礎概念
-
S3
——Simple Storage Service,簡單存儲服務,這個概念是 Amazon 在 2006 年推出的,對象存儲
就是從那個時候誕生的。S3 提供了一個簡單 Web 服務接口,可用于隨時在 Web 上的任何位置存儲和檢索任何數(shù)量的數(shù)據(jù)。 -
Object
——存儲到 Minio 的基本對象,如文件、字節(jié)流,Anything… -
Bucket
——用來存儲 Object 的邏輯空間。每個 Bucket 之間的數(shù)據(jù)是相互隔離的。 -
Drive
——部署 Minio 時設置的磁盤,Minio 中所有的對象數(shù)據(jù)都會存儲在 Drive 里。 -
Set
——一組 Drive 的集合,分布式部署根據(jù)集群規(guī)模自動劃分一個或多個 Set ,每個 Set 中的 Drive 分布在不同位置。- 一個對象存儲在一個 Set 上
- 一個集群劃分為多個 Set
- 一個 Set 包含的 Drive 數(shù)量是固定的,默認由系統(tǒng)根據(jù)集群規(guī)模自動計算得出
- 一個 SET 中的 Drive 盡可能分布在不同的節(jié)點上
Set /Drive 的關系
- Set /Drive 這兩個概念是 MINIO 里面最重要的兩個概念,一個對象最終是存儲在 Set 上面的。
- Set 是另外一個概念,Set 是一組 Drive 的集合,圖中,所有藍色、橙色背景的 Drive(硬盤)的就組成了一個 Set。
三、糾刪碼(Erasure Code)
糾刪碼(Erasure Code)簡稱 EC,是一種數(shù)據(jù)保護方法,它將數(shù)據(jù)分割成片段,把冗余數(shù)據(jù)塊擴展、編碼,并將其存儲在不同的位置,比如磁盤、存儲節(jié)點或者其它地理位置。
- 糾刪碼是一種恢復丟失和損壞數(shù)據(jù)的數(shù)學算法,目前,糾刪碼技術在分布式存儲系統(tǒng)中的應用主要有三類,陣列糾刪碼(Array Code: RAID5、RAID6 等)、RS(Reed-Solomon)里德-所羅門類糾刪碼和LDPC(LowDensity Parity Check Code)低密度奇偶校驗糾刪碼。
- Erasure Code 是一種編碼技術,它可以將 n 份原始數(shù)據(jù),增加 m 份校驗數(shù)據(jù),并能通過 n+m 份中的任意 n 份原始數(shù)據(jù),還原為原始數(shù)據(jù)。
- 即如果有任意小于等于 m 份的校驗數(shù)據(jù)失效,仍然能通過剩下的數(shù)據(jù)還原出來。
- Minio 采用 Reed-Solomon code 將對象拆分成 N/2 數(shù)據(jù)和 N/2 奇偶校驗塊。
- 在同一集群內,MinIO 自己會自動生成若干糾刪組(Set),用于分布存放桶數(shù)據(jù)。一個糾刪組中的一定數(shù)量的磁盤發(fā)生的故障(故障磁盤的數(shù)量小于等于校驗盤的數(shù)量),通過糾刪碼校驗算法可以恢復出正確的數(shù)據(jù)。
四、MinIO
1)單主機,單硬盤模式
該模式下,Minio 只在一臺服務器上搭建服務,且數(shù)據(jù)都存在單塊磁盤上,該模式存在單點風險,主要用作開發(fā)、測試等使用
2)單主機,多硬盤模式
該模式下,Minio 在一臺服務器上搭建服務,但數(shù)據(jù)分散在多塊(大于 4 塊)磁盤上,提供了數(shù)據(jù)上的安全保障。
3)多主機、多硬盤模式(分布式)
該模式是 Minio 服務最常用的架構,通過共享一個 access_key 和 secret_key,在多臺服務器上搭建服務,且數(shù)據(jù)分散在多塊(大于 4 塊,無上限)磁盤上,提供了較為強大的數(shù)據(jù)冗余機制(Reed-Solomon 糾刪碼)。
五、MinIO 環(huán)境部署(分布式)
1)環(huán)境準備
|????????主機名????????|???????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包進行部署
#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
#?下載二進制包部署
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)每臺新加四塊磁盤
#?不重啟,直接刷新磁盤數(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 默認9000
端口,在配置文件中加入–address “127.0.0.1:9029” 可更改端口
-
MINIO_ACCESS_KEY
:用戶名,長度最小是 5 個字符 -
MINIO_SECRET_KEY
:密碼,密碼不能設置過于簡單,不然 minio 會啟動失敗,長度最小是 8 個字符 -
–config-dir
:指定集群配置文件目錄 -
–address
:api 的端口,默認是9000
-
--console-address
:web 端口,默認隨機
編寫啟動腳本(/opt/bigdata/minio/run.sh
)
#!/bin/bash
#?創(chuàng)建日志存儲目錄
mkdir?-p?/opt/bigdata/minio/logs
#?分別在三個節(jié)點上創(chuàng)建存儲目錄
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
#?在三臺機器上都執(zhí)行該文件,即以分布式的方式啟動了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
【溫馨提示】下面腳本復制時 后不要有空格,還有就是上面的目錄是對應的一塊磁盤,而非簡單的在/opt/bigdata/minio/data 目錄下創(chuàng)建四個目錄,要不然會報如下錯誤,看提示以為是 root 權限問題。
part of root disk, will not be used (*errors.errorString)
5)啟動服務
#?在三臺機器上都執(zhí)行該文件,即以分布式的方式啟動了MINIO
sh?/opt/bigdata/minio/run.sh
添加或修改 minio.service,通過 systemctl 啟停服務(推薦)
-
WorkingDirectory
:二進制文件目錄 -
ExecStart
:指定集群啟動腳本
#?如果使用rpm安裝,minio.service就會自動生成,只要修改就行
cat?>?/usr/lib/systemd/system/minio.service?<
修改文件權限
chmod?+x?/usr/lib/systemd/system/minio.service?&&?chmod?+x?/opt/bigdata/minio/minio?&&?chmod?+x?/opt/bigdata/minio/run.sh
#?將文件copy其它節(jié)點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/
啟動集群
?#重新加載服務
systemctl?daemon-reload
#啟動服務
systemctl?start?minio
#加入自啟動
systemctl?enable?minio
訪問 MinIO,三個節(jié)點都可以訪問
http://local-168-182-110:9001/
http://local-168-182-111:9001/
http://local-168-182-112:9001/
賬號密碼:admin/admin123456
6)使用 nginx 負載均衡
單獨對每個節(jié)點進行訪問顯然不合理,通過使用 nginx 代理,進行負載均衡則很有必要。簡單的配置如下:
#?安裝nginx
yum?install?epel-release?-y
yum?install?nginx?-y
systemctl?start?nginx
systemctl?status?nginx
systemctl?enable?nginx
添加配置文件,配置內容如下:
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 的云存儲服務。
- mc 命令行工具是為與 AWS S3 API 兼容而構建的,并針對預期的功能和行為測試了 MinIO 和 AWS S3。
- MinIO 不為其他與 S3 兼容的服務提供任何保證,因為它們的 S3 API 實現(xiàn)是未知的,因此不受支持。雖然 mc 命令可以按文檔說明工作,但任何此類使用都需要您自擔風險。
1)下載
cd?/opt/bigdata/minio/
wget?https://dl.min.io/client/mc/release/linux-amd64/mc
chmod?+x?mc
./mc?--help
2)添加 MinIO 存儲服務
MinIO 服務器顯示 URL,訪問權和秘密密鑰。
【用法】
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)測試
cd?/opt/bigdata/minio/
#?獲取已配置別名“?minio”的MinIO服務器信息
./mc?admin?info?minio
#?添加外殼別名以獲取信息,以便恢復。
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:云對象存儲)
和阿里云的oss(Object Storage Service:對象存儲服務)
等公有云產(chǎn)品。
到這里 MinIO 的基本概念和環(huán)境部署就到這結束了,后續(xù)會更新 MinIO 的實戰(zhàn)操作,請小伙伴耐心等待,有疑問的小伙伴歡迎給我留言哦~
審核編輯:湯梓紅
評論
查看更多