一網打盡!超詳細的分佈式對象存儲 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
複製文件到 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 的極簡設計理念使得 MinIO 分佈式集羣並不支持向集羣中添加單個節點並進行自動調節的擴容方式,這是因爲加入單個節點後所引發的數據均衡以及糾刪組劃分等問題會爲整個集羣帶來複雜的調度和處理過程,並不利於維護。因此,MinIO 提供了一種對等擴容的方式,即要求增加的節點數和磁盤數均需與原集羣保持對等。
-
例如原集羣包含 2 個節點 2 塊磁盤,則在擴容時必須同樣增加 2 個節點 2 塊磁盤(或爲其倍數),以便系統維持相同的數據冗餘 SLA,從而極大地降低擴容的複雜性;
-
如上例,在擴容後,MinIO 集羣並不會對全部的 4 個節點進行完全的數據均衡,而是將原本的 2 個節點視作一個區域,新加入的 2 節點視作另一區域;
-
當有新對象上傳時,集羣將依據各區域的可用空間比例確定存放區域,在各區域內仍舊通過哈希算法確定對應的糾刪組進行最終的存放。此外,集羣進行一次對等擴容後,還可依據擴容規則繼續進行對等擴容,但出於安全性考慮,集羣的最大節點數一般不得超過 32 個。
對等擴容的優點在於配置操作簡單易行
通過一條命令即可完成擴容(注意:推薦使用連續的節點 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 聯邦集羣的架構如下圖所示:
-
其中,etcd 是一個開源的分佈式鍵值存儲數據庫,在聯邦中用於記錄存儲桶 IP 地址。
-
聯邦內的各個集羣其數據存儲以及一致性維護仍由各集羣自行管理,聯邦只是對外提供一個整體邏輯視圖。
-
通過連接到聯邦中任一集羣的任一節點,可以查詢並訪問聯邦內所有集羣的全部數據,由此獲得了邏輯上的空間擴大感。
-
但實際上,對於一個外部應用訪問,聯邦需依賴 etcd 定位到存儲桶的實際存儲節點,再進行數據訪問,聯邦則對外屏蔽了桶 IP 查找和定位過程,從而在邏輯上對外形成了一個統一整體。因此,etcd 實際上起到了類似路由尋址的效果。
MinIO 聯邦集羣的數據訪問機制具體如下:
-
客戶端應用向聯邦集羣發送創建存儲桶請求,桶名爲 bucket1;
-
聯邦會將 bucket1 實際所在的集羣節點 IP 地址寫入 etcd 中,例如 bucket1 實際將存儲於聯邦中的集羣 1 上,而集羣 1 包含 2 個節點,其節點 IP 地址分別爲 192.168.182.112 和 192.168.182.113,則 etcd 中將寫入如下兩條記錄:
部署 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 集羣
- 集羣 1
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/
- 集羣 2
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