MinIO分散式叢集的擴充套件方案及實現

莫忘歸發表於2021-04-23


MinIO 支援兩種擴充套件方式:

  • 通過修改命令列,在命令列上指定新的叢集集來擴充套件
  • 通過引入第三方元件etcd,在不動原有叢集的基礎上實現動態擴充套件方案

一、命令列方式擴充套件

MinIO 支援通過在命令列上指定新的叢集集來擴充套件分散式叢集,多個節點的儲存容量和就是分散式MinIO的儲存容量。

1. MinIO擴充套件叢集支援的命令語法

支援擴容的命令列如下:

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

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

2. 擴容示例

假如,我們的初始叢集為

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

那麼,叢集擴容命令列如下:

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://host{1...4}/export{1...16} http://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="http://remote-etcd1:2379,http://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 http://rack{1...4}.host{1...4}.domain.com/mnt/export{1...32}

叢集2

export MINIO_ETCD_ENDPOINTS="http://remote-etcd1:2379,http://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 http://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="http://192.168.199.140:2379,http://192.168.199.141:2379,http://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 http://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="http://192.168.199.140:2379,http://192.168.199.141:2379,http://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 http://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專案實現檔案上傳下載

相關文章