1. 对象存储

1.1 简介

从本质上讲,对象存储是一种数据存储架构,允许以高度可扩展的方式存储大量非结构化数据。如今,我们需要在关系或非关系数据库中存储的可不仅仅是简单的文本信息。数据类型包括电子邮件、图像、视频、网页、音频文件、数据集、传感器数据和其他类型的媒体内容,也就是非结构化的数据。
区别于传统的存储,对象存储非常适合图片视频等数据的存储。这里就不得不提到另外两种存储方式。
image.png
文件存储是网络附加存储,其中数据存储在文件夹中。当需要访问文件时,计算机必须知道找到它的完整路径。
块存储将数据保存在原始块中,与文件存储不同,它可以通过存储区域网络访问,低延迟高性能,一般用于数据库相关操作。
很明显,文件存储便于共享,但是性能很差。块存储性能好,但是无法灵活的共享。
对象存储是一种全新体系结构,其中每个文件都保存为一个对象,并且可以通过 HTTP 请求访问它。这种类型的存储最适合需要管理大量非结构化数据的场景。在对象存储中,每个对象都会收到一个唯一的 id,消费者将使用它来检索它和丰富的元数据。
基于对象的存储系统不通过分层结构存储数据是其最显着的特征。缺乏基于文件夹的存储不仅使检索文件更容易,而且还为每条数据分配元数据。
对象存储是一种扁平结构,其中文件被分解成碎片并分散在硬件中。在对象存储中,数据被分成称为对象的离散单元并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块保存。

2. MINIO

2.1 简介

MinIO 是一款高性能、分布式的对象存储系统。它是一款软件产品,可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。
MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。
MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品。
独立的 MinIO 服务器最适合早期开发和评估。版本控制、对象锁定和存储桶复制等某些功能需要使用 Erasure Coding 分布式部署 MinIO。对于扩展开发和生产,部署启用纠删码的 MinIO - 具体来说,每个 MinIO 服务器至少有 4 个驱动器。

2.2 架构

2.2.1 产品特点

image.png

2.2.2 高级特性

image.png

2.2.3 数据组织架构

Minio对象存储系统把存储资源组织为租户-桶-对象的形式。数据结构组织见下图:
image.png

  • 对象:类似于hash表中的表项:它的名字相当于关键字,它的内容相当于“值”。
  • 桶:是若干个对象的逻辑抽象,是盛装对象的容器。
  • 租户:用于隔离存储资源。在租户之下可以建立桶、存储对象。
  • 用户:在租户下面创建的用于访问不同桶的账号。可以使用MinIO提供的mc命令设置不用用户访问各个桶的权限。

    2.2.4 数据容灾

    MinIO Erasure Coding 是一种数据冗余和可用性功能,它允许 MinIO 部署即时自动重建对象,尽管集群中丢失了多个驱动器或节点。与 RAID 或复制等相关技术相比,纠删码提供对象级修复,开销更少。
    擦除编码将对象拆分为数据块和奇偶校验块,其中奇偶校验块支持丢失或损坏的数据块的重建。MinIO在Erasure Set中跨节点和驱动器分布数据和奇偶校验块。根据配置的奇偶校验、节点数量和擦除集中每个节点的驱动器数量,MinIO 可以容忍多达一半的驱动器丢失并仍然检索存储的对象。
    下表列出了具有单个 16 驱动器服务器池的 MinIO 租户上不同 EC 级别的结果:
平价 总存储量 存储比 读取操作的最小驱动器 写操作的最小驱动器
EC: 4 12 TB 0.750 12 13
EC: 6 10 TB 0.625 10 11
EC: 8 8 TB 0.500 8 9

