一網打盡!超詳細的分佈式對象存儲 MinIO 實戰教程

前言

MinIO 的基礎概念和環境部署可以參考我之前的文章:高性能分佈式對象存儲 MinIO 部署實戰

客戶端操作 MinIO Client(mc)

官方文檔:https://docs.min.io/docs/minio-admin-complete-guide.html

MinIO Client (mc) 爲 UNIX 命令(如 ls、cat、cp、mirror、diff、find 等)提供了現代替代方案。它支持文件系統和兼容 Amazon S3 的雲存儲服務(AWS Signature v2 和 v4)。

alias       set, remove and list aliases in configuration file
ls          list buckets and objects
mb          make a bucket
rb          remove a bucket
cp          copy objects
mirror      synchronize object(s) to a remote site
cat         display object contents
head        display first 'n' lines of an object
pipe        stream STDIN to an object
share       generate URL for temporary access to an object
find        search for objects
sql         run sql queries on objects
stat        show object metadata
mv          move objects
tree        list buckets and objects in a tree format
du          summarize disk usage recursively
retention   set retention for object(s)
legalhold   set legal hold for object(s)
diff        list differences in object name, size, and date between two buckets
rm          remove objects
encrypt    manage bucket encryption config
event       manage object notifications
watch       listen for object notification events
undo        undo PUT/DELETE operations
policy      manage anonymous access to buckets and objects
tag         manage tags for bucket(s) and object(s)
ilm         manage bucket lifecycle
version     manage bucket versioning
replicate   configure server side bucket replication
admin       manage MinIO servers
update      update mc to latest release
mc Shell 自動補全

如果您使用的是 bash、zsh 或 fish。Shell 補全默認嵌入在 mc,安裝自動補全使用 mc --autocompletion。重新啓動 shell,mc 將自動完成命令,如下所示。

# 安裝
mc --autocompletion
# 重啓shell,即退出shell,重新連接即可

查看 mc 版本
mc --version

列出來自 https://play.min.io 的所有存儲桶
mc ls play
# json格式
mc --json ls play

創建桶

mb 命令在對象存儲上創建一個新存儲桶。在文件系統上,它的行爲類似於 mkdir -p 命令。Bucket 相當於文件系統中的驅動器或掛載點,不應被視爲文件夾。MinIO 對每個用戶創建的存儲桶數量沒有任何限制。

# 添加MinIO存儲服務
cd /opt/bigdata/minio
./mc config host add minio http://local-168-182-110:19000 admin admin123456

# 在自己部署的minio創建新存儲桶
mc mb minio/mybucket
# 查看所有桶
mc ls minio

web 訪問:http://local-168-182-110:19001

複製文件到 MinIO

cp 命令將數據從一個或多個源複製到目標。

mc cp wget-log minio/mybucket
# 查看
mc ls wget-log minio/mybucket

日常使用

您可以添加 shell 別名來覆蓋您常用的 Unix 工具。

alias ls='mc ls'
alias cp='mc cp'
alias cat='mc cat'
alias mkdir='mc mb'
alias pipe='mc pipe'
alias find='mc find'
alias tree='mc tree'
MinIO 管理員操作

MinIO Client (mc) 提供 admin 子命令來對 MinIO 部署執行管理任務。

service              restart and stop all MinIO servers
update               update all MinIO servers
info                 display MinIO server information
user                 manage users
group                manage groups
policy               manage policies defined in the MinIO server
replicate            manage MinIO site replication
config               manage MinIO server configuration
decommission, decom  manage MinIO server pool decommissioning
heal                 heal disks, buckets and objects on MinIO server
prometheus           manages prometheus config
kms                  perform KMS management operations
bucket               manage buckets defined in the MinIO server
tier                 manage remote tier targets for ILM transition
top                  provide top like statistics for MinIO
trace                show http trace for MinIO server
console              show console logs for MinIO server
查看集羣信息
mc admin info minio

