一、簡介
MinIO 是一個基於Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日誌文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。
MinIO是一個非常輕量的服務,可以很簡單的和其他應用的結合,類似 NodeJS, Redis 或者 MySQL。
MinIO是一種高性能的分佈式對象存儲系統。它是軟件定義的,可在行業標準硬件上運行,並且在Apache V2許可下是100%開放源代碼。
MinIO的不同之處在於,它從一開始就被設計爲私有云對象存儲的標準。由於MinIO是專門爲僅服務對象而構建的,因此單層體系結構可在不妥協的情況下實現所有必需的功能。結果是一個同時具有性能,可伸縮性和輕量級的雲原生對象服務器。
儘管MinIO在傳統對象存儲用例(例如輔助存儲,災難恢復和歸檔)方面表現出色,但在克服與機器學習,分析和雲原生應用程序工作負載相關的私有云挑戰方面卻獨樹一幟。
更多請參考官方網站:https://min.io/
二、單機安裝
- 二進制安裝
# 下載
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);
}
}
}
六、官方參考硬件
貼上官方說明 :建議以高密度和高容量形式使用以下服務器配置