分布式对象存储组件MinIO

概述

基于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:

  1. /minio/health/live:不鉴权,指示服务器是否工作正常
  2. /minio/health/ready:不鉴权,指示服务器是否由于重负载而未接受连接
  3. /minio/prometheus/metrics:鉴权,

对比

产品HDFSFastDFSMinIO
开发语言JavaCgo
部署麻烦
文档不完整
读速度
写速度
分布式
高可用

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MinIO是一个开源的分布式对象存储服务,它可以在私有云环境中提供高性能和高可用性的存储解决方案。下面是关于MinIO的一些基本概念和使用方法: 1. 分布式存储MinIO使用分布式架构,可以将数据存储在多个节点上,实现数据的冗余和高可用性。每个节点都可以独立地提供存储服务,并且可以通过添加更多的节点来扩展存储容量和吞吐量。 2. 对象存储MinIO对象的形式存储数据,每个对象都有一个唯一的键(Key)和对应的值(Value)。对象可以是任意类型的文件,例如图片、视频、文档等。通过使用对象存储MinIO可以提供高效的数据访问和管理。 3. 数据分片:MinIO将每个对象分成多个数据片段(Data Shard),并将它们分布在不同的节点上。这种数据分片的方式可以提高数据的可靠性和可用性,同时也可以提高数据的读写性能。 4. 冗余备份:MinIO使用纠删码(Erasure Code)技术来实现数据的冗余备份。纠删码可以将数据分成多个片段,并将这些片段分布在不同的节点上。即使某个节点发生故障,系统仍然可以通过其他节点上的数据片段进行数据恢复。 5. 客户端接口:MinIO提供了丰富的客户端接口,可以方便地与MinIO进行交互。你可以使用MinIO的命令行工具、API接口或者各种编程语言的SDK来管理和操作MinIO存储。 下面是一个使用MinIO Python SDK上传文件的例子: ```python from minio import Minio # 创建MinIO客户端 client = Minio('play.min.io', access_key='YOUR_ACCESS_KEY', secret_key='YOUR_SECRET_KEY', secure=True) # 上传文件 client.fput_object('mybucket', 'myobject', 'path/to/local/file.jpg') # 关闭客户端连接 client.close() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnny233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值