Github 29K Star的开源对象存储方案——Minio入门宝典

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 对象存储不是什么新技术了,但是从来都没有被替代掉。为什么?在这个大数据发展迅速地时代,数据已经不单单是简单的文本数据了,每天有大量的图片,视频数据产生,在短视频火爆的今天,这个数量还在增加。有数据表明,当今世界产生的数据,有80%是非关系型的。那么,对于图片,视频等数据的分析可以说是大数据与人工智能的未来发展方向之一。

但是如何存储这些数据呢?商用云方案往往价格昂贵,而传统的大数据解决方案并不能充分支撑图片,视频数据的存储与分析。本文将详细的介绍开源的对象存储解决方案Minio的部署与实践,文章将分为以下几部分进行介绍。

image.png


1、对象存储


从本质上讲,对象存储是一种数据存储架构,允许以高度可扩展的方式存储大量非结构化数据。

如今,我们需要在关系或非关系数据库中存储的可不仅仅是简单的文本信息。数据类型包括电子邮件、图像、视频、网页、音频文件、数据集、传感器数据和其他类型的媒体内容。也就是非结构化的数据。

区别于传统的存储,对象存储非常适合图片视频等数据的存储。这里就不得不提到另外两种存储方式。

文件存储 vs 块存储 vs 对象存储

image.png

文件存储是网络附加存储,其中数据存储在文件夹中。当需要访问文件时,计算机必须知道找到它的完整路径。

块存储将数据保存在原始块中,与文件存储不同,它可以通过存储区域网络访问,低延迟高性能,一般用于数据库相关操作。

很明显,文件存储便于共享,但是性能很差。块存储性能好,但是无法灵活的共享。那么,有没有一种方案可以兼顾呢?

对象存储

对象存储是一种全新体系结构,其中每个文件都保存为一个对象,并且可以通过 HTTP 请求访问它。这种类型的存储最适合需要管理大量非结构化数据的场景。在对象存储中,每个对象都会收到一个唯一的 id,消费者将使用它来检索它和丰富的元数据。

基于对象的存储系统不通过分层结构存储数据是其最显着的特征。缺乏基于文件夹的存储不仅使检索文件更容易,而且还为每条数据分配元数据。

对象存储,是一种扁平结构,其中文件被分解成碎片并分散在硬件中。在对象存储中,数据被分成称为对象的离散单元并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块保存。

image.png

对象存储 VS HDFS

有人会问,大数据不能解决对象存储的问题吗?HDFS确实很强大,也解决分布式存储的瓶颈问题,但是还有很多不足之处。

元数据的扩展性:NameNode是一个中央元数据服务节点,也是集群管理节点,文件系统的元数据以及块位置关系全部在内存中。NameNode对内存的要求非常高,需要定制大内存的机器,内存大小也限制了集群扩展性。

全局锁:NameNode 有一把FSNamesystem全局锁,每个元数据请求时都会加这把锁。虽然是读写分开的,且有部分流程对该锁的持有范围进行了优化,但依然大问题。

块汇报风暴:HDFS块大小默认128M,启动几百PB数据量的集群时,NameNode需要接受所有块汇报才可以退出安全模式,因此启动时间会达数小时。

HDFS是为了大文件存储而设计的,天生对于图片视频这种海量的小文件支持有限。毫无疑问对象存储才是最佳选择。

对象存储方案

过去的相当长的一段时间里,商用对象存储占据了市场上的大量的份额。国外的Amazon S3,国内的阿里云OSS都成为了大多数公司的选择。

但是构建一个企业级的数据湖(包括结构化和非结构化数据)已经成为了越来越多公司的目标,私有化的对象存储方案迫在眉睫。

开源的私有化的对象存储方案选择很多,如分布式对象、块和文件存储平台Ceph,简单的、高度可扩展的分布式文件系统SeaweedFS,以及本文要介绍的高性能,云原生的对象存储MinIO。


2、Minio概述


MinIO是个高性能,云原生的对象存储。Github有近30K的Star。

image.png

https://github.com/minio/minio

