vieyahn2017 / storage_persist

storage_persist
0 stars 0 forks source link

MinIO - 分布式对象存储服务 #13

Open vieyahn2017 opened 7 months ago

vieyahn2017 commented 7 months ago

Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。Minio兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java,Python,Javacript, Golang语言。

Minio可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。

在2007年,GlusterFS演变为大型分布式存储方案后,任何配备合适硬件的公司,单位都可以利用个做分布式的流媒体,数据分析。在2011年,Red Hat收购了GlusterFS.

vieyahn2017 commented 7 months ago

https://github.com/minio/minio

vieyahn2017 commented 7 months ago

安装MINIO(项目有离线部署要求,全部依赖都需要本地部署,采用MINIO代替HIS-S3服务)

  1. 查看Linux架构:uname -m

  2. 准备minio tar包:https://dl.min.io/server/minio/release/linux-amd64/minio-20240118225128.0.0-1.x86_64.rpm

  3. 安装minio:yum install minio-20240118225128.0.0-1.x86_64.rpm

  4. 检查安装是否成功:minio -v

  5. 创建挂载点:mkdir -p <挂载点>

  6. 启动minio:MINIO_ROOT_USER=<账号> MINIO_ROOT_PASSWORD=<密码> minio server <挂载点> --console-address ":9001"

  7. 查看minio启动状态:netstat -nlp | grep minio

至此minio已经完成启动(实际运行时可以使用nohup后台挂起)。minio可以和普通s3一样使用(验证python3.8 boto3可以正常上传下载);另外minio配套有MINIO CLIENT,也可以在官网下载,用于命令行上传下载 endpoint=127.0.0.1:9000 ak=<账号> sk=<密码>

vieyahn2017 commented 7 months ago

https://www.cnblogs.com/lyhero11/p/15313823.html MinIO的简单使用实践

vieyahn2017 commented 7 months ago

MinIO技术架构 参考: http://www.cloudbin.cn/?p=2917

vieyahn2017 commented 7 months ago

MinIO特性:版本控制

存储桶版本控制 简述 MinIO 支持将对象的多个“版本”保存在单个存储桶中。写操作默认情况下,会覆盖现有的对象而非新创建版本化的对象。 MinIO 版本控制可防止意外覆盖和删除,同时支持“撤消”写入操作等。存储桶版本控制是配置对象锁定和保留规则的先决条件。

对于版本化存储桶,任何改变对象的写入操作都会导致该对象的新版本具有唯一的版本 ID。MinIO 客户端默认检索的对象的“最新”版本。然后,客户端可以明确选择列出、检索或删除特定对象版本。

详述 要控制保留数据和存储利用率,请将对象版本控制与对象生命周期管理结合使用。如果您在非版本化存储桶中有对象过期生命周期策略,并且希望在启用版本化的存储桶上保持相同的永久删除行为,则必须添加非当前的过期策略。非当前到期生命周期策略将管理启用版本控制的存储桶中非当前对象版本的删除。(启用版本的存储桶维护一个当前对象版本和零个或多个非当前对象版本。)

必须在存储桶上显式启用版本控制,默认情况下不启用版本控制。启用对象锁定的存储桶会自动启用版本控制。启用和暂停版本控制是在存储桶级别完成的。

只有 MinIO 会生成版本 ID,并且它们不能被编辑。版本 ID 很简单DCE 1.1 v4 UUID 4(基于随机数据),UUID 是 128 位数字,旨在在空间和时间上具有很高的唯一性,并且在计算上难以猜测。它们是全球唯一的标识符,无需联系全球注册机构即可在本地生成。UUID 旨在作为生命周期极短的大规模标记对象的唯一标识符,以及可靠地识别网络中非常持久的对象。