由于奇偶校验块需要存储空间,因此更高级别的奇偶校验可以提高对驱动器故障的容忍度,但会牺牲总可用存储容量。
MinIO 支持两种奇偶校验级别:标准(默认)和缩减。租户的默认奇偶校验级别取决于部署在该租户上的 MinIO 版本:

  • 对于 MinIO 版本RELEASE.2021-01-30T00-20-58Z及更高版本,默认标准EC取决于擦除集中的卷数:
    • 对于 8 卷或更多卷,EC:4
    • 对于 6-7 卷,EC:3
    • 对于 4-5 卷,EC:2
  • 对于 MinIO 版本RELEASE.2021-01-16T02-19-44Z或更早版本,默认EC为擦除集中驱动器的 1/2。例如,一个 16 驱动器的服务器池具有EC:8。

有关纠删码的更完整文档,请参阅 纠删码

2.2.5 数据分布及保留

MinIO采用去中心化的无共享架构,对象数据被打散存放在不同节点的多块硬盘,对外提供统一命名空间访问,并通过Web负载均衡器或DNS轮询(DNS round-robin)在各服务器之间实现负载均衡。
image.png
MinIO对象存储系统主要有两种部署方式,一种是常见的本地分布式集群部署,一种是联盟模式部署。本地分布式集群部署方式即在多个本地服务器节点部署MinIO软件,并将其组件成单套分布式存储集群,并提供统一命名空间和标准S3访问接口。联盟部署模式即将多个MinIO集群在逻辑上组成了统一命名空间,实现近乎无限的扩展与海量的数据规模管理,这些集群可以都在本地,或分布在不同地域的数据中心。
如下图所示,4个服务器节点组成一个MinIO集群,每个服务器节点中会选择相同数据的硬盘创建一个纠删组,某个桶的数据会根据MinIO的分布式算法,切片分散存储到对应的纠删组中。
image.png
MinIO存储系统的后端可以是磁盘,也可以作为云网关,对接第三方的NAS系统、分布式文件系统或公有云存储资源,并为业务系统转换提供标准的对象访问接口。
目前MinIO支持Google 云存储、HDFS、阿里巴巴OSS、亚马逊S3, 微软Azure Blob 存储等第三方存储资源。
image.png
默认情况下,对唯一对象名称的每个新写入操作都会导致覆盖该对象。您可以将 MinIO 配置为创建每个对象突变的版本,保留该对象的完整历史记录。MinIO 还支持一次写入多次读取 (WORM) 锁定版本化对象,以确保在指定持续时间直到显式解除锁定之前完全不变。
版本控制和对象锁定功能仅适用于 分布式 MinIO 部署
image.png
MinIO 支持将对象的多个“版本”保存在单个存储桶中。通常会覆盖现有对象的写入操作会导致创建新的版本化对象。MinIO 版本控制可防止意外覆盖和删除,同时提供对“撤消”写入操作的支持。存储桶版本控制是配置对象锁定和保留规则的先决条件 。
对于版本化存储桶,任何改变对象的写入操作都会导致该对象的新版本具有唯一的版本 ID。MinIO 标记客户端默认检索的对象的“最新”版本。然后,客户端可以明确选择列出、检索或删除特定对象版本。删除对象会产生一个特殊的 DeleteMarker墓碑,将对象标记为已删除,同时保留该对象的所有先前版本。
MinIO 支持配置对象生命周期管理规则,自动过期或转换老化的对象版本并释放存储容量。例如,您可以将规则配置为在对象版本变为非当前版本 90 天后自动过期。
您也可以使用以下命令手动删除对象版本:

  • mc rm—versions- 删除对象的所有版本。
  • mc rm—versions—older-than -删除早于指定日历日期的对象的所有版本。

    2.3 部署

    2.3.1 官方部署建议

    每个部署的最小节点数
    对于所有生产部署,MinIO 建议每个服务器池至少有 4 个节点,每个服务器有 4 个驱动器。使用默认的纠删码奇偶校验设置 ,即使丢失多达 4 个驱动器一个节点,此拓扑也可以继续提供读写操作。
    服务器硬件
    以下建议与 MinIO 的 大规模数据存储参考硬件相匹配:
