高效能分散式物件儲存——MinIO(環境部署)

語言: CN / TW / HK

一、概述

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的實戰操作,請小夥伴耐心等待,有疑問的小夥伴歡迎給我留言哦~