分佈式MinIO入門

 

一、簡介

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

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

MinIO是一種高性能的分佈式對象存儲系統。它是軟件定義的,可在行業標準硬件上運行,並且在Apache V2許可下是100%開放源代碼。

MinIO的不同之處在於,它從一開始就被設計爲私有云對象存儲的標準。由於MinIO是專門爲僅服務對象而構建的,因此單層體系結構可在不妥協的情況下實現所有必需的功能。結果是一個同時具有性能,可伸縮性和輕量級的雲原生對象服務器。

儘管MinIO在傳統對象存儲用例(例如輔助存儲,災難恢復和歸檔)方面表現出色,但在克服與機器學習,分析和雲原生應用程序工作負載相關的私有云挑戰方面卻獨樹一幟。

更多請參考官方網站:https://min.io/

 

二、單機安裝

  1.  二進制安裝
# 下載
wget https://dl.min.io/server/minio/release/linux-amd64/minio

# 授權
chmod 755 minio

#快速啓動
./minio server ./data

#後臺啓動
nohup ./minio server --address 127.0.0.1:9001 ./data &

 

    2.docker 安裝

docker pull minio/minio
docker run -p 9000:9000 --name minio1 \
  -e "MINIO_ACCESS_KEY=minio123" \
  -e "MINIO_SECRET_KEY=minio123" \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  minio/minio server /data

到這裏直接 ip+端口 訪問即可

瞭解基本安裝後學習下分佈式安裝吧

三、分佈式安裝

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

1.分佈式Minio有什麼好處?

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

2.數據保護

分佈式Minio採用 糾刪碼來防範多個節點宕機和位衰減bit rot。

分佈式Minio至少需要4個硬盤,使用分佈式Minio自動引入了糾刪碼功能。

3.高可用

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

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

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

4.一致性

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

分佈式搭建的流程和單機搭建基本一樣,Minio服務基於命令行傳入的參數自動切換成單機模式還是分佈式模式。

 

四、運行分佈式Minio

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

  • 分佈式Minio裏所有的節點需要有同樣的access祕鑰和secret祕鑰,這樣這些節點才能建立聯接。爲了實現這個,你需要在執行minio server命令之前,先將access祕鑰和secret祕鑰export成環境變量。
  • 分佈式Minio使用的磁盤裏必須是乾淨的,裏面沒有數據。
  • 下面示例裏的IP僅供示例參考,你需要改成你真實用到的IP和文件夾路徑。
  • 分佈式Minio裏的節點時間差不能超過3秒,你可以使用NTP 來保證時間一致。
  • 在Windows下運行分佈式Minio處於實驗階段,請悠着點使用

二進制部署

這裏我採用兩個節點,每個節點兩塊硬盤

每個節點都要執行以下命令

1.數據存儲目錄

mkdir -p /minio/data1

mkdir -p /minio/data2

2.配置目錄

默認的配置目錄是 ${HOME}/.minio,可以使用 --config-dir命令行選項重寫。MinIO server在首次啓動時會生成一個新的config.json,裏面帶有自動生成的訪問憑據。

mkdir -p /etc/minio

3.下載上傳文件(下載請參考上面單機二進制安裝鏈接),我這裏上傳到 /usr/local/minio/

mkdir -p /usr/local/minio/

4. 編寫啓動腳本

vim /usr/local/minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123

/usr/local/minio/minio server --config-dir /etc/minio \
http://192.168.80.230/minio/data1 \
http://192.168.80.230/minio/data2 \
http://192.168.80.231/minio/data1 \
http://192.168.80.231/minio/data2 \

5.編輯服務腳本

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

[Service]
WorkingDirectory=/usr/local/minio/
ExecStart=/usr/local/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

WorkingDirectory 爲啓動腳本目錄

ExecStart 爲啓動腳本文件

 

6. 給這三個文件授權

chmod +x /usr/local/minio/minio

chmod +x /usr/local/minio/run.sh

chmod +x /usr/lib/systemd/system/minio.service

7. 啓動停止一些命令

# 刷新服務文件
systemctl daemon-reload

systemctl start minio

systemctl stop minio

systemctl enable minio

重複7個步驟在其他節點再執行

 

docker-compose 部署

Docker Compose允許定義和運行單主機,多容器Docker應用程序。

使用Compose,您可以使用Compose文件來配置MinIO服務。 然後,使用單個命令,您可以通過你的配置創建並啓動所有分佈式MinIO實例。 分佈式MinIO實例將部署在同一主機上的多個容器中。 這是建立基於分佈式MinIO的開發,測試和分期環境的好方法。

新建docker-compose.yaml 文件(這裏爲了方便先在一個centos7 下運行部署多個minio)

version: '3.7'

# starts 4 docker containers running minio server instances. Each
# minio server's web interface will be accessible on the host at port
# 9001 through 9004.
services:
  minio1:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data1-1:/data1
      - data1-2:/data2
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data2-1:/data1
      - data2-2:/data2
    ports:
      - "9002:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data3-1:/data1
      - data3-2:/data2
    ports:
      - "9003:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data4-1:/data1
      - data4-2:/data2
    ports:
      - "9004:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2:

 

啓動

 

可以使用 nginx  對着4臺機器進行負載均衡,具體配置自行查閱

測試

在一臺機器後創建bucket 或上傳文件會自動同步到其他節點。以下上傳一個圖片,進行測試

 

五、java 操作minio

1.maven 引入依賴

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.0.2</version>
        </dependency>

2. demo

import java.io.*;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

import org.xmlpull.v1.XmlPullParserException;

import io.minio.MinioClient;
import io.minio.errors.MinioException;

/**
 * @author shuzhuo
 * @date 2020/4/28 17:11
 */
public class FileUploader {

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
        try {

            String endpoint = "http://127.0.0.1:9001/";

            String accessKey = "minio";

            String secretKey = "minio123";

            String bucketName = "test111";

            String uploadFilePath = "C:\\Bing壁紙\\AbuSimbel_ROW8423253975_1920x1080.jpg";

            MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);

            boolean isExist = minioClient.bucketExists(bucketName);
            if (isExist) {
                System.out.println("Bucket already exists.");
            } else {
                minioClient.makeBucket(bucketName);
            }


            File file = new File(uploadFilePath);
            if (!file.exists()) {
                System.out.println("上傳文件不存在");
            }
//            上傳到服務器
            minioClient.putObject(bucketName, file.getName(), uploadFilePath, null);

//            獲取文件寫入本地
            minioClient.getObject(bucketName, file.getName(), "D://" + file.getName());


        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    }

}

六、官方參考硬件

貼上官方說明 :建議以高密度和高容量形式使用以下服務器配置

 

 

更多配置請閱讀 官方文檔

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章