处理器 双 Intel Xeon Scalable Gold CPU,每个插槽 8 个内核。
内存 128GB 内存
网络 至少 25GbE NIC 和支持节点之间的网络基础设施。
MinIO 可最大限度地利用驱动器吞吐量,使节点或客户端之间的网络链路完全饱和。
大型集群可能需要 100GbE 网络基础设施才能充分利用 MinIO 的每节点性能潜力。
驱动器 SATA/SAS NVMe/SSD,每台服务器至少有 8 个驱动器。
驱动器应该是没有 RAID 或类似技术的JBOD阵列。MinIO 推荐 XFS 格式以获得最佳性能。
在部署中的所有节点上使用具有相同容量的相同类型的磁盘(NVMe、SSD 或 HDD)。
MinIO 在使用底层存储时不区分驱动器类型,也不会从混合存储类型中受益。
此外,MinIO 将每个磁盘使用的大小限制为部署中的最小驱动器。
例如,如果部署有 15 个 10TB 磁盘和 1 个 1TB 磁盘,MinIO 将每个磁盘的容量限制为 1TB。

网络

MinIO 建议使用高速网络来支持附加存储(聚合驱动器、存储控制器和 PCIe 总线)的最大可能吞吐量。下表提供了给定 NIC 支持的最大存储吞吐量的一般准则:

网卡带宽 (Gbps) 估计的聚合存储吞吐量 (GBps)
10GbE 1GBps
25GbE 2.5GBps
50GbE 5GBps
100GbE 10GBps

CPU 分配

MinIO 受益于根据每个主机的预期网络吞吐量分配 CPU。
下表提供了根据主机支持的总网络带宽分配 CPU 以供使用的一般准则:

主机网卡带宽 推荐的 vCPU
10GbE 或更少 8 个 vCPU。
25GbE 16 个 vCPU。
50GbE 32 个 vCPU。
100GbE 64 个 vCPU。

内存分配

MinIO 受益于根据每个主机的总存储分配内存。
下表提供了根据主机上的本地存储总量分配内存以供 MinIO 服务器进程使用的一般准则:

总主机存储 推荐主机内存
高达 1 Tebibyte (Ti) 8GiB
高达 10 兆字节 (Ti) 16GiB
高达 100 兆字节 (Ti) 32GiB
高达 1 PB (Pi) 64GiB
超过 1 PB (Pi) 128GiB

2.3.2 本地分布式部署实践

服务端下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv ./minio /usr/local/bin

客户端下载
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv ./mc /usr/local/bin

启动方式一:默认命令启动
#单机启动(minio服务默认9000端口)
#指定服务端口及web后台端口,指定conf文件,指定磁盘
minio server —address “:9002” —console-address “:9003” —config-dir /etc/minio /data

分布式启动,每台服务器都运行该命令,磁盘文件夹必须为空
#不能挂在系统盘

服务器 内网ip 公网ip minio模拟盘
dwdev1.ishumei.com 10.0.64.141 82.157.117.73 /mnt/data/minio/export1
/mnt/data/minio/export2
dwdev2.ishumei.com 10.0.64.71 82.157.102.211 /mnt/data/minio/export1
/mnt/data/minio/export2
dwdev3.ishumei.com 10.0.64.79 82.157.118.227 /mnt/data/minio/export1
/mnt/data/minio/export2

启动命令(9002为自定义服务端端口,9003为自定义管理后台端口)
#每台服务器都需启动,先启动的服务器会等待后续服务器启动完毕
export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin
nohup minio server —address “:9002” —console-address “:9003” http://10.0.64.{141,71,79}/mnt/data/minio/export{1,2} & >> /var/log/minio

启动后进入后台管理界面(每台服务器都会启动一个web后台)
http://82.157.118.227:9003
账号:minioadmin
密码:minioadmin

启动方式二:注册服务
#也可将启动命令注册为system服务,由systemctl启动

  1. [Unit]
  2. Description=MinIO
  3. Documentation=https://docs.min.io
  4. Wants=network-online.target
  5. After=network-online.target
  6. AssertFileIsExecutable=/usr/local/bin/minio
  7. [Service]
  8. WorkingDirectory=/usr/local/
  9. User=root
  10. Group=root
  11. ProtectProc=invisible
  12. EnvironmentFile=/etc/default/minio
  13. ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
  14. ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
  15. # Let systemd restart this service always
  16. Restart=always
  17. # Specifies the maximum file descriptor number that can be opened by this process
  18. LimitNOFILE=1048576
  19. # Specifies the maximum number of threads this process can create
  20. TasksMax=infinity
  21. # Disable timeout logic and wait until process is stopped
  22. TimeoutStopSec=infinity
  23. SendSIGKILL=no
  24. [Install]
  25. WantedBy=multi-user.target
  26. # Built for ${project.name}-${project.version} (${project.name})
  1. # Set the hosts and volumes MinIO uses at startup
  2. # The command uses MinIO expansion notation {x...y} to denote a
  3. # sequential series.
  4. #
  5. # The following example covers four MinIO hosts
  6. # with 4 drives each at the specified hostname and drive locations.
  7. # The command includes the port that each MinIO server listens on
  8. # (default 9000)
  9. MINIO_VOLUMES="http://dwdev{1...3}.ishumei.com/mnt/data/minio/export{1...2}"
  10. # Set all MinIO server options
  11. #
  12. # The following explicitly sets the MinIO Console listen address to
  13. # port 9001 on all network interfaces. The default behavior is dynamic
  14. # port selection.
  15. MINIO_OPTS="--address :9002 --console-address :9003"
  16. # Set the root username. This user has unrestricted permissions to
  17. # perform S3 and administrative API operations on any resource in the
  18. # deployment.
  19. #
  20. # Defer to your organizations requirements for superadmin user name.
  21. MINIO_ROOT_USER="minioadmin"
  22. # Set the root password
  23. #
  24. # Use a long, random, unique string that meets your organizations
  25. # requirements for passwords.
  26. MINIO_ROOT_PASSWORD="minioadmin"
  27. # Set to the URL of the load balancer for the MinIO deployment
  28. # This value *must* match across all MinIO servers. If you do
  29. # not have a load balancer, set this value to to any *one* of the
  30. # MinIO hosts in the deployment as a temporary measure.
  31. MINIO_SERVER_URL="http://dwdev1.ishumei.com:9002"

配置开机自启
systemctl enable minio.service
#启动
systemctl start minio.service
#查看服务状态
systemctl status minio.service

2.2.3 客户端开发

官方SDK:https://docs.min.io/minio/baremetal/sdk/minio-drivers.html
java:https://docs.min.io/minio/baremetal/sdk/java/minio-java.html
go:https://docs.min.io/minio/baremetal/sdk/go/minio-go.html

2.2.4 mc使用

mc命令非常强大,可同时提供基础客户端服务(mc)及管理功能(mc admin)。

mc:

赋予现有minio服务集群命名空间(sm-minio):
mc alias set sm-minio http://10.0.64.141:9002 minioadmin minioadmin
查看当前指定集群的桶:
mc ls sm-minio
image.png

mc admin:

查看集群信息(sm-minio):
mc admin info sm-minio
image.png
升级集群:
mc admin update sm-minio

2.2.5 运维监控

配置prometus监控指标并使用管理后台可视化
  1. 生成令牌
    mc admin prometheus generate “集群命名空间”
  2. 输出scrape_configs配置到prometus(prometheus.yml)

image.png

  1. 重启prometheus服务并查看minio-job指标
  2. 在minio服务器上配置prometheus服务环境变量