# 爲了方便使用,可以設置別名
alias minfo='mc admin info'
minfo minio

全局選項

1、選項 [--debug]

【示例】顯示 info 命令的詳細調試輸出

mc admin info --debug minio

2、選項 [--json]

JSON 選項啓用 JSON 行格式的可解析輸出。

【示例】MinIO 服務器信息

mc admin --json info minio

命令 service- 重啓和停止所有 MinIO 服務器

service 命令提供了一種重新啓動和停止所有 MinIO 服務器的方法。

【示例】

mc admin service restart minio
命令 policy- 管理預設策略

policy 添加、刪除、列出策略、獲取策略信息以及爲 MinIO 服務器上的用戶設置策略的命令。

NAME:
  mc admin policy - manage policies

FLAGS:
  --help, -h                       show help

COMMANDS:
  add      add new policy
  remove   remove policy
  list     list all policies
  info     show info on a policy
  set      set IAM policy on a user or group

1、【示例】列出 MinIO 上的所有預設策略

mc admin policy list minio

2、【示例】在 MinIO 上添加新策略 “listbucketsonly”

策略來自 /tmp/listbucketsonly.json。當此策略應用於用戶時,該用戶只能列出頂層存儲桶,但不能列出其他任何內容,沒有前綴,沒有對象。

首先使用以下信息創建 json 文件 /tmp/listbucketsonly.json。

{
  "Version""2012-10-17",
  "Statement"[
    {
      "Effect""Allow",
      "Action"[
        "s3:ListAllMyBuckets"
      ],
      "Resource"[
        "arn:aws:s3:::*"
      ]
    }
  ]
}

將策略作爲 “listbucketsonly” 添加到策略數據庫

mc admin policy add minio listbucketsonly /tmp/listbucketsonly.json

# 刪除 MinIO 上的策略“listbucketsonly”
mc admin policy remove minio listbucketsonly

3、【示例】在用戶或組上設置標準策略。'writeonly'

# 添加一個新用戶“newuser”,密碼"newuser123"
mc admin user add minio newuser newuser123
# 給用戶添加策略
mc admin policy set minio writeonly user=newuser
# 添加組“somegroup ”,把用戶“newuser ”添加到組
mc admin group add minio somegroup newuser
# 給組添加策略
mc admin policy set minio writeonly group=somegroup
命令 user- 管理用戶

1、【示例】在 MinIO 上添加一個新用戶 “newuser”

# 添加一個新用戶“newuser”,密碼"newuser123"
mc admin user add minio newuser newuser123

2、【示例】在 MinIO 上禁用用戶 “newuser”

mc admin user disable minio newuser

3、【示例】在 MinIO 上啓用用戶 “newuser”

mc admin user enable minio newuser

4、【示例】在 MinIO 上刪除用戶 “newuser”

mc admin user remove minio newuser

5、【示例】列出 MinIO 上的所有用戶

mc admin user list --json minio

6、【示例】顯示用戶信息

mc admin user info minio newuser
命令 group- 管理組

group 在 MinIO 服務器上添加、刪除、信息、列出、啓用、禁用組的命令。

1、【示例】將用戶添加到 MinIO 上的組 “somegroup”

# 如果組不存在,則創建組。
mc admin group add minio somegroup newuser

2、【示例】從 MinIO 上的組 “somegroup” 中刪除用戶

mc admin group remove minio somegroup newuser

3、【示例】在 MinIO 上刪除一個組 “somegroup”

僅在給定組爲空時有效,非空組無法刪除

mc admin group remove minio somegroup

4、【示例】在 MinIO 上獲取組 “somegroup” 的信息

# 添加組
mc admin group add minio somegroup newuser
# 刪除
mc admin group info minio somegroup

5、【示例】列出 MinIO 上的所有組

mc admin group list minio

6、【示例】在 MinIO 上啓用組 “somegroup”

mc admin group enable minio somegroup

