對象存儲服務MinIO安裝部署分布式及Spring Boot項目實現文件上傳下載


一、MinIO快速入門

1. MinIO簡介

MinIO 是一個基於Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。

MinIO 是一個基於Apache License MinIO是一個非常輕量的服務,可以很簡單的和其他應用的結合,類似 NodeJS, Redis 或者 MySQL。

2. CentOS7更換成阿里雲鏡像

image CentOS更換aliyun鏡像站

https://www.cnblogs.com/lishen2021/p/14680564.html

3. 安裝

3.1 下載

下載:
    wget https://dl.min.io/server/minio/release/linux-amd64/minio

3.2 運行測試

修改文件執行權限:
    chmod +x minio

運行:
    MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin ./minio server /data/minio/standalone

安裝啟動后使用瀏覽器訪問http://ip:port,默認端口為:9000,如果可以訪問,則表示minio已經安裝成功。賬號和密碼分別為:MINIO_ACCESS_KEY、MINIO_SECRET_KEY

4. 配置腳本執行文件

4.1 創建配置執行文件

創建可執行文件 minio.sh

touch minio.sh

添加以下腳本內容:

#!/bin/sh

function start() {
    export MINIO_ACCESS_KEY=minioadmin
    export MINIO_SECRET_KEY=2020_minio@admin
    nohup /home/minio/minio server /home/minio/data > /home/minio/logs/minio.log 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

case $1 in
    "start")
        if [ 0 -eq $NUM ]; then
            start
        fi
        ;;
    "restart")
        if [ 0 -ne $NUM ]; then
            kill -9 $ID | start
        else
            start
        fi
        ;;
    "stop")
        if [ 0 -ne $NUM ]; then
            kill -9 $ID
        fi
        ;;
    *)
        echo "No sush command '$1'"
        ;;
esac

腳本中使用 if 或 case 都可以

4.2 執行

啟動:
    sh minio.sh start

輸出執行信息方式啟動:
    sh -x minio.sh start

重啟:
    sh minio.sh restart

停止服務:
    sh minio.sh stop

二、分布式MinIO快速入門

1. 分布式MinIO快速入門

分布式Minio可以讓你將多塊硬盤(甚至在不同的機器上)組成一個對象存儲服務。由於硬盤分布在不同的節點上,分布式Minio避免了單點故障。

1.1 分布式Minio有什么好處?

在大數據領域,通常的設計理念都是無中心和分布式。Minio分布式模式可以幫助你搭建一個高可用的對象存儲服務,你可以使用這些存儲設備,而不用考慮其真實物理位置。

1.2 數據保護

分布式Minio采用 糾刪碼 來防范多個節點宕機和位衰減bit rot。分布式Minio至少需要4個硬盤,使用分布式Minio自動引入了糾刪碼功能。

1.3 高可用

單機Minio服務存在單點故障,相反,如果是一個有N塊硬盤的分布式Minio,只要有N/2硬盤在線,你的數據就是安全的。不過你需要至少有N/2+1個硬盤來創建新的對象。

例如,一個16節點的Minio集群,每個節點16塊硬盤,就算8台服務器宕機,這個集群仍然是可讀的,不過你需要9台服務器才能寫數據。

注意:只要遵守分布式Minio的限制,你可以組合不同的節點和每個節點幾塊硬盤。比如,你可以使用2個節點,每個節點4塊硬盤,也可以使用4個節點,每個節點兩塊硬盤,諸如此類。

1.4 一致性

Minio在分布式和單機模式下,所有讀寫操作都嚴格遵守read-after-write一致性模型。

2. 配置運行分布式Minio

啟動一個分布式Minio實例,你只需要把硬盤位置做為參數傳給minio server命令即可,然后,你需要在所有其它節點運行同樣的命令。

注意:

1. 分布式Minio里所有的節點需要有同樣的access秘鑰和secret秘鑰,這樣這些節點才能建立聯接。為了實現這個,你需要在執行minio server命令之前,先將access秘鑰和secret秘鑰export成環境變量。
2. 分布式Minio使用的磁盤里必須是干凈的,里面沒有數據。
3. 分布式Minio里的節點時間差不能超過3秒,你可以使用NTP來保證時間一致。

2.1 將access秘鑰和secret秘鑰export成環境變量

注:需要在每個節點上都運行

export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin

2.2 啟動分布式Minio實例

配置:2個節點,每個節點2塊盤。

執行命令:

./minio server http://192.168.199.140/data/minio/export1 http://192.168.199.140/data/minio/export2 http://192.168.199.141/data/minio/export1 http://192.168.199.141/data/minio/export2

注:需要在兩個節點上都運行

2.3 配置成啟動腳本

2.3.1 創建配置執行文件

創建可執行文件 minio-cluster.sh

touch minio-cluster.sh

添加內容如下:

#!/bin/sh

function start() {
    export MINIO_ACCESS_KEY=minioadmin
    export MINIO_SECRET_KEY=minioadmin
#    nohup /opt/minio/minio server http://192.168.199.140/data/minio/export1 \
#                                  http://192.168.199.140/data/minio/export2 \
#                                  http://192.168.199.141/data/minio/export1 \
#                                  http://192.168.199.141/data/minio/export2 \
#       > /dev/null 2>&1 &

    nohup /opt/minio/minio server http://192.168.199.140/data/minio/export1 \
                                  http://192.168.199.140/data/minio/export2 \
                                  http://192.168.199.141/data/minio/export1 \
                                  http://192.168.199.141/data/minio/export2 \
        > /opt/minio/minio.log 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

2.3.2 執行

啟動:
    sh minio-cluster.sh
    
輸出執行信息方式啟動:
    sh -x minio-cluster.sh
    
重啟:
    sh minio-cluster.sh restart

停止服務:
    sh minio-cluster.sh stop

三、糾刪碼(erasure code)

Minio使用糾刪碼erasure code和校驗和checksum來保護數據免受硬件故障和無聲數據損壞。 即便您丟失一半數量(N/2)的硬盤,您仍然可以恢復數據。

1. 糾刪碼(erasure code)

1.1 什么是糾刪碼erasure code?

糾刪碼是一種恢復丟失和損壞數據的數學算法, Minio采用Reed-Solomon code將對象拆分成N/2數據和N/2 奇偶校驗塊。 這就意味着如果是12塊盤,一個對象會被分成6個數據塊、6個奇偶校驗塊,你可以丟失任意6塊盤(不管其是存放的數據塊還是奇偶校驗塊),你仍可以從剩下的盤中的數據進行恢復,是不是很NB,感興趣的同學請FQgoogle。

1.2 為什么糾刪碼有用?

糾刪碼的工作原理和RAID或者復制不同,像RAID6可以在損失兩塊盤的情況下不丟數據,而Minio糾刪碼可以在丟失一半的盤的情況下,仍可以保證數據安全。 而且Minio糾刪碼是作用在對象級別,可以一次恢復一個對象,而RAID是作用在卷級別,數據恢復時間很長。 Minio對每個對象單獨編碼,存儲服務一經部署,通常情況下是不需要更換硬盤或者修復。Minio糾刪碼的設計目標是為了性能和盡可能的使用硬件加速。

image

1.3 什么是位衰減bit rot保護?

位衰減又被稱為數據腐化Data Rot、無聲數據損壞Silent Data Corruption,是目前硬盤數據的一種嚴重數據丟失問題。硬盤上的數據可能會神不知鬼不覺就損壞了,也沒有什么錯誤日志。正所謂明槍易躲,暗箭難防,這種背地里犯的錯比硬盤直接咔咔宕了還危險。 不過不用怕,Minio糾刪碼采用了高速 HighwayHash 基於哈希的校驗和來防范位衰減。

相關鏈接

MinIO個人項目測試

image Gitee項目地址
image GitHub項目地址

MinIO其它文章

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


免責聲明!

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



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