Minio對象存儲


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM