开源对象存储工具:MinIO

olei 2,392 views 1

Minio 基本介绍

简介

  • MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以 100% 的运行在标准硬件。即 X86 等低成本机器也能够很好的运行 MinIO。
  • MinIO 与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为 MinIO 一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去 MinIO 的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。
  • MinIO 在传统对象存储用例 (例如辅助存储,灾难恢复和归档) 方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。

特性

擦除码

MinIO 使用按对象的嵌入式擦除编码保护数据,该编码以汇编代码编写,可提供最高的性能。 MinIO 使用 Reed-Solomon 代码将对象划分为 n / 2 个数据和 n / 2 个奇偶校验块-尽管可以将它们配置为任何所需的冗余级别。 这意味着在 12 个驱动器设置中,将一个对象分片为 6 个数据和 6 个奇偶校验块。即使丢失了多达 5 个 ((n / 2)–1) 个驱动器 (无论是奇偶校验还是数据),仍然可以从其余驱动器可靠地重建数据。MinIO 的实现可确保即使丢失或无法使用多个设备,也可以读取对象或写入新对象。最后,MinIO 的擦除代码位于对象级别,并且可以一次修复一个对象。
开源对象存储工具:MinIO

Bitrot 保护

无声的数据损坏或 Bitrot 是磁盘驱动器面临的严重问题,导致数据在用户不知情的情况下损坏。原因多种多样 (驱动器老化,电流尖峰,磁盘固件错误,虚假写入,读/写方向错误,驱动程序错误,意外覆盖),但结果是一样的——数据泄漏。
MinIO 对高速哈希算法的优化实现可确保它永远不会读取损坏的数据-它可以实时捕获和修复损坏的对象。 通过在 READ 上计算哈希值,并在 WRITE 上从应用程序,整个网络以及到内存/驱动器的哈希值,来确保端到端的完整性。 该实现旨在提高速度,并且可以在 Intel CPU 的单个内核上实现超过 10 GB /秒的哈希速度。
开源对象存储工具:MinIO

加密

加密飞行中的数据是一回事,保护静态数据是另一回事。 MinIO 支持多种复杂的服务器端加密方案,以保护数据-无论其位于何处。 MinIO 的方法可确保机密性,完整性和真实性,而性能开销却可以忽略不计。 使用 AES-256-GCM,ChaCha20-Poly1305 和 AES-CBC 支持服务器端和客户端加密。加密的对象使用 AEAD 服务器端加密进行了防篡改。此外,MinIO 与所有常用的密钥管理解决方案 (例如 HashiCorp Vault) 兼容并经过测试。
MinIO 使用密钥管理系统 (KMS) 支持 SSE-S3。如果客户端请求 SSE-S3,或启用了自动加密,则 MinIO 服务器会使用唯一的对象密钥对每个对象进行加密,该对象密钥受 KMS 管理的主密钥保护。由于开销极低,因此可以为每个应用程序和实例打开自动加密。
开源对象存储工具:MinIO

WORM

启用 WORM 后,MinIO 会禁用所有可能会使对象数据和元数据发生变异的 API。这意味着一旦写入数据就可以防止篡改。这对于许多不同的法规要求具有实际应用。

身份认证和管理

MinIO 支持身份管理中最先进的标准,并与 OpenID connect 兼容提供商以及主要的外部 IDP 供应商集成。这意味着访问是集中的,密码是临时的和轮换的,而不是存储在配置文件和数据库中。此外,访问策略是细粒度的且高度可配置的,这意味着支持多租户和多实例部署变得简单。
开源对象存储工具:MinIO

连续复制

传统复制方法的挑战在于它们无法有效扩展到几百 TB。话虽如此,每个人都需要一种复制策略来支持灾难恢复,并且该策略需要跨越地域,数据中心和云。 MinIO 的连续复制旨在用于大规模的跨数据中心部署。通过利用 Lambda 计算通知和对象元数据,它可以高效,快速地计算增量。
Lambda 通知确保与传统的批处理模式相反,更改可以立即传播。连续复制意味着即使发生高动态数据集,如果发生故障,数据丢失也将保持在最低水平。最后,就像 MinIO 所做的一样,连续复制是多厂商的,这意味着您的备份位置可以是从 NAS 到公共云的任何位置。
开源对象存储工具:MinIO

全局一致性

现代企业到处都有数据。 MinIO 允许将这些各种实例组合在一起以形成统一的全局名称空间。具体来说,最多可以将 32 个 MinIO 服务器组合成一个分布式模式集,并且可以将多个分布式模式集组合成一个 MinIO 服务器联合。每个 MinIO Server Federation 都提供统一的管理员和名称空间。
MinIO Federation Server 支持无限数量的分布式模式集。
这种方法的影响在于,对象存储可以为大型的,地理上分散的企业进行大规模扩展,同时保留从以下位置容纳各种应用程序 (S3 Select,MinSQL,Spark,Hive,Presto,TensorFlow,H20) 的能力。单一控制台。
开源对象存储工具:MinIO