它提供了与 Amazon S3 云存储服务兼容的 API,使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。

轻量,操作简单。

特点

  1. 构建高性能的云原生数据;
  2. 机器学习,大数据分析,海量存储的基础架构;
  3. MinIO支持各种应用程序数据工作负载;
  4. 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品。

高性能

MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。MinIO用作云原生应用程序的主要存储,与传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。

可扩展性

MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。这是我们坚定的理念 “简单可扩展.” 在 MinIO, 扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心。通过添加更多集群可以扩展名称空间, 更多机架,直到实现目标。

云原生支持

MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。

开放全部源代码 + 企业级支持

MinIO 基于Apache V2 license 100% 开放源代码 。这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。

与Amazon S3 兼容

亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。

简单

极简主义是MinIO的指导性设计原则。简单性减少了出错的机会,提高了正常运行时间,提供了可靠性,同时简单性又是性能的基础。只需下载一个二进制文件然后执行,即可在几分钟内安装和配置MinIO。配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到接近于0的水平。MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级,并且不需要停机即可完成升级操作 - 降低总使用和运维成本。

与大数据集成

MinIO与领先的分析和机器学习框架进行了本地集成。

image.png

Minio是目前全世界增长最快的对象存储系统。


3、部署与安装


Minio支持原生安装与容器化安装等安装方式,本着简单化的原则,安装起来非常的简单,相关安装包可以在资料包中获取。

容器安装

运行以下命令以使用临时数据卷将 MinIO 的最新稳定映像作为容器运行:

Copypodman run \
  -p 9000:9000 \
  -p 9001:9001 \
  minio/minio server /data --console-address ":9001"

MinIO 部署开始使用默认的 root 凭据 minioadmin:minioadmin。您可以使用 MinIO 控制台测试部署,这是一个嵌入式 内置于 MinIO 服务器的对象浏览器。将主机上运行的 Web 浏览器指向 http://127.0.0.1:9000 并使用 根凭据。您可以使用浏览器来创建桶、上传对象以及浏览 MinIO 服务器的内容。

Linux

使用以下命令在运行 64 位 Intel/AMD 架构的 Linux 主机上运行独立的 MinIO 服务器。将/data 替换为您希望 MinIO 存储数据的驱动器或目录的路径。

wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data

/data 替换为您希望 MinIO 存储数据的驱动器或目录的路径。

Windows

使用以下命令在 Windows 主机上运行独立的 MinIO 服务器。将“D:\”替换为您希望 MinIO 存储数据的驱动器或目录的路径。您必须将终端或 powershell 目录更改为 minio.exe 可执行文件的位置,将该目录的路径添加到系统 $PATH 中:

minio.exe server D:\

MinIO 部署开始使用默认的 root 凭据 minioadmin:minioadmin。您可以使用 MinIO 控制台测试部署,这是一个内置在 MinIO 服务器中的基于 Web 的嵌入式对象浏览器。将主机上运行的 Web 浏览器指向 http://127.0.0.1:9000 并使用 root 凭据登录。您可以使用浏览器来创建桶、上传对象以及浏览 MinIO 服务器的内容。

测试

MinIO Server 带有一个基于 Web 的嵌入式对象浏览器。将您的 Web 浏览器指向 http://127.0.0.1:9000 以确保您的服务器已成功启动。

image.png

分布式安装

在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

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

GNU/Linux 和 macOS

Copyexport 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

Copyset 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

K8S部署

Kubernetes的部署和状态集提供了在独立,分布式或共享模式下部署MinIO服务器的完美平台。在Kubernetes上部署MinIO有多种选择,您可以选择最适合您的。

  • 默认standaline模式下,需要开启Beta API的Kubernetes 1.4+。
  • distributed 模式,需要开启Beta API的Kubernetes 1.5+。
  • 底层支持PV provisioner。
  • 你的K8s集群里需要有Helm package manager installed。

安装 MinIO chart

$ helm install stable/minio
helm install --name my-release \
  --set persistence.size=100Gi \
    stable/minio

上述命令部署了一个带上100G持久卷的MinIO服务。