7、【示例】在 MinIO 上禁用組 “somegroup”

mc admin group disable minio somegroup
命令 config- 管理服務器配置

config 命令來管理 MinIO 服務器配置。

1、【示例】獲取 “etcd” 子系統配置

# 通過引入第三方組件etcd,在不動原有集羣的基礎上實現動態擴展方案
mc admin config get minio etcd

2、【示例】在 “etcd” 子系統上設置特定設置

mc admin config set minio etcd endpoints=http://[hostname|ip]:2379

3、【示例】獲取 MinIO 服務器 / 集羣的整個服務器配置

mc admin config export minio > /tmp/my-serverconfig

4、【示例】設置 MinIO 服務器 / 集羣的整個服務器配置

mc admin config import minio < /tmp/my-serverconfig

這裏列出了常用的命令,想了解更多,可以查看官方文檔:https://docs.min.io/docs/minio-admin-complete-guide.html

MinIO Client(mc)操作還是非常簡單的,但是更多的使用還是通過程序去調用 api 接口的,後續會講解~

MinIO 分佈式集羣擴容

參考:https://docs.min.io/docs/distributed-minio-quickstart-guide.html

MinIO 集羣擴容方法:

常見的集羣擴容方法可分爲兩類:水平擴容和垂直擴容。

對等擴容

首先,MinIO 的極簡設計理念使得 MinIO 分佈式集羣並不支持向集羣中添加單個節點並進行自動調節的擴容方式,這是因爲加入單個節點後所引發的數據均衡以及糾刪組劃分等問題會爲整個集羣帶來複雜的調度和處理過程,並不利於維護。因此,MinIO 提供了一種對等擴容的方式,即要求增加的節點數和磁盤數均需與原集羣保持對等。

對等擴容的優點在於配置操作簡單易行

通過一條命令即可完成擴容(注意:推薦使用連續的節點 IP,並參照 MinIO 官網在擴容命令中使用 {})。而對等擴容的侷限性在於:擴容需重啓

擴容存在限制,集羣節點數一般不超過 32 個,這是由於 MinIO 集羣通過分佈式鎖保證強一致性,若集羣節點數過大,維護強一致性將帶來性能問題。

【溫馨提示】這裏不沿用之前的集羣進行擴容,這裏重新部署 2 個節點的集羣。具體部署,可以參考我之前的文章:高性能分佈式對象存儲——MinIO(環境部署)

環境準備

啓動腳本
#!/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

# 所有節點都得修改重啓服務
# --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://192.168.182.11{0...1}/opt/bigdata/minio/data/export{1...2} > /opt/bigdata/minio/logs/minio_server.log
minio 初始集羣信息

web 訪問:http://local-168-182-110:19001

將配置 copy 一份到要擴容的節點
# 在local-168-182-110執行
cd /opt/bigdata/minio
scp -r /opt/bigdata/minio local-168-182-113:/opt/bigdata/
scp -r /usr/lib/systemd/system/minio.service local-168-182-113:/usr/lib/systemd/system/minio.service
添加磁盤

這裏也添加 2 塊 2G 的磁盤

# 不重啓,直接刷新磁盤數據總線,獲取新加的磁盤
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

# 先刪再創建掛載目錄,因爲這裏面有其它節點的數據
rm -fr /opt/bigdata/minio/data/export{1..4}
mkdir -p /opt/bigdata/minio/data/export{1..4}

# 掛載
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
修改啓動腳本(run.sh)
#!/bin/bash
# 創建日誌存儲目錄
mkdir -p /opt/bigdata/minio/logs
# 分別在三個節點上創建存儲目錄
mkdir -p /opt/bigdata/minio/data/export{1,2}
# 創建配置目錄
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456