多云网关

所有企业都在采用多云策略。这也包括私有云。因此,您的裸机虚拟化容器和公共云服务 (包括 Google,Microsoft 和阿里巴巴等非 S3 提供商) 必须看起来完全相同。尽管现代应用程序具有高度的可移植性,但为这些应用程序提供支持的数据却并非如此。
MinIO 应对的主要挑战是,无论数据位于何处,都使数据可用。 MinIO 在裸机,网络连接存储和每个公共云上运行。更重要的是,MinIO 通过 Amazon S3 API 从应用程序和管理角度确保您对数据的看法完全相同。
MinIO 可以走得更远,使您现有的存储基础架构与 Amazon S3 兼容。其影响是深远的。现在,组织可以真正统一其数据基础架构-从文件到块,所有这些都显示为可通过 Amazon S3 API 访问的对象,而无需迁移。
开源对象存储工具:MinIO

Minio 架构设计

MinIO 设计为云原生,可以作为轻量级容器运行,由外部编排服务 (如 Kubernetes) 管理。整个服务器约为 40MB 静态二进制文件,即使在高负载下也可以高效利用 CPU 和内存资源。结果是您可以在共享硬件上共同托管大量租户。
开源对象存储工具:MinIO
MinIO 在带有本地驱动器 (JBOD / JBOF) 的商品服务器上运行。集群中的所有服务器的功能均相同 (完全对称的体系结构)。没有名称节点或元数据服务器。
MinIO 将数据和元数据作为对象一起写入,从而无需使用元数据数据库。此外,MinIO 以内联,严格一致的操作执行所有功能 (擦除代码,位 rotrot 检查,加密)。结果是 MinIO 异常灵活。
每个 MinIO 群集都是分布式 MinIO 服务器的集合,每个节点一个进程。 MinIO 作为单个进程在用户空间中运行,并使用轻量级的协同例程来实现高并发性。将驱动器分组到擦除集 (默认情况下,每组 16 个驱动器),然后使用确定性哈希算法将对象放置在这些擦除集上。
MinIO 专为大规模,多数据中心云存储服务而设计。每个租户都运行自己的 MinIO 群集,该群集与其他租户完全隔离,从而使他们能够保护他们免受升级,更新和安全事件的任何干扰。每个租户通过联合跨地理区域的集群来独立扩展。

Minio 使用

安装部署

快速入门

MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
MinIO 是一个非常轻量的服务, 可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

  • Docker 容器
    docker pull minio/minio
    docker run -p 9000:9000 minio/minio server /data
  • Mac OS
    brew install minio/stable/minio
    minio server /data
  • 二进制部署
    • Mac OS
      wget http://dl.minio.org.cn/server/minio/release/darwin-amd64/minio
      chmod 755 minio
      ./minio server /data
    • Linux
      wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
      chmod 755 minio
      ./minio server /data
      ## 纠删码部署方式:
      minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8 /data9 /data10 /data11 /data12
    • Windows
      下载地址:http://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe
      minio.exe server D:\Photos
  • 使用源码安装
    go get -u github.com/minio/minio
  • 使用浏览器验证
    安装后使用浏览器访问 http://IP:9000,如果可以访问,则表示 minio 已经安装成功
    开源对象存储工具:MinIO