export MINIO_PROMETHEUS_URL=”http://10.0.64.79:9090

  1. 重启minio集群

    2.2.6 数据存储

    文件对象上传到Minio集群上面,会在对应的磁盘当中,以Bucket名称为目录,文件名称为下一级目录,文件名下是part.1和 xl.meta,前者是编码数据块及检验块,后者是元数据文件。
    image.png
    常见的使用方案:
    image.png

    2.2.7 mc命令行简述

    使用命令测试与新添加的 MinIO 部署的连接:mc admin info “集群名”
    官方文档:https://docs.min.io/minio/baremetal/reference/minio-mc.html#command-quick-reference
命令 描述
mc alias set mc在 S3 兼容服务上运行的命令为该服务指定别名。
mc cat 该命令将文件或对象的内容连接到另一个文件或对象。
mc cp 该命令将对象复制到或从 MinIO 部署中复制,其中源可以是 MinIO本地文件系统。
mc diff mc 计算两个文件系统目录或 MinIO 存储桶之间的差异。仅列出那些丢失或大小不同的对象。不比较对象内容。
mc encrypt set
mc encrypt info
mc encrypt clear
该命令设置、更新或禁用默认存储桶服务器端加密 (SSE) 模式。MinIO 使用指定的 SSE 模式自动加密对象。
mc event add
mc event remove
mc event list
该命令支持添加、删除和列出存储桶事件通知。
MinIO 自动将触发事件发送到配置的通知目标。MinIO 支持 AMQP (RabbitMQ)、Redis、ElasticSearch、NATS 和 PostgreSQL 等通知目标
mc find 该命令支持在 MinIO 部署中搜索对象。您还可以使用该命令搜索文件系统上的文件。
mc head 该命令显示对象的第一行,其中是指定给命令的参数。
mc ilm add
mc ilm ls
mc ilm edit
mc ilm rm
mc ilm export
mc ilm import
该命令支持 在 MinIO 部署上管理对象生命周期管理规则。使用此命令在存储桶上设置对象转换和对象过期规则。
mc legalhold set
mc legalhold info
mc legalhold clear
该命令设置、删除或检索对象的对象合法保留 (WORM) 设置。
mc ls 该命令列出 MinIO 或其他 S3 兼容服务上的存储桶和对象。
mc mb 该命令在指定路径创建一个新的存储桶或目录。
mc mirror 该命令将内容同步到 MinIO 部署,类似于该实用程序。 支持文件系统、MinIO 部署和其他与 S3 兼容的主机作为同步源。
mc mv 该命令将对象从源移动到目标,例如在 MinIO 部署之间同一 MinIO 部署上的存储桶之间。 还支持在本地文件系统和 MinIO 之间移动对象。
mc policy set
mc policy set-json
mc policy get
mc policy get-json
mc policy list
mc policy links
该命令支持对存储桶及其内容设置或删除匿名 策略。具有匿名策略的存储桶允许公共访问,其中客户端可以执行策略授予的任何操作而无需身份验证。
mc rb 该命令删除 MinIO 其他 S3 兼容服务上的一个或多个存储桶。
要仅删除存储桶的内容,请改用。
mc retention set
mc retention info
mc retention clear
该命令 为存储桶中的一个或多个对象配置一次写入多次读取 (WORM) 锁定设置。您还可以为存储桶设置默认对象锁定设置,其中所有没有明确对象锁定设置的对象都继承存储桶默认设置。
mc replicate add
mc replicate edit
mc replicate ls
mc replicate status
mc replicate resync
mc replicate import
mc replicate export
mc replicate rm
该命令为 MinIO 部署 配置和管理服务器端存储桶复制,包括主动-主动复制配置和 重新同步
mc rm 该命令从 MinIO 部署的存储桶中删除对象。要完全移除存储桶,请改用。
mc share download
mc share upload
mc share list
和命令生成预签名 URL , 用于将对象下载和上传到 MinIO 存储桶。
mc sql 该命令提供了一个 S3 Select 接口,用于对指定 MinIO 部署中的对象执行 sql 查询。
mc stat 该命令显示有关 MinIO 存储桶中对象的信息,包括对象元数据。
mc support diagnostics
mc support inspect
mc support perf
mc support profile
mc support register
MinIO Client命令提供了用于分析部署运行状况或性能以及运行诊断的工具。您还可以使用MinIO SUBNET注册您的部署并上传生成的健康报告以供 MinIO 工程进一步分析。
mc tag set
mc tag remove
mc tag list
该命令添加、删除和列出与存储桶或对象关联的标签。
mc tree 该命令以树格式列出 MinIO 存储桶内的所有前缀。该命令可选地支持在每个前缀处列出存储桶内的所有对象,包括存储桶根。
mc update 该命令会自动将mc二进制文件更新为最新的稳定版本。
mc version 该命令启用、暂停和检索 MinIO 存储桶的版本控制配置。
mc watch 该命令监视指定的 MinIO 存储桶或本地文件系统路径上的事件。对于 S3 服务,用于在兼容 S3 的服务上配置存储桶事件通知。

