概述
基于Golang编写的开源对象存储组件,100%兼容s3,最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/VM镜像。对象的大小从几KB到最大5TB。与现在的虚拟技术,如k8s、k3s、etcd、docker等深度集成,为云环境而生。
特点:
- 高性能:在标准硬件条件下,其读写速率分别可以达到 55Gb/s 和 35Gb/s。MinIO支持的对象文件可以是任意大小,从几KB到最大5T不等
- 可扩展:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并且支持跨越多个数据中心
- 云原生:容器化、基于K8S的编排、多租户支持。
- Amazon S3兼容:使用 Amazon S3 v2 / v4 API。可使用Minio SDK,Minio Client,AWS SDK和AWS CLI 访问Minio服务器
- 高可用:单机 Minio 服务存在单点故障,相反,如果是一个有 N 块硬盘的分布式 Minio,只要有 N/2 硬盘在线,数据就是安全的。不过你需要至少有 N/2+1 个硬盘来创建新的对象。一个 16 节点的 Minio 集群,每个节点 16 块硬盘,就算 8 台服務器宕机,集群仍然可读,不过需要 9 台服務器才能写数据。只要遵守分布式 Minio 的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用 2 个节点,每个节点 4 块硬盘,也可以使用 4 个节点,每个节点两块硬盘,诸如此类
- 一致性:Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型
- 数据保护:分布式Minio采用纠删码来防范多个节点宕机和位衰减 bit rot。分布式Minio至少需要4个硬盘,分布式自动引入纠删码功能
优点:
- 安装部署简单,一个二进制文件(minio)即是一切,支持各种平台
- 支持海量存储,可以按 zone 扩展,单个对象支持最大5TB
- 低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为 2(即存储一个 1M 的数据对象,实际占用磁盘空间为 2M)。但在任意 n/2 块 disk 损坏的情况下依然可以读出数据(n 为一个纠删码集合中的 disk 数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的
- 读写性能优异
概念
- S3:Simple Storage Service,简单存储服务,S3提供一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。
Object:存储到 Minio 的基本对象,如文件、字节流等
Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据相互隔离。
Drive:部署 Minio 时设置的磁盘,Minio 中所有的对象数据都会存储在 Drive 里。
Set:一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的 Drive 分布在不同位置。 - 一个对象存储在一个Set上,一个集群划分为多个Set
- 一个 Set 包含的 Drive 数量是固定的,默认由系统根据集群规模自动计算得出
- 一个Set中的 Drive 尽可能分布在不同的节点上
- 对象最终是存储在Set上,Set是一组Drive的集合
安装
和Hadoop一样,有3种安装方式:
- 单主机单硬盘模式
Minio 只在一台服务器上搭建服务,且数据都存在单块磁盘上,该模式存在单点风险,主要用作开发、测试等使用 - 单主机多硬盘模式(伪分布式)
Minio 在一台服务器上搭建服务,但数据分散在多块(大于 4 块)磁盘上,提供数据安全保障。 - 多主机多硬盘模式(分布式)
通过共享一个 access_key 和 secret_key,在多台服务器上搭建服务,且数据分散在多块(大于 4 块,无上限)磁盘上,提供强大的数据冗余机制(Reed-Solomon 纠删码)。
分布式安装
安装步骤省略。
单独对每个节点进行访问显然不合理,可通过nginx代理进行负载均衡。安装nginx:
yum install epel-release -y
yum install nginx -y
systemctl start nginx
systemctl status nginx
systemctl enable nginx
添加配置文件:
vi /etc/nginx/conf.d/minio.conf
upstream minio_api {
server 192.168.182.110:9000;
server 192.168.182.111:9000;
server 192.168.182.112:9000;
}
upstream minio_console {
server 192.168.182.110:9001;
server 192.168.182.111:9001;
server 192.168.182.112:9001;
}
server {
listen 19000;
server_name 192.168.182.110;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://minio_api;
}
}
server {
listen 19001;
server_name 192.168.182.110;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://minio_console;
}
}
重启加载配置
nginx -t
nginx -s reload
# 或
systemctl reload nginx
客户端
提供Java、JS、Python、Golang、.Net等各语言的SDK。
命令行
命令 | 描述 |
---|---|
ls | 列出文件和文件夹 |
mb | 创建一个存储桶或一个文件夹 |
cat | 显示文件和对象内容 |
pipe | 将一个STDIN重定向到一个对象或者文件或者STDOUT |
share | 生成用于共享的URL |
cp | 拷贝文件和对象 |
mirror | 给存储桶和文件夹做镜像 |
find | 基于参数查找文件 |
diff | 对两个文件夹或者存储桶比较差异 |
rm | 删除文件和对象 |
events | 管理对象通知 |
watch | 监听文件和对象的事件 |
policy | 管理访问策略 |
session | 为cp命令管理保存的会话 |
config | 管理mc配置文件 |
update | 检查软件更新 |
version | 输出版本信息 |
mc
MinIO Client mc 命令行工具为 UNIX 命令(如 ls、cat、cp、mirror 和)提供一种现代替代方案,并 diff 支持文件系统和兼容 Amazon S3 的云存储服务。
mc 命令行工具是为与 AWS S3 API 兼容而构建的,并针对预期的功能和行为测试MinIO 和 AWS S3。
MinIO 不为其他与 S3 兼容的服务提供任何保证,因为它们的 S3 API 实现是未知的,因此不受支持。
下载
cd /opt/minio/
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
添加 MinIO 存储服务
MinIO 服务器显示 URL,访问权和秘密密钥。
用法:mc config host add <ALIAS> <YOUR-MINIO-ENDPOINT> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
示例
cd /opt/minio/
# 明文输入
./mc config host add minio http://local-168-182-110:19000 admin 123456
# 密文输入(推荐)
./mc config host add minio http://local-168-182-110:19000
Enter Access Key: admin
Enter Secret Key: 123456
测试
cd /opt/minio/
# 获取别名为minio的MinIO服务器信息
./mc admin info minio
# 添加外壳别名以获取信息,以便恢复
alias minfo='/opt/minio/mc admin info'
alias mheal='/opt/minio/mc admin heal'
Java
引入maven依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
配置类:
minio:
url: http://192.168.100.144
# 秘钥
accessKey: 123456
secretKey: abcdef
Service工具类封装:
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.InputStream;
@Slf4j
@Service
public class MinioService {
@Value("${minio.url}")
private String url;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
private MinioClient instance;
@PostConstruct
public void init() {
try {
instance = new MinioClient(url, accessKey, secretKey);
} catch (Exception e) {
log.error("init MinioClient error:{}", e);
}
}
/**
* 判断bucket是否存在
*/
public boolean bucketExists(String bucketName) {
try {
return instance.bucketExists(bucketName);
} catch (Exception e) {
log.error("bucketExists error:{}", e);
}
return false;
}
/**
* 创建bucket
*/
public void makeBucket(String bucketName) throws Exception {
boolean isExist = instance.bucketExists(bucketName);
if (!isExist) {
instance.makeBucket(bucketName);
}
}
/**
* 文件上传
*/
@SuppressWarnings("deprecation")
public void uploadFile(String bucketName, String objectName, InputStream stream) throws Exception {
instance.putObject(bucketName, objectName, stream, "application/octet-stream");
}
/**
* 获取过期时间url expires(秒)
*/
public String getFileUrl(String bucketName, String objectName, Integer expires) throws Exception {
return instance.presignedGetObject(bucketName, objectName, expires);
}
/**
* 文件下载
*/
public InputStream downFile(String bucketName, String objectName) throws Exception {
return instance.getObject(bucketName, objectName);
}
/**
* 删除文件
*/
public void delFile(String bucketName, String objectName) throws Exception {
instance.removeObject(bucketName, objectName);
}
}
进阶
纠删码
即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。对象存储都是存的比较大的数据,写入耗时比协调耗时要长的多,没必要使用类似Raft或者Paxos一样的复杂协调机制。
纠删码是一种恢复丢失和损坏数据的数学算法,该技术在分布式存储系统中的应用主要有三类:
- 阵列纠删码(Array Code: RAID5、RAID6等)
- RS(Reed-Solomon)里德-所罗门类纠删码
- LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。
压缩
多租户
Federation
STS
secure token service,安全令牌服务
监控
暴露3个endpoint:
/minio/health/live
:不鉴权,指示服务器是否工作正常/minio/health/ready
:不鉴权,指示服务器是否由于重负载而未接受连接/minio/prometheus/metrics
:鉴权,
对比
产品 | HDFS | FastDFS | MinIO |
---|---|---|---|
开发语言 | Java | C | go |
部署 | 麻烦 | ||
文档 | 不完整 | ||
读速度 | |||
写速度 | |||
分布式 | |||
高可用 |