要在分布式模式中配置MinIO服务器,请将mode字段设置为distributed,

Copy$ helm install --set mode=distributed stable/minio

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

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

上述命令部署了个带有8个节点的分布式MinIO服务器。注意一下,numberOfNodes取值范围是[4,16]。


4、客户端


MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。

Copyls       列出文件和文件夹。
mb       创建一个存储桶或一个文件夹。
cat      显示文件和对象内容。
pipe     将一个STDIN重定向到一个对象或者文件或者STDOUT。
share    生成用于共享的URL。
cp       拷贝文件和对象。
mirror   给存储桶和文件夹做镜像。
find     基于参数查找文件。
diff     对两个文件夹或者存储桶比较差异。
rm       删除文件和对象。
events   管理对象通知。
watch    监听文件和对象的事件。
policy   管理访问策略。
session  为cp命令管理保存的会话。
config   管理mc配置文件。
update   检查软件更新。
version  输出版本信息。

MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务。

Copyservice     服务重启并停止所有MinIO服务器
update      更新更新所有MinIO服务器
info        信息显示MinIO服务器信息
user        用户管理用户
group       小组管理小组
policy      MinIO服务器中定义的策略管理策略
config      配置管理MinIO服务器配置
heal        修复MinIO服务器上的磁盘,存储桶和对象
profile     概要文件生成概要文件数据以进行调试
top         顶部提供MinIO的顶部统计信息
trace       跟踪显示MinIO服务器的http跟踪
console     控制台显示MinIO服务器的控制台日志
prometheus  Prometheus管理Prometheus配置
kms         kms执行KMS管理操作


5、Java Api


MinIO Java Client SDK提供简单的API来访问任何与Amazon S3兼容的对象存储服务。

需要Java 1.8或更高版本:

  • OracleJDK 8.0
  • OpenJDK8.0

使用maven

Copy<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.0.2</version>
</dependency>

使用gradle

Copydependencies {
    compile 'io.minio:minio:7.0.2'
}

快速入门示例-文件上传

本示例程序连接到一个对象存储服务,创建一个存储桶并上传一个文件到该桶中。

你需要有存储服务的三个参数才能连接到该服务。

参数 说明
Endpoint 对象存储服务的URL
Access Key Access key就像用户ID,可以唯一标识你的账户。
Secret Key Secret key是你账户的密码。

FileUploader.java

Copyimport java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import org.xmlpull.v1.XmlPullParserException;
import io.minio.MinioClient;
import io.minio.errors.MinioException;
public class FileUploader {
  public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
    try {
      // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
      MinioClient minioClient = new MinioClient("https://play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
      // 检查存储桶是否已经存在
      boolean isExist = minioClient.bucketExists("asiatrip");
      if(isExist) {
        System.out.println("Bucket already exists.");
      } else {
        // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
        minioClient.makeBucket("asiatrip");
      }
      // 使用putObject上传一个文件到存储桶中。
      minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");
      System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");
    } catch(MinioException e) {
      System.out.println("Error occurred: " + e);
    }
  }
}

编译FileUploader

Copyjavac -cp "minio-3.0.9-all.jar"  FileUploader.java

运行FileUploader

Copyjava -cp "minio-3.0.9-all.jar:." FileUploader
/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.
mc ls play/asiatrip/
[2016-06-02 18:10:29 PDT]  82KiB asiaphotos.zip


6、大数据与Minio


作为一个先进的对象存储方案,Minio对于大数据及人工智能的支持有着天然的优势。

Minio支持与Spark,Flink等技术方案进行整合,并且通过S3 Select实现数据查询的下沉,这让大数据的存储与查询分离提供了事实依据。这也就为数据湖的构建打下了坚实的基础。

image.png

MinIo支持S3协议,可以使用hadoop的aws包从minIO中读取数据。

