MinIO分佈式集群的擴展方案及實現

MinIO 支持兩種擴展方式:

  • 通過修改命令行,在命令行上指定新的集群集來擴展
  • 通過引入第三方組件etcd,在不動原有集群的基礎上實現動態擴展方案

一、命令行方式擴展

MinIO 支持通過在命令行上指定新的集群集來擴展分佈式集群,多個節點的存儲容量和就是分佈式MinIO的存儲容量。

1. MinIO擴展集群支持的命令語法

支持擴容的命令行如下:

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server //host{1...m}/export{1...m} //host{n...z}/export{1...m}

注意:針對此語法,推薦使用連續的節點IP。

2. 擴容示例

假如,我們的初始集群為

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server //host{1...4}/export{1...16} 

那麼,集群擴容命令行如下:

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server //host{1...4}/export{1...16} //host{5...8}/export{1...16} 

現在整個集群就擴展了64個磁盤,總磁盤變為128個,新的對象上傳請求會自動分配到最少使用的集群上。通過以上擴展策略,就可以按需擴展集群。重新配置後重啟集群,會立即在集群中生效,並對現有集群無影響。如上命令中,我們可以把原來的集群看做一個集群池,新增集群看做另一個集群池,新對象按每個集群池中的可用空間比例放置在集群池中。在每個集群池內,基於確定性哈希算法確定位置。

注意: 添加的每個集群池必須具有與原始集群池相同的磁盤數量(糾刪碼集)大小,以便維持相同的數據冗餘SLA。 例如,第一個集群池有8個磁盤,就可以將集群擴展為16個、32個或1024個磁盤的集群池,只需確保部署的SLA是原始集群池的倍數即可。

註:命令行方式擴展的集群,各個節點都能訪問到數據,每塊硬盤都存在相同的 bucket,但上傳的數據並不是都存在於每塊硬盤上。

二、etcd擴展方案

etcd 用於存儲桶DNS服務記錄

image

image etcd簡介及集群安裝部署使用

1. 環境變量

MINIO_ETCD_ENDPOINTS

這是您要用作MinIO聯合後端的etcd服務器的逗號分隔列表。 在整個聯合部署中,這應該是相同的,即聯合部署中的所有MinIO實例都應使用相同的 etcd後端。

MINIO_DOMAIN

這是用於聯合設置的頂級域名。理想情況下,該域名應解析為 在所有聯合MinIO實例之前運行的負載均衡器。域名用於創建etcd的子域條目。對於 例如,如果域名設置為 domain.com,水桶 bucket1,bucket2 將作為訪問 bucket1.domain.com 和 bucket2.domain.com。

MINIO_PUBLIC_IPS

這是用逗號分隔的IP地址列表,此MinIO實例上創建的存儲桶將解析為這些IP地址。例如, 可以 bucket1 在訪問當前MinIO實例上創建的存儲區 bucket1.domain.com,並且DNS條目 bucket1.domain.com 將指向中設置的IP地址MINIO_PUBLIC_IPS。

注意:

  • 這個字段在獨立和糾刪碼MinIO服務器部署時是必需的,以啟用聯邦模式。
  • 對於分佈式部署,此字段是可選的。如果沒有在聯合設置中設置此字段,則使用傳遞給MinIO服務器啟動的主機的IP地址,並將其用於DNS條目。

2. 運行多個集群

集群1

export MINIO_ETCD_ENDPOINTS="//remote-etcd1:2379,//remote-etcd2:4001"
export MINIO_DOMAIN=domain.com
export MINIO_PUBLIC_IPS=44.35.2.1,44.35.2.2,44.35.2.3,44.35.2.4
minio server //rack{1...4}.host{1...4}.domain.com/mnt/export{1...32}

集群2

export MINIO_ETCD_ENDPOINTS="//remote-etcd1:2379,//remote-etcd2:4001"
export MINIO_DOMAIN=domain.com
export MINIO_PUBLIC_IPS=44.35.1.1,44.35.1.2,44.35.1.3,44.35.1.4
minio server //rack{5...8}.host{5...8}.domain.com/mnt/export{1...32}

在此配置中,你可以看到 MINIO_ETCD_ENDPOINTS 指向管理MinIO配置的etcd後端。該後端管理MinIO config.json 和 存儲桶DNS SRV記錄。MINIO_DOMAIN 表示存儲桶的域名後綴,用於通過DNS解析存儲桶。例如,如果您有一個像mybucket這樣的bucket,那麼客戶機現在可以使用 mybucket.domain.com 直接將其自身解析到正確的集群。MINIO_PUBLIC_IPS 指向可以訪問每個集群的公共IP地址,這對於每個集群是唯一的。

注意:mybucket只存在於一個集群cluster1或cluster2中,這是隨機的,由domain.com的解析方式決定,如果存在循環DNS,domain.com則將隨機選擇哪個群集提供存儲桶。

註:etcd方式擴展的集群,上傳到某個集群池的數據,雖然其它集群池也可訪問到,但 bucket 和 數據 只存在於上傳到的集群池中。

3. 示例

#!/bin/sh

function start() {
    export MINIO_ETCD_ENDPOINTS="//192.168.199.140:2379,//192.168.199.141:2379,//192.168.199.142:2379"
    export MINIO_DOMAIN=domain.com
    export MINIO_PUBLIC_IPS=192.168.199.140,192.168.199.141

    export MINIO_ACCESS_KEY=minioadmin
    export MINIO_SECRET_KEY=minioadmin

    nohup /opt/minio/minio server //192.168.199.14{0...1}/data/minio/export{1...4} \
        > /opt/minio/minio.log 2>&1 &
#       > /dev/null 2>&1 &
}
NUM=`ps -C "minio" --no-header | wc -l`
ID=$(ps -ef | grep "minio" | grep -v "grep" | grep -v "sh" | awk '{print $2}')
if [ "start" = $1 ]; then
    if [ 0 -eq $NUM ]; then
        start
    fi
elif [ "restart" = $1 ]; then
    if [ 0 -ne $NUM ]; then
        kill -9 $ID | start
    else
        start
    fi
elif [ "stop" = $1 ]; then
    if [ 0 -ne $NUM ]; then
        kill -9 $ID
    fi
else
    echo "No sush command '$1'"
fi

擴展

#!/bin/sh

function start() {
    export MINIO_ETCD_ENDPOINTS="//192.168.199.140:2379,//192.168.199.141:2379,//192.168.199.142:2379"
    export MINIO_DOMAIN=domain.com
    export MINIO_PUBLIC_IPS=192.168.199.142,192.168.199.143

    export MINIO_ACCESS_KEY=minioadmin
    export MINIO_SECRET_KEY=minioadmin

    nohup /opt/minio/minio server //192.168.199.14{2...3}/data/minio/export{1...4} \
        > /opt/minio/minio.log 2>&1 &
#       > /dev/null 2>&1 &
}
NUM=`ps -C "minio" --no-header | wc -l`
ID=$(ps -ef | grep "minio" | grep -v "grep" | grep -v "sh" | awk '{print $2}')
if [ "start" = $1 ]; then
    if [ 0 -eq $NUM ]; then
        start
    fi
elif [ "restart" = $1 ]; then
    if [ 0 -ne $NUM ]; then
        kill -9 $ID | start
    else
        start
    fi
elif [ "stop" = $1 ]; then
    if [ 0 -ne $NUM ]; then
        kill -9 $ID
    fi
else
    echo "No sush command '$1'"
fi

相關鏈接

image etcd簡介及集群安裝部署使用
image 對象存儲服務MinIO安裝部署分佈式及Spring Boot項目實現文件上傳下載