# 所有節點都得修改重啓服務
# --address "0.0.0.0:9000" 掛載9001端口爲api端口(如Java客戶端)訪問的端口
# --console-address ":9000" 掛載9000端口爲web端口;
# 擴容地址:http://192.168.182.11{2...3}/opt/bigdata/minio/data/export{1...2}
/opt/bigdata/minio/minio server --address 0.0.0.0:9000 --console-address 0.0.0.0:9001 --config-dir /etc/minio \
http://192.168.182.11{0...1}/opt/bigdata/minio/data/export{1...2} \
http://192.168.182.11{2...3}/opt/bigdata/minio/data/export{1...2} > /opt/bigdata/minio/logs/minio_server.log

可擴容的方式,使用 MINIO 糾刪碼,如果想要擴容,必須使用這種方式。注意上面是三個點。

下面的寫法多硬盤多節點部署是不可擴容的方式,下面是官方示例:

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://192.168.1.11/export1 http://192.168.1.11/export2 \
             http://192.168.1.11/export3 http://192.168.1.11/export4 \
             http://192.168.1.12/export1 http://192.168.1.12/export2 \
             http://192.168.1.12/export3 http://192.168.1.12/export4 \
             http://192.168.1.13/export1 http://192.168.1.13/export2 \
             http://192.168.1.13/export3 http://192.168.1.13/export4 \
             http://192.168.1.14/export1 http://192.168.1.14/export2 \
             http://192.168.1.14/export3 http://192.168.1.14/export4
重啓服務
systemctl restart minio

web 訪問:http://local-168-182-110:19001

到這裏就完成了對等擴容了。

聯邦擴容

MinIO 官方提供了另一種擴容機制——聯邦擴容,即通過引入 etcd,將多個 MinIO 分佈式集羣在邏輯上組成一個聯邦,對外以一個整體提供服務,並提供統一的命名空間。MinIO 聯邦集羣的架構如下圖所示:

MinIO 聯邦集羣的數據訪問機制具體如下:
部署 etcd

下載地址:https://github.com/etcd-io/etcd/releases

mkdir -p /opt/bigdata/etcd ; cd /opt/bigdata/etcd
wget https://github.com/etcd-io/etcd/releases/download/v3.4.20/etcd-v3.4.20-linux-amd64.tar.gz
tar -xf etcd-v3.4.20-linux-amd64.tar.gz
# 創建存儲目錄
mkdir /opt/bigdata/etcd/data

創建配置文件 /usr/local/etcd/conf.yml,三個節點配置文件內容分別如下:

etcd01:local-168-182-110

name: etcd01
data-dir: /opt/bigdata/etcd/data
initial-advertise-peer-urls: http://192.168.182.110:2380
listen-peer-urls: http://192.168.182.110:2380
listen-client-urls: http://192.168.182.110:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.182.110:2379
initial-cluster-token: etcd-cluster
initial-cluster: etcd01=http://192.168.182.110:2380,etcd02=http://192.168.182.111:2380,etcd03=http://192.168.182.112:2380
initial-cluster-state: new

etcd02:local-168-182-111

name: etcd02
data-dir: /opt/bigdata/etcd/data
initial-advertise-peer-urls: http://192.168.182.111:2380
listen-peer-urls: http://192.168.182.111:2380
listen-client-urls: http://192.168.182.111:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.182.111:2379
initial-cluster-token: etcd-cluster
initial-cluster: etcd01=http://192.168.182.110:2380,etcd02=http://192.168.182.111:2380,etcd03=http://192.168.182.112:2380
initial-cluster-state: new

etcd03:local-168-182-112

name: etcd03
data-dir: /opt/bigdata/etcd/data
initial-advertise-peer-urls: http://192.168.182.112:2380
listen-peer-urls: http://192.168.182.112:2380
listen-client-urls: http://192.168.182.112:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.182.112:2379
initial-cluster-token: etcd-cluster
initial-cluster: etcd01=http://192.168.182.110:2380,etcd02=http://192.168.182.111:2380,etcd03=http://192.168.182.112:2380
initial-cluster-state: new

