Minio對象存儲

Minio對象存儲

一、概述

​ Minio是一個基於Apache License v2.0開源和談的工具存儲服務。它兼容亞馬遜S3雲存儲服務接口,異常符合於存儲大容量非構造化的數據,好比圖片、視頻、日記文獻、備份數據和容器/杜撰機鏡像等,而一個工具文獻可以是任性鉅細,從幾kb到最大5T不等。且Minio十足笨重,可與使用順序繩捆索綁在一齊,類似於NodeJS,Redis和MySQL。
​ 官方文檔地址:https://docs.min.io/cn
​ 對於有需求不能或不使用雲廠商提供的存儲服務,例如阿里雲的oss、七牛雲的對象存儲等,能夠經過自建minio對象存儲集羣的方式css

二、功能特性

  • 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支持html

    三、集羣規劃

    3.一、單節點

  • 根據存儲是否爲遠端,可直接使用FS或NFS直接操做存儲中的Object
  • 調用S3接口,經過Minio使用FS或NFS來操做Object
    java

3.二、多節點

多節點的Minio會根據不一樣的Access_key及Secret_Key來區分不一樣租戶,每一個租戶可操做對應Server獲取Object。Minio Server間能夠經過不一樣的進程模型、容器或是虛擬機來互相隔離。
python

3.三、分佈式

分佈式Minio在無共享架構中根據需求擴展到儘量多的服務器,全部節點須要使用相同的Access_key及Secret_key來登陸。分佈式Minio使用Web負載均衡器或DNS輪循(DNS round-robin),在各服務器之間實現負載均衡。
linux

四、分佈式minio集羣搭建

minio存儲的部署方案在官網有不少,例如在docker-compose,kubernetes,DC/OS等環境下,本文采用的是較穩定的二進制部署方式。nginx

4.一、集羣規劃

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個docker

    4.二、建立相關目錄(全部節點)

  • 數據存儲目錄
[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.三、編寫集羣啓動腳本(全部節點)

[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.四、編寫服務腳本(全部節點)

[root@localhost ~]# vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
[root@localhost ~]# chmod +x /usr/lib/systemd/system/minio.service

其中,「WorkingDirectory」爲啓動腳本目錄,「ExecStart」爲指定集羣啓動腳本

4.五、服務啓動

4.5.一、二進制文件

將minio二進制文件上傳到/opt/minio目錄下並賦予權限

chmod +x minio

4.5.二、賦予啓動腳本權限

chmod +x /opt/minio/run.sh

4.5.三、啓動服務

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 \

五、配置域名及https

5.一、配置域名

使用nginx配置域名進行訪問,在 Nginx 的配置文件中加入下面的內容:

location / {
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:9000;
}

5.二、配置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.三、訪問認證

minio控制檯界面是經過Accsss Key和Secret Key登陸的,除了將這對Key用於客戶端,做爲管理員還可能有須要對控制檯訪問作保護,即在用Key登陸的基礎上再加一層。這就如同非X-pack版本的Kibana界面同樣,沒有訪問控制。一樣的,能夠嘗試使用nginx的basic_auth模塊。一番折騰發現是不可行的,對於nginx基礎認證,後端不支持非AWS4-HMAC-SHA256簽名算法,可能出現以下圖所示的返回結果:

所以這個想法不可行,具體如何實現也沒有google到。。。

六、控制檯界面操做及客戶端sdk

6.一、控制檯界面

經過上面配置的域名訪問到minio界面

並經過指定的Access Key及Secret Key登陸到控制檯

6.二、控制檯界面操做

控制檯能夠作的操做以下:

更多內容可查看官網文檔

七、多租戶部署

多租戶的實現可參考: https://blog.csdn.net/dingjs520/article/details/79118305

相關文章
相關標籤/搜索