当您将对象放入启用版本控制的存储桶中时,不会覆盖非当前版本。下图是当一个新版本的spark.csv被PUT到一个已经包含同名对象的桶中时,原来的对象(ID = ede336f2)留在桶中,MinIO生成一个新版本(ID fae684da=存储桶的较新版本。

image.png

这可以防止意外覆盖或删除对象,允许检索以前的版本。 当您删除一个对象时,所有版本都保留在存储桶中,并且 MinIO 会添加一个删除标记,如下所示:

image.png

现在删除标记成为对象的当前版本。默认情况下,GET 请求总是检索最新存储的版本。因此,当当前版本是删除标记时执行简单的 GET 对象请求将返回404 The specified key does not exist如下所示:

image.png

GET 请求通过指定版本 ID 如下所示,您可以检索特定对象版本fae684da。

image.png

要永久删除对象,您需要指定要删除的版本,只有具有适当权限的用户才能永久删除版本。如下所示,使用特定版本 ID 调用的 DELETE 请求会从存储桶中永久删除对象。不为具有版本 ID 的 DELETE 请求添加删除标记。

image.png

概念 MinIO 上的所有存储桶始终处于以下状态之一:未版本化(默认)和所有其他现有部署、版本控制启用或版本控制暂停。 版本控制状态适用于启用版本控制的存储桶中的所有对象。首次启用存储桶进行版本控制时,存储桶中的对象此后始终会进行版本控制并赋予唯一的版本 ID。 可以在启用版本控制的情况下创建现有或更新的存储桶,最终也可以暂停。对象的现有版本保持原样,并且仍然可以使用版本 ID 访问。 在删除存储桶之前,应删除所有版本,包括删除标记。 版本控制功能仅在纠删码和分布式纠删码设置中可用。

参考 https://docs.min.io/docs/minio-bucket-versioning-guide.html

vieyahn2017 commented 7 months ago

MinIO特性:对象锁定

MinIO 对象保留(retention) 默认情况下,对唯一对象名称的每个新写入操作都会导致覆盖该对象。您可以将 MinIO 配置为创建 每个对象突变的版本,保留该对象的完整历史记录。MinIO 还支持 一次写入多次读取 (WORM) 锁定版本化对象,以确保在指定持续时间或直到显式解除锁定之前完全不变。 版本控制和对象锁定功能仅适用于 分布式 MinIO 部署。

版本控制 MinIO 支持将对象的多个“版本”保存在单个存储桶中。默认情况现有对象的写入操作会覆盖现有的对象而不是创建新的版本化对象。MinIO 版本控制可防止意外覆盖和删除,同时提供对“撤消”写入操作的支持。存储桶版本控制是配置对象锁定和保留规则的先决条件 。 对于版本化存储桶,任何改变对象的写入操作都会导致该对象的新版本具有唯一的版本 ID。MinIO 标记客户端默认检索的对象的“最新”版本。然后,客户端可以明确选择列出、检索或删除特定对象版本。

版本控制和容量 MinIO 不执行增量或差异类型的版本控制。对于突变繁重的工作负载,这可能会导致较旧或老化的对象版本大量使用磁盘。

版本ID生成 作为写入操作的一部分,MinIO 为每个版本化对象生成一个唯一且不可变的标识符。每个对象版本 ID 由一个 128 位固定大小的UUIDv4。UUID 的生成具有足够的随机性,以确保任何环境的唯一性的可能性很高,计算上难以猜测,并且不需要集中的注册过程和权限来保证唯一性。 MinIO 不支持客户端管理的版本 ID 分配。所有版本 ID 的生成都由 MinIO 服务器进程处理。 对于在禁用或挂起版本控制时创建的对象,MinIO 使用null版本 ID。null您可以通过将版本 ID 指定为 S3 操作的一部分来访问或删除这些对象 。

对象锁定 MinIO 对象锁定(“对象保留”)强制执行一次写入多次读取 (WORM) 不变性以保护版本化对象不被删除。MinIO 支持 基于持续时间的对象保留 和 无限期的合法保留保留。 MinIO 对象锁定提供关键数据保留合规性,并符合 Cohasset Associates的 SEC17a-4(f)、FINRA 4511© 和 CFTC 1.31©-(d) 要求 对象锁定需要版本控制并隐式启用该功能。

与版本控制的交互 在锁定到期或显式解除之前,在 WORM 锁定下持有的对象是不可变的。锁定是针对每个对象的版本,其中每个版本都是独立不可变的。 如果应用程序对锁定的对象执行非版本化删除操作,则该操作会生成一个删除标记。尝试显式删除任何 WORM 锁定的对象会失败并出现错误。删除标记不符合 WORM 锁定的保护条件。有关更多信息,请参阅有关 管理删除标记和对象生命周期的 S3 文档。

参考: https://docs.min.io/minio/baremetal/object-retention/minio-object-retention.html

vieyahn2017 commented 7 months ago

MinIO代码结构

MinIO存储系统主要分为这几部分:1)客户端软件mc,以及多种语言的客户端SDK;2)服务端MinIO Server; 服务端分为上下两层,上层负责minio的系统管理与对外接口,下层实现具体的逻辑。 1)cmd模块 这是minio的上层,也就是源代码中的cmd子目录,这一部分主要负责minio的命令行参数解析、初始化系统、格式化磁盘、管理内嵌的web服务器、S3 API的解析与逻辑处理。 2)各个软件包 这个是minio底层逻辑实现,也就是源代码目录中的pkg子目录。其中一些软件包(比如madmin), 可被其它组织(或个人)在编写辅助minio的软件的时候所重复使用。 madmin:使用这个软件包可以自己使用Golang语言撰写MinIO集群的管理程序,比如获取服务的状态(磁盘、cpu等信息)、重启某个机器服务、启动修复某个桶的任务、重新配置系统、获取剖析信息等等。

S3 select:如果对象存储系统中有很多超大型的对象,比如大小是几个GB甚至几个TB的对象。如果应用程序(比如spark分析程序),要把符合条件的若干个对象都读过去,然后再做分析,会及其的慢,浪费很多带宽(毕竟对象中可能只有很少的一部分是对某个分析程序有用的)。因此Amazon引入了S3 Select 的功能。通俗地说,就是把select 类型的sql语句在某个对象上执行,从对象中取出一部分内容返回给应用。MinIO提供了S3 Select 功能。相对于S3 Select, MinIO要求对象的内容必须是CSV、 JSON,或者 Parquet格式。S3Select API实现中使用的语法分析器是 Alec Thomas写的如下项目:

https://github.com/alecthomas/participle

这个实现的分析算法是带有栈的ll(k)分析算法。

vieyahn2017 commented 7 months ago

https://zhuanlan.zhihu.com/p/559845533 12 图入门高性能分布式对象存储 MinIO

vieyahn2017 commented 7 months ago

MINIO分布式部署参数研究

MINIO的EC特性是在一个Server Pool中进行 而Server Pool取决于部署时,minio拉起进程时指定的参数,如图所示

参考: https://docs.min.io/minio/baremetal/introduction/minio-overview.html#minio-intro-server-pool