高效能分散式物件儲存——MinIO(環境部署)
一、概述
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)下載
```bash 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)每臺新加四塊磁碟
```bash
不重啟,直接重新整理磁碟資料匯流排,獲取新加的磁碟
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
)
```bash
!/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)啟動服務
```bash
在三臺機器上都執行該檔案,即以分散式的方式啟動了MINIO
sh /opt/bigdata/minio/run.sh
新增或修改minio.service,通過systemctl啟停服務(推薦)
- `WorkingDirectory`:二進位制檔案目錄
- `ExecStart`:指定叢集啟動指令碼
bash
如果使用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
修改檔案許可權
bash
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/
啟動叢集
bash
#重新載入服務
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 代理,進行負載均衡則很有必要。簡單的配置如下:
```bash
安裝nginx
yum install epel-release -y yum install nginx -y systemctl start nginx systemctl status nginx systemctl enable nginx ``` 新增配置檔案,配置內容如下:
```bash 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;
}
}
``` 重啟載入配置
```bash 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)下載
bash
cd /opt/bigdata/minio/
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
2)新增MinIO儲存服務
MinIO伺服器顯示URL,訪問權和祕密金鑰。
【用法】
bash
mc config host add <ALIAS> <YOUR-MINIO-ENDPOINT> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
【示例】
```bash
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)測試
```bash 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:物件儲存服務)
等公有云產品。
到這裡MinIO的基本概念和環境部署就到這結束了,後續會更新MinIO的實戰操作,請小夥伴耐心等待,有疑問的小夥伴歡迎給我留言哦~
- Python Flask 介紹
- Python 基礎語法介紹(二)
- Python 高階程式設計之IO模型與協程(四)
- 分散式儲存系統 Ceph 介紹與環境部署
- 【雲原生】Grafana Alerting 告警模組介紹與實戰操作
- 【雲原生】Minio on k8s 講解與實戰操作
- 高效能分散式物件儲存——MinIO(環境部署)
- 【雲原生】Flink on k8s 講解與實戰操作
- 【雲原生】Presto/Trino on k8s 環境部署
- 【雲原生】Hadoop on k8s 環境部署
- 【雲原生】Hadoop HA on k8s 環境部署
- 【雲原生】Azkaban on k8s 講解與實戰操作
- 【雲原生】zookeeper kafka on k8s 環境部署
- 【雲原生】MySQL on k8s 環境部署
- 【雲原生】Hive on k8s 環境部署
- 企業級日誌系統架構——ELK(Elasticsearch、Filebeat、Kafka、Logstash、Kibana)
- Kubernetes(k8s)許可權管理RBAC詳解
- Kubernetes(k8s)kube-proxy、Service詳解
- Linux防火牆——Firewalld原理與實戰操作
- Kubernetes(k8s)基礎概念介紹