【溫馨提示】只能寫 IP,寫主機名會啓動失敗

配置參數解析:
name:#當前etcd節點名稱。
data-dir:#數據存儲目錄。
initial-advertise-peer-urls:#集羣的其他節點通過該地址與當前節點通信。
listen-peer-urls:#當前節點通過該地址監聽集羣其他節點發送的信息。
listen-client-urls:#當前節點通過該地址監聽客戶端發送的信息。
advertise-client-urls:#客戶端通過該地址與當前節點通信
initial-cluster-token:#用於區分不同的集羣,同一集羣的所有節點配置相同的值。
initial-cluster:#當前集羣的所有節點信息,當前節點根據此信息與其他節點取得聯繫。
initial-cluster-state: #本次是否爲新建集羣,有兩個取值:new和existing。

配置服務

cat >/usr/lib/systemd/system/etcd.service<<EOF
[Unit]
Description=etcd
After=network.target
 
[Service]
Type=notify
ExecStart=/opt/bigdata/etcd/etcd-v3.4.20-linux-amd64/etcd --config-file=/usr/local/etcd/conf.yml
 
[Install]
WantedBy=multi-user.target
EOF

啓動服務

systemctl daemon-reload
systemctl start etcd.service

驗證

# 加軟連接
ln -s /opt/bigdata/etcd/etcd-v3.4.20-linux-amd64/etcdctl /usr/local/bin/etcdctl
# 查看集羣成員列表
etcdctl member list
# 查看集羣成員健康情況
etcdctl endpoint health --endpoints=http://192.168.182.110:2380,http://192.168.182.111:2380,http://192.168.182.112:2380

查看 etcd 版本

ln -s /opt/bigdata/etcd/etcd-v3.4.20-linux-amd64/etcd /usr/local/bin/etcd
etcd --version

運行多個 MinIO 集羣
cd /opt/bigdata/minio
export MINIO_ETCD_ENDPOINTS="http://192.168.182.110:2380,http://192.168.182.111:2380,http://192.168.182.112:2380"
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
export MINIO_PUBLIC_IPS=192.168.182.110,192.168.182.111
./minio server --address 0.0.0.0:8000 --console-address 0.0.0.0:8001  --config-dir /etc/minio http://192.168.182.11{0...1}/opt/bigdata/minio/data/export{3...4}

web 訪問:http://local-168-182-110:8001/

cd /opt/bigdata/minio
export MINIO_ETCD_ENDPOINTS="http://192.168.182.110:2380,http://192.168.182.111:2380,http://192.168.182.112:2380"
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
export MINIO_PUBLIC_IPS=192.168.182.112,192.168.182.113
./minio server --address 0.0.0.0:8000 --console-address 0.0.0.0:8001  --config-dir /etc/minio http://192.168.182.11{2...3}/opt/bigdata/minio/data/export{3...4}

web 訪問:http://local-168-182-112:8001/

配置 nginx
# /etc/nginx/conf.d/minio2.conf
upstream minio_api2 {
    ip_hash;
    server 192.168.182.110:8000;
    server 192.168.182.111:8000;
    server 192.168.182.112:8000;
    server 192.168.182.113:8000;
}

upstream minio_console2 {
    ip_hash;
    server 192.168.182.110:8001;
    server 192.168.182.111:8001;
    server 192.168.182.112:8001;
    server 192.168.182.113:8001;
}

server{
    listen       18000;
    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_api2;
    }
}

server{
    listen       18001;
    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_console2;
    }
}

重新加載 nginx 生效

systemctl reload nginx

web 訪問:http://local-168-182-110:18001/

不同的客戶端訪問會顯示不同的節點信息

MinIO 的基本操作和 MinIO 擴容實戰就到這裏了。

_作者:大數據老司機 _

來源:cnblogs.com/liugp/p/16560313.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/SPKV1iuH7DgugU3xlSqang