高性能分佈式對象存儲——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的實戰操作,請小夥伴耐心等待,有疑問的小夥伴歡迎給我留言哦~