Minio對象存儲
1、概述
Minio是一個基於Apache License v2.0開源和談的工具存儲服務。它兼容亞馬遜S3雲存儲服務接口,異常符合於存儲大容量非構造化的數據,比如圖片、視頻、日記文獻、備份數據和容器/杜撰機鏡像等,而一個工具文獻能夠是任性巨細,從幾kb到最大5T不等。且Minio十足笨重,可與使用順序繩捆索綁在一齊,相似於NodeJS,Redis和MySQL。
官方文檔地址:https://docs.min.io/cn
對於有需求不能或不使用雲廠商提供的存儲服務,例如阿里雲的oss、七牛雲的對象存儲等,可以通過自建minio對象存儲集群的方式
2、功能特性
- Amazon S3兼容
Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI訪問Minio服務器。 - 數據保護
Minio使用Minio Erasure Code來防止硬件故障。也許會損壞一半以上的driver,但是仍然可以從中恢復。 - 高度可用
Minio服務器可以容忍分布式設置中高達(N / 2)-1節點故障。而且,您可以配置Minio服務器在Minio與任意Amazon S3兼容服務器之間存儲數據。 - Lambda計算
Minio服務器通過其兼容AWS SNS / SQS的事件通知服務觸發Lambda功能。支持的目標是消息隊列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等數據庫。 - 加密和防篡改
Minio為加密數據提供了機密性,完整性和真實性保證,而且性能開銷微乎其微。使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服務器端和客戶端加密。加密的對象使用AEAD服務器端加密進行防篡改。 - 可對接后端存儲
除了Minio自己的文件系統,還支持DAS、 JBODs、NAS、Google雲存儲和Azure Blob存儲。 - sdk支持
基於Minio輕量的特點,它得到類似Java、Python或Go等語言的sdk支持
3、集群規划
3.1、單節點
- 根據存儲是否為遠端,可直接使用FS或NFS直接操作存儲中的Object
- 調用S3接口,通過Minio使用FS或NFS來操作Object
3.2、多節點
多節點的Minio會根據不同的Access_key及Secret_Key來區分不同租戶,每個租戶可操作對應Server獲取Object。Minio Server間可以通過不同的進程模型、容器或是虛擬機來互相隔離。
3.3、分布式
分布式Minio在無共享架構中根據需求擴展到盡可能多的服務器,所有節點需要使用相同的Access_key及Secret_key來登錄。分布式Minio使用Web負載均衡器或DNS輪循(DNS round-robin),在各服務器之間實現負載均衡。
4、分布式minio集群搭建
minio存儲的部署方案在官網有很多,例如在docker-compose,kubernetes,DC/OS等環境下,本文采用的是較穩定的二進制部署方式。
4.1、集群規划
minio二進制文件下載地址: https://dl.minio.io/server/minio/release/linux-amd64/minio
操作系統CentOS 7.6
服務器資源:
- 172.16.1.101
/minio/data1 /minio/data2 - 172.16.1.102
/minio/data1 /minio/data2
本集群由2台服務器構成(官方推薦集群最小4台服務器),每個服務器上掛載兩個磁盤目錄,最小數據掛載點為4個
4.2、創建用戶
創建專用的用戶
useradd -M -s /sbin/nologin -r minio-user
4.3、創建相關目錄(所有節點)
- 數據存儲目錄
[root@localhost ~]# mkdir -p /minio/data1
[root@localhost ~]# mkdir -p /minio/data2
- 啟動腳本目錄
[root@localhost ~]# mkdir -p /opt/minio
- 集群配置文件目錄
[root@localhost ~]# mkdir -p /etc/minio
4.4、編寫集群啟動腳本(所有節點)
[root@localhost ~]# vim /opt/minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456
/opt/minio/minio server --config-dir /etc/minio \
http://172.16.1.101/minio/data1 http://172.16.1.101/minio/data2 \
http://172.16.1.102/minio/data1 http://172.16.1.102/minio/data2 \
其中,“MINIO_ACCESS_KEY”為用戶名,“MINIO_SECRET_KEY”為密碼,密碼不能設置過於簡單,不然minio會啟動失敗,“–config-dir”指定集群配置文件目錄,生成復雜用戶名和密碼可通過類似Linux命令
tr -cd '[:alnum:]' </dev/urandom |fold -w64|head -n1
的方式來生成
4.5、編寫服務腳本(所有節點)
[root@localhost ~]# vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh
# Let systemd restart this service on-failure
Restart=on-failure
RestartSec=5
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
[root@localhost ~]# chmod +x /usr/lib/systemd/system/minio.service
其中,“WorkingDirectory”為啟動腳本目錄,“ExecStart”為指定集群啟動腳本
參考官方地址:
https://github.com/minio/minio-service/blob/master/linux-systemd/minio.service
4.6、服務啟動
4.6.1、二進制文件
將minio二進制文件上傳到/opt/minio目錄下並賦予權限
chmod +x minio
4.6.2、賦予啟動腳本權限
chmod +x /opt/minio/run.sh
4.6.3、修改目錄所屬
由於minio
服務由minio-user
這個用戶啟動和運行,所以需要修改相應目錄的屬主和屬組
chown -R minio-user:minio-user /minio
chown -R minio-user:minio-user /etc/minio
chown -R minio-user:minio-user /opt/minio
4.6.4、啟動服務
systemctl daemon-reload
systemctl start minio
systemctl enable minio
systemctl status minio
啟動后可通過訪問節點:9000,並使用設置的key登錄到控制台,也可在啟動腳本中加入參數--address "127.0.0.1:9000"
修改端口,即:
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456
/opt/minio/minio server --config-dir /etc/minio \
--address "127.0.0.1:9000" \
http://172.16.1.101/minio/data1 http://172.16.1.101/minio/data2 \
http://172.16.1.102/minio/data1 http://172.16.1.102/minio/data2 \
5、配置域名及https
5.1、配置域名
使用nginx配置域名進行訪問,在 Nginx 的配置文件中加入下面的內容:
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
5.2、配置https
使用nginx配置https安全訪問,並根據301規則自動跳轉到https,https證書可自簽、也可申請一個瀏覽器可信的證書,下面的證書屬於瀏覽器可信的,全局配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
server_tokens off;
keepalive_timeout 65;
client_max_body_size 50m;
access_log /var/log/nginx/nginx.access.log;
error_log /var/log/nginx/nginx.error.log;
upstream minio_server {
server 192.168.10.101:9000;
server 192.168.10.102:9000;
ip_hash;
}
server {
listen 80;
server_name minio.test.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name minio.test.com;
if ($host != 'minio.test.com') {
return 403;
}
ssl_certificate /usr/local/nginx/cert-ssl/minio.test.com.pem;
ssl_certificate_key /usr/local/nginx/cert-ssl/minio.test.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://minio_server;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
5.3、訪問認證
minio控制台界面是通過Accsss Key和Secret Key登錄的,除了將這對Key用於客戶端,作為管理員還可能有需要對控制台訪問做保護,即在用Key登錄的基礎上再加一層。這就如同非X-pack版本的Kibana界面一樣,沒有訪問控制。同樣的,可以嘗試使用nginx的basic_auth模塊。一番折騰發現是不可行的,對於nginx基礎認證,后端不支持非AWS4-HMAC-SHA256簽名算法,可能出現如下圖所示的返回結果:
因此這個想法不可行,具體如何實現也沒有google到。。。
6、控制台界面操作及客戶端sdk
6.1、控制台界面
通過上面配置的域名訪問到minio界面
並通過指定的Access Key及Secret Key登錄到控制台
6.2、控制台界面操作
控制台可以做的操作如下:
- 創建一個存儲空間(存儲桶)bucket
- 在存儲桶內上傳下載文件
- 文件生成鏈接,設置鏈接過期時間
6.3、客戶端sdk
更多內容可查看官網文檔
7、多租戶部署
多租戶的實現可參考:
https://blog.csdn.net/dingjs520/article/details/79118305