Docker 安装方式

  • Docker 中运行 MinIO 单点模式
    MinIO 需要一个持久卷来存储配置和应用数据。不过, 如果只是为了测试一下, 您可以通过简单地传递一个目录 (在下面的示例中为/ data) 启动 MinIO。这个目录会在容器启动时在容器的文件系统中创建,不过所有的数据都会在容器退出时丢失。

    docker run -p 9000:9000 minio/minio server /data

    要创建具有永久存储的 MinIO 容器,您需要将本地持久目录从主机操作系统映射到虚拟配置~/.minio 并导出/data 目录。 为此,请运行以下命令。

    • Linux/Mac
      docker run -p 9000:9000 --name minio1 -v /mnt/data:/data  -v /mnt/config:/root/.minio minio/minio server /data
    • Windows
      docker run -p 9000:9000 --name minio1  -v D:\data:/data  -v D:\minio\config:/root/.minio minio/minio server /data
  • MinIO Docker 提示
    MinIO 自定义 Access 和 Secret 密钥
    要覆盖 MinIO 的自动生成的密钥,您可以将 Access 和 Secret 密钥设为环境变量。 MinIO 允许常规字符串作为 Access 和 Secret 密钥。

    • Mac OS/Linux
      docker run -p 9000:9000 --name minio1 -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" -v /mnt/data:/data -v /mnt/config:/root/.minio minio/minio server /data
    • Windows
      docker run -p 9000:9000 --name minio1 -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" -v D:\data:/data -v D:\minio\config:/root/.minio minio/minio server /data

      使用 Docker secrets 进行 MinIO AccessSecret 密钥自定义
      要覆盖 MinIO 的自动生成的密钥, 你可以把 secret 和 access 秘钥创建成 Docker secrets. MinIO 允许常规字符串作为 Access 和 Secret 密钥

      echo "AKIAIOSFODNN7EXAMPLE" | docker secret create access_key -
      echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" | docker secret create secret_key -

      使用 docker service 创建 MinIO 服务,并读取 Docker secrets

      docker service create --name="minio-service" --secret="access_key" --secret="secret_key" minio/minio server /data
  • 以纠删码模式运行 Minio

    docker run -p 9000:9000 --name minio -v /mnt/data1:/data1 -v /mnt/data2:/data2 -v /mnt/data3:/data3 -v /mnt/data4:/data4 -v /mnt/data5:/data5 -v /mnt/data6:/data6 -v /mnt/data7:/data7 -v /mnt/data8:/data8 minio/minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8

    分布式 MinIO

    分布式 Minio 可以让你将多块硬盘 (甚至在不同的机器上) 组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障。

  • 分布式部署 MinIO 的好处

    1. 数据保护
      分布式 Minio 采用纠删码来防范多个节点宕机和位衰减 bit rot。
      分布式 Minio 至少需要 4 个硬盘,使用分布式 Minio 自动引入了纠删码功能。
    2. 高可用
      单机 Minio 服务存在单点故障,相反,如果是一个有 N 块硬盘的分布式 Minio, 只要有 N/2 硬盘在线,你的数据就是安全的。不过你需要至少有 N/2+1 个硬盘来创建新的对象。
      例如,一个 16 节点的 Minio 集群,每个节点 16 块硬盘,就算 8 台服務器宕机,这个集群仍然是可读的,不过你需要 9 台服務器才能写数据。
      注意,只要遵守分布式 Minio 的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用 2 个节点,每个节点 4 块硬盘,也可以使用 4 个节点,每个节点两块硬盘,诸如此类。
    3. 一致性
      Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型
  • 运行分布式 Minio

    注意:

    1. 分布式 Minio 里所有的节点需要有同样的 access 秘钥和 secret 秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行 minio server 命令之前,先将 access 秘钥和 secret 秘钥 export 成环境变量
    2. 分布式 Minio 使用的磁盘里必须是干净的,里面没有数据
    3. 分布式 Minio 里的节点时间差不能超过 3 秒,你可以使用 NTP 来保证时间一致
    4. 在 Windows 下运行分布式 Minio 处于实验阶段,请悠着点使用

启动分布式 Minio 实例,8 节点,每个节点 1 块盘,需要在 8 个节点都运行如下命令:

  • Mac OS/Linux
    export MINIO_ACCESS_KEY=<ACCESS_KEY>
    export MINIO_SECRET_KEY=<SECRET_KEY>
    minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
              http://192.168.1.13/export3 http://192.168.1.14/export4 \
               http://192.168.1.15/export5 http://192.168.1.16/export6 \
               http://192.168.1.17/export7 http://192.168.1.18/export8
    • windows
      set MINIO_ACCESS_KEY=<ACCESS_KEY>
      set MINIO_SECRET_KEY=<SECRET_KEY>
      minio.exe server http://192.168.1.11/C:/data http://192.168.1.12/C:/data ^
                http://192.168.1.13/C:/data http://192.168.1.14/C:/data ^
                http://192.168.1.15/C:/data http://192.168.1.16/C:/data ^
                http://192.168.1.17/C:/data http://192.168.1.18/C:/data

      开源对象存储工具:MinIO

