12 圖入門高性能分佈式對象存儲 MinIO
作者:liugp
出處:https://u.kubeinfo.cn/FyksUQ
一、概述
MinIO
是在GNU Affero
通用公共許可證 v3.0 下發布的高性能對象存儲。它與 Amazon S3 雲存儲服務 API 兼容。使用 MinIO 爲機器學習、分析和應用程序數據工作負載構建高性能基礎架構。
官方文檔:https://docs.min.io/
中文文檔:http://docs.minio.org.cn/docs/
GitHub 地址:https://github.com/minio/minio
特點:
-
數據保護——分佈式 Minio 採用 糾刪碼來防範多個節點宕機和位衰減 bit rot。分佈式 Minio 至少需要 4 個硬盤,使用分佈式 Minio 自動引入了糾刪碼功能。
-
高可用——單機 Minio 服務存在單點故障,相反,如果是一個有 N 塊硬盤的分佈式 Minio, 只要有 N/2 硬盤在線,你的數據就是安全的。不過你需要至少有 N/2+1 個硬盤來創建新的對象。
例如,一個 16 節點的 Minio 集羣,每個節點 16 塊硬盤,就算 8 臺服務器宕機,這個集羣仍然是可讀的,不過你需要 9 臺服務器才能寫數據。
【溫馨提示】只要遵守分佈式 Minio 的限制,你可以組合不同的節點和每個節點幾塊硬盤。比如,你可以使用 2 個節點,每個節點 4 塊硬盤,也可以使用 4 個節點,每個節點兩塊硬盤,諸如此類。
- 一致性——Minio 在分佈式和單機模式下,所有讀寫操作都嚴格遵守 read-after-write 一致性模型。
MinIO 的優點如下:
-
部署簡單,一個二進制文件(minio)即是一切,還可以支持各種平臺
-
支持海量存儲,可以按 zone 擴展,支持單個對象最大 5TB
-
低冗餘且磁盤損壞高容忍,標準且最高的數據冗餘係數爲 2(即存儲一個 1M 的數據對象,實際佔用磁盤空間爲 2M)。但在任意 n/2 塊 disk 損壞的情況下依然可以讀出數據 (n 爲一個糾刪碼集合中的 disk 數量)。並且這種損壞恢復是基於單個對象的,而不是基於整個存儲卷的
-
讀寫性能優異
二、MinIO 基礎概念
-
S3
——Simple Storage Service,簡單存儲服務,這個概念是 Amazon 在 2006 年推出的,對象存儲
就是從那個時候誕生的。S3 提供了一個簡單 Web 服務接口,可用於隨時在 Web 上的任何位置存儲和檢索任何數量的數據。 -
Object
——存儲到 Minio 的基本對象,如文件、字節流,Anything… -
Bucket
——用來存儲 Object 的邏輯空間。每個 Bucket 之間的數據是相互隔離的。 -
Drive
——部署 Minio 時設置的磁盤,Minio 中所有的對象數據都會存儲在 Drive 裏。 -
Set
——一組 Drive 的集合,分佈式部署根據集羣規模自動劃分一個或多個 Set ,每個 Set 中的 Drive 分佈在不同位置。 -
一個對象存儲在一個 Set 上
-
一個集羣劃分爲多個 Set
-
一個 Set 包含的 Drive 數量是固定的,默認由系統根據集羣規模自動計算得出
-
一個 SET 中的 Drive 儘可能分佈在不同的節點上
Set /Drive 的關係
-
Set /Drive 這兩個概念是 MINIO 裏面最重要的兩個概念,一個對象最終是存儲在 Set 上面的。
-
Set 是另外一個概念,Set 是一組 Drive 的集合,圖中,所有藍色、橙色背景的 Drive(硬盤)的就組成了一個 Set。
三、糾刪碼(Erasure Code)
糾刪碼(Erasure Code)簡稱 EC,是一種數據保護方法,它將數據分割成片段,把冗餘數據塊擴展、編碼,並將其存儲在不同的位置,比如磁盤、存儲節點或者其它地理位置。
-
糾刪碼是一種恢復丟失和損壞數據的數學算法,目前,糾刪碼技術在分佈式存儲系統中的應用主要有三類,陣列糾刪碼(Array Code: RAID5、RAID6 等)、RS(Reed-Solomon) 裏德 - 所羅門類糾刪碼和 LDPC(LowDensity Parity Check Code) 低密度奇偶校驗糾刪碼。
-
Erasure Code 是一種編碼技術,它可以將 n 份原始數據,增加 m 份校驗數據,並能通過 n+m 份中的任意 n 份原始數據,還原爲原始數據。
-
即如果有任意小於等於 m 份的校驗數據失效,仍然能通過剩下的數據還原出來。
-
Minio 採用 Reed-Solomon code 將對象拆分成 N/2 數據和 N/2 奇偶校驗塊。
-
在同一集羣內,MinIO 自己會自動生成若干糾刪組(Set),用於分佈存放桶數據。一個糾刪組中的一定數量的磁盤發生的故障(故障磁盤的數量小於等於校驗盤的數量),通過糾刪碼校驗算法可以恢復出正確的數據。
四、MinIO
1)單主機,單硬盤模式
該模式下,Minio 只在一臺服務器上搭建服務,且數據都存在單塊磁盤上,該模式存在單點風險,主要用作開發、測試等使用
2)單主機,多硬盤模式
該模式下,Minio 在一臺服務器上搭建服務,但數據分散在多塊(大於 4 塊)磁盤上,提供了數據上的安全保障。
3)多主機、多硬盤模式(分佈式)
該模式是 Minio 服務最常用的架構,通過共享一個 access_key 和 secret_key, 在多臺服務器上搭建服務,且數據分散在多塊(大於 4 塊,無上限)磁盤上,提供了較爲強大的數據冗餘機制(Reed-Solomon 糾刪碼)。
五、MinIO 環境部署(分佈式)
1)環境準備
| 主機名 | 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)每臺新加四塊磁盤
# 不重啓,直接刷新磁盤數據總線,獲取新加的磁盤
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
# 創建日誌存儲目錄
mkdir -p /opt/bigdata/minio/logs
# 分別在三個節點上創建存儲目錄
mkdir -p /opt/bigdata/minio/data/export{1,2,3,4}
# 創建配置目錄
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
# 在三臺機器上都執行該文件,即以分佈式的方式啓動了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 目錄下創建四個目錄,要不然會報如下錯誤,看提示以爲是 root 權限問題。
part of root disk, will not be used (*errors.errorString)
5)啓動服務
# 在三臺機器上都執行該文件,即以分佈式的方式啓動了MINIO
sh /opt/bigdata/minio/run.sh
添加或修改 minio.service,通過 systemctl 啓停服務(推薦)
-
WorkingDirectory
:二進制文件目錄 -
ExecStart
:指定集羣啓動腳本
# 如果使用rpm安裝,minio.service就會自動生成,只要修改就行
cat > /usr/lib/systemd/system/minio.service <<EOF
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/opt/bigdata/minio
ExecStart=/opt/bigdata/minio/run.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
修改文件權限
chmod +x /usr/lib/systemd/system/minio.service && chmod +x /opt/bigdata/minio/minio && chmod +x /opt/bigdata/minio/run.sh
# 將文件copy其它節點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,三個節點都可以訪問
http://local-168-182-110:9001/
http://local-168-182-111:9001/
http://local-168-182-112:9001/
賬號密碼:admin/admin123456
6)使用 nginx 負載均衡
單獨對每個節點進行訪問顯然不合理,通過使用 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 和)提供了一種現代替代方案,並 diff 支持文件系統和兼容 Amazon S3 的雲存儲服務。
-
mc 命令行工具是爲與 AWS S3 API 兼容而構建的,並針對預期的功能和行爲測試了 MinIO 和 AWS S3。
-
MinIO 不爲其他與 S3 兼容的服務提供任何保證,因爲它們的 S3 API 實現是未知的,因此不受支持。雖然 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 <ALIAS> <YOUR-MINIO-ENDPOINT> [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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/GvxrRzBUzIPN-hhoyH4S5A