一、简介
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);
}
}
}
六、官方参考硬件
贴上官方说明 :建议以高密度和高容量形式使用以下服务器配置