启动分布式 Minio 实例,4 节点,每节点 4 块盘,需要在 4 个节点上都运行下面的命令

  • Mac OS/Linux
    export MINIO_ACCESS_KEY=
    export MINIO_SECRET_KEY=
    minio server http://192.168.1.11/export1 http://192.168.1.11/export2 \
               http://192.168.1.11/export3 http://192.168.1.11/export4 \
               http://192.168.1.12/export1 http://192.168.1.12/export2 \
               http://192.168.1.12/export3 http://192.168.1.12/export4 \
               http://192.168.1.13/export1 http://192.168.1.13/export2 \
               http://192.168.1.13/export3 http://192.168.1.13/export4 \
               http://192.168.1.14/export1 http://192.168.1.14/export2 \
               http://192.168.1.14/export3 http://192.168.1.14/export4
  • windows
    set MINIO_ACCESS_KEY=
    set MINIO_SECRET_KEY=
    minio.exe server http://192.168.1.11/C:/data1 http://192.168.1.11/C:/data2 ^
                  http://192.168.1.11/C:/data3 http://192.168.1.11/C:/data4 ^
                  http://192.168.1.12/C:/data1 http://192.168.1.12/C:/data2 ^
                  http://192.168.1.12/C:/data3 http://192.168.1.12/C:/data4 ^
                  http://192.168.1.13/C:/data1 http://192.168.1.13/C:/data2 ^
                  http://192.168.1.13/C:/data3 http://192.168.1.13/C:/data4 ^
                  http://192.168.1.14/C:/data1 http://192.168.1.14/C:/data2 ^
                  http://192.168.1.14/C:/data3 http://192.168.1.14/C:/data4

    开源对象存储工具:MinIO

  • 扩展现有的分布式集群
    例如我们是通过区的方式启动 MinIO 集群,命令行如下

    export MINIO_ACCESS_KEY=<ACCESS_KEY>
    export MINIO_SECRET_KEY=<SECRET_KEY>
    minio server http://host{1...32}/export{1...32}

    MinIO 支持通过命令,指定新的集群来扩展现有集群 (纠删码模式),命令行如下

    export MINIO_ACCESS_KEY=<ACCESS_KEY>
    export MINIO_SECRET_KEY=<SECRET_KEY>
    minio server http://host{1...32}/export{1...32} http://host{33...64}/export{1...32}

    现在整个集群就扩展了 1024 个磁盘,总磁盘变为 2048 个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。如上命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。
    说明: 您添加的每个区域必须具有与原始区域相同的磁盘数量 (纠删码集) 大小,以便维持相同的数据冗余 SLA。 例如,第一个区有 8 个磁盘,您可以将集群扩展为 16 个、32 个或 1024 个磁盘的区域,您只需确保部署的 SLA 是原始区域的倍数即可

Kubernetes 部署

  • 前提条件

    1. 默认 standaline(单机) 模式下,需要开启 Beta API 的 Kubernetes 1.4+
    2. distributed(分布式) 模式,需要开启 Beta API 的 Kubernetes 1.5+
    3. 底层支持 PV provisioner
    4. K8s 集群里需要有 Helm package manager installed
  • 使用 Helm Chart 部署 MinIO
    安装 MinIO chart

    helm install stable/minio
    参数 描述 默认值
    image MinIO 镜像名称 minio/minio
    imageTag MinIO 镜像 tag RELEASE.2017-08-05T00-00-53Z
    imagePullPolicy Image pull policy Always
    mode MinIO server 模式 (standalone, shared 或者 distributed) standalone
    numberOfNodes 节点数 (仅对分布式模式生效). 可选值 4 <= x <= 16 4
    accessKey 默认 access key AKIAIOSFODNN7EXAMPLE
    secretKey 默认 secret key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    configPath 默认配置文件路径 ~/.minio
    mountPath 默认挂载路径 /export
    serviceType Kubernetes service type LoadBalancer
    servicePort Kubernetes 端口 9000
    persistence.enabled 是否使用持久卷存储数据 true
    persistence.size 持久卷大小 10Gi
    persistence.storageClass 持久卷类型 generic
    persistence.accessMode ReadWriteOnce 或者 ReadOnly ReadWriteOnce
    resources CPU/Memory 资源需求/限制 Memory: 256Mi, CPU: 100m
  • 分布式 Minio
    默认情况下,以独立模式提供 MinIO 服务器。 要在分布式模式中配置 MinIO 服务器,请将 mode 字段设置为 distributed

    helm install --set mode=distributed stable/minio

    上述命令部署了个带有 4 个节点的分布式 MinIO 服务器。 要更改分布式 MinIO 服务器中的节点数,请设置 numberOfNodes 属性

    helm install --set mode=distributed,numberOfNodes=8 stable/minio

    StatefulSet 限制,适用于分布式 MinIO

    1. StatefulSets 需要持久化存储,所以如果 mode 设成 distributed 的话,persistence.enabled 参数不生效
    2. 卸载分布式 MinIO 版本时,需要手动删除与 StatefulSet 关联的卷

Shared MinIO
如需采用 shared mode 部署 MinIO, 将 mode 设为 shared

helm install --set mode=shared stable/minio

上述命令规定了 4 个 MinIO 服务器节点,一个存储。 要更改共享的 MinIO 部署中的节点数,请设置 numberOfNodes 字段

helm install --set mode=shared,numberOfNodes=8 stable/minio

上述命令规定了 MinIO 服务有 8 个节点,采用 shared 模式

发表评论 取消回复
表情 图片 链接 代码

  1. 热搜榜
    热搜榜 Lv 1

    文章不错支持一下吧

分享