mc admin 命令行管理:
MinIO Client命令行工具提供了对 MinIO 部署执行管理任务的命令。

命令 描述
mc admin bucket remote 该命令管理资源。
mc admin bucket quota 该命令管理每个存储桶的存储配额。
mc admin decommission 该命令启动 MinIO服务器池的停用过程。停用旨在删除较旧的服务器池,其硬件与部署中的池相比不再足够或性能不足。MinIO 根据每个池中可用空间的比例自动将数据从停用的池迁移到部署中的剩余池。
mc admin group 该命令管理 MinIO 部署上的组。
mc admin heal 该命令扫描损坏或损坏的对象并修复这些对象。
mc admin info 该命令显示有关 MinIO 服务器的信息。对于分布式 MinIO 部署,显示部署中每个 MinIO 服务器的信息。
mc admin kms key 该命令通过 MinIO 密钥加密服务 (KES) 执行加密密钥管理操作。
mc admin obd 该命令将目标 MinIO 部署的详细诊断信息生成为压缩文件。作为故障排除和诊断的一部分,MinIO 支持可能会要求输出。
mc admin policy 该命令管理与 MinIO 基于策略的访问控制 (PBAC) 一起使用的策略。MinIO PBAC 使用与 IAM 兼容的策略 JSON 文档来定义访问 MinIO 服务器上资源的规则。
mc admin profile 该命令为调试目的生成分析数据。
mc admin prometheus 该命令生成一个用于Prometheus的配置文件。
mc admin replicate 该命令为一组 MinIO 对等站点创建和管理站点复制。
站点复制模仿主动-主动存储桶复制,但适用于多个 MinIO 部署。无论站点集的 IAM 设置、存储桶或对象发生更改,更改都会复制到站点复制组中的所有站点。
mc admin service 该命令可以重启或停止 MinIO 服务器。
mc admin speedtest 该命令使用 和操作测试每个主机的吞吐量。
mc admin tier 该命令配置远程支持的 S3 兼容服务以支持 MinIO 生命周期管理。
mc admin top 该命令返回分布式 MinIO 部署的统计信息,类似于该命令的输出。
mc admin trace 该命令显示 针对部署中每个 MinIO 服务器的HTTP TRACE请求的结果。
mc admin update 该命令更新部署中的所有 MinIO 服务器。该命令还支持在部署没有公共 Internet 访问的环境中使用私有镜像服务器。
mc admin user 该命令管理 MinIO 部署上的用户。客户端 必须使用与部署中的用户关联的访问密钥和密钥对 MinIO 部署进行身份验证。MinIO 用户构成了 MinIO 身份和访问管理中的一个关键组件。
mc admin user 该命令在 MinIO 部署上创建和管理服务帐户。