启动spark 需要两个jar包,aws-java-sdk  hadoop-aws
spark-shell --executor-memory 2g --driver-memory 2g \
--jars aws-java-sdk-bundle-1.11.271.jar \
,hadoop-aws-3.0.0-cdh6.3.2.jar
val df=Seq((1,"student1"),(2,"student2"),(3,"student3")).toDF("id","name")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "*****")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", ""*****")")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint","127.0.0.1:9000")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true");
spark.sparkContext.hadoopConfiguration.set("fs.s3a.connection.ssl.enabled", "false");
spark.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
df.rdd.saveAsTextFile( "s3a://test/df")

S3 Select

S3 Select 是 Amazon S3 的一项功能,专用于仅从对象中提取所需数据。借助 Amazon S3 Select,您可以使用简单的结构化查询语言 (SQL) 语句来过滤 Amazon S3 对象的内容并仅检索您需要的数据子集。

image.png

Minio S3 SELECT 同样可以响应流式数据到 Flink 进一步分析处理。

image.png

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
相关文章
|
9天前
|
人工智能 JavaScript 前端开发
Github 2024-10-28 开源项目周报 Top15
本周GitHub热门项目涵盖Svelte、Open Interpreter、PowerShell等,涉及Web开发、AI助手、自动化工具等领域,Python、JavaScript为主流语言,展现开源技术活跃生态。(239字)
169 19
|
9天前
|
人工智能 JavaScript 前端开发
Github 2024-11-04 开源项目周报 Top14
本周GitHub热门项目涵盖屏幕截图转代码、网页监控、低代码开发等。Python与TypeScript主导,亮点项目包括AI生成代码工具、开源社交应用Bluesky及机器人框架LeRobot,展现AI与自动化技术的快速发展趋势。
73 15
|
9天前
|
人工智能 JavaScript Docker
Github 2024-11-11 开源项目周报 Top15
本周GitHub热门项目涵盖多领域:Python与TypeScript领跑,包括屏幕截图转代码、本地文件共享、PDF处理、AI开发代理等。亮点项目如screenshot-to-code、LocalSend、OpenHands及Diagrams,兼具创新与实用性,广受开发者关注。
88 13
|
9天前
|
人工智能 算法 JavaScript
Github 2024-10-14 开源项目周报 Top14
本周GitHub热门项目共14个,Python项目占7席。涵盖算法实现、生成式AI、金融分析、目标检测等领域,包括TheAlgorithms系列、OpenBB金融平台、Ultralytics YOLO11、Manim动画框架等,展现开源技术多元发展态势。
46 8
|
9天前
|
人工智能 Rust JavaScript
Github 2024-10-07 开源项目周报 Top15
本周GitHub热门项目共15个,Python项目占比最高达7个。榜首为Python算法实现集合TheAlgorithms/Python,Star数超17万;其他亮点包括Godot游戏引擎、OpenBB金融平台、ToolJet低代码框架及新兴AI相关项目如Crawl4AI、Llama Stack等,涵盖游戏、金融、AI、理财等多个领域。
47 4
|
1月前
|
存储 运维 安全
阿里云国际站OSS与自建存储的区别
阿里云国际站对象存储OSS提供海量、安全、低成本的云存储解决方案。相比自建存储,OSS具备易用性强、稳定性高、安全性好、成本更低等优势,支持无限扩展、自动冗余、多层防护及丰富增值服务,助力企业高效管理数据。
|
1月前
|
存储 域名解析 前端开发
震惊!不买服务器,还可以用阿里云国际站 OSS 轻松搭建静态网站
在数字化时代,利用阿里云国际站OSS可低成本搭建静态网站。本文详解OSS优势及步骤:创建Bucket、上传文件、配置首页与404页面、绑定域名等,助你快速上线个人或小型业务网站,操作简单,成本低廉,适合初学者与中小企业。
|
1月前
|
存储 安全 API
某网盘不好用?有没有类似某网盘的存储软件?阿里云国际站 OSS:云存储的全能助手,你 get 了吗?
在数据爆炸时代,阿里云国际站OSS提供海量、安全、低成本的云存储服务,支持多种数据类型存储与灵活访问,助力企业与个人高效管理数据,降低存储成本。开通简便,操作友好,是理想的云端数据解决方案。
|
7月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
167 0
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。