但是如何存储这些数据呢?商用云方案往往价格昂贵,而传统的大数据解决方案并不能充分支撑图片,视频数据的存储与分析。本文将详细的介绍开源的对象存储解决方案Minio的部署与实践,文章将分为以下几部分进行介绍。
1、对象存储
从本质上讲,对象存储是一种数据存储架构,允许以高度可扩展的方式存储大量非结构化数据。
如今,我们需要在关系或非关系数据库中存储的可不仅仅是简单的文本信息。数据类型包括电子邮件、图像、视频、网页、音频文件、数据集、传感器数据和其他类型的媒体内容。也就是非结构化的数据。
区别于传统的存储,对象存储非常适合图片视频等数据的存储。这里就不得不提到另外两种存储方式。
文件存储 vs 块存储 vs 对象存储
文件存储是网络附加存储,其中数据存储在文件夹中。当需要访问文件时,计算机必须知道找到它的完整路径。
块存储将数据保存在原始块中,与文件存储不同,它可以通过存储区域网络访问,低延迟高性能,一般用于数据库相关操作。
很明显,文件存储便于共享,但是性能很差。块存储性能好,但是无法灵活的共享。那么,有没有一种方案可以兼顾呢?
对象存储
对象存储是一种全新体系结构,其中每个文件都保存为一个对象,并且可以通过 HTTP 请求访问它。这种类型的存储最适合需要管理大量非结构化数据的场景。在对象存储中,每个对象都会收到一个唯一的 id,消费者将使用它来检索它和丰富的元数据。
基于对象的存储系统不通过分层结构存储数据是其最显着的特征。缺乏基于文件夹的存储不仅使检索文件更容易,而且还为每条数据分配元数据。
对象存储,是一种扁平结构,其中文件被分解成碎片并分散在硬件中。在对象存储中,数据被分成称为对象的离散单元并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块保存。
对象存储 VS HDFS
有人会问,大数据不能解决对象存储的问题吗?HDFS确实很强大,也解决分布式存储的瓶颈问题,但是还有很多不足之处。
元数据的扩展性:NameNode是一个中央元数据服务节点,也是集群管理节点,文件系统的元数据以及块位置关系全部在内存中。NameNode对内存的要求非常高,需要定制大内存的机器,内存大小也限制了集群扩展性。
全局锁:NameNode 有一把FSNamesystem全局锁,每个元数据请求时都会加这把锁。虽然是读写分开的,且有部分流程对该锁的持有范围进行了优化,但依然大问题。
块汇报风暴:HDFS块大小默认128M,启动几百PB数据量的集群时,NameNode需要接受所有块汇报才可以退出安全模式,因此启动时间会达数小时。
HDFS是为了大文件存储而设计的,天生对于图片视频这种海量的小文件支持有限。毫无疑问对象存储才是最佳选择。
对象存储方案
过去的相当长的一段时间里,商用对象存储占据了市场上的大量的份额。国外的Amazon S3,国内的阿里云OSS都成为了大多数公司的选择。
但是构建一个企业级的数据湖(包括结构化和非结构化数据)已经成为了越来越多公司的目标,私有化的对象存储方案迫在眉睫。
开源的私有化的对象存储方案选择很多,如分布式对象、块和文件存储平台Ceph,简单的、高度可扩展的分布式文件系统SeaweedFS,以及本文要介绍的高性能,云原生的对象存储MinIO。
2、Minio概述
MinIO是个高性能,云原生的对象存储。Github有近30K的Star。
https://github.com/minio/minio
它提供了与 Amazon S3 云存储服务兼容的 API,使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。
轻量,操作简单。
特点
- 构建高性能的云原生数据;
- 机器学习,大数据分析,海量存储的基础架构;
- MinIO支持各种应用程序数据工作负载;
- 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等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与领先的分析和机器学习框架进行了本地集成。
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 以确保您的服务器已成功启动。
分布式安装
在大数据领域,通常的设计理念都是无中心和分布式。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实现数据查询的下沉,这让大数据的存储与查询分离提供了事实依据。这也就为数据湖的构建打下了坚实的基础。
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 对象的内容并仅检索您需要的数据子集。
Minio S3 SELECT 同样可以响应流式数据到 Flink 进一步分析处理。