高可用对象存储实战使用Python操作Minio存储桶

Posted BinEnder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高可用对象存储实战使用Python操作Minio存储桶相关的知识,希望对你有一定的参考价值。

目录

什么是Minio

Minio是一个基于Golang实现的高可用、高弹性的开源对象存储系统(OSS),皆在提供云上的高可扩展与高性能的分布式文件存储系统。
Minio十分的易部署,主需要极短的命令行即可实现运行与运维双重工作流。

下载Minio

我们前往min.io进行下载,之所以不使用中文镜像源进行下载的一个原因是,笔者在开始配置Minio时遇到了镜像404不可用的现象,当然读者您也可以重新尝试前往中文镜像站进行下载,这里以min.io镜像站进行操作。

wget https://dl.min.io/server/minio/release/linux-amd64/minio

下载好后,我们就得到了minio的二进制执行文件。

[root@localhost minio_server_side]# ls -al
total 108340
drwxr-xr-x.  4 root root        88 Jan 12 20:20 .
dr-xr-x---. 14 root root      4096 Jan 15 23:59 ..
drwxr-xr-x.  4 root root        39 Jan 15 17:40 data
drwxr-xr-x.  2 root root        24 Jan 12 19:28 logs
-rwxr-xr-x.  1 root root 110919680 Jan 12 15:05 minio
-rwxr-xr-x.  1 root root        48 Jan 12 19:38 runServer.sh
-rw-------.  1 root root     12288 Jan 12 20:20 .runserver.sh.swp
[root@localhost minio_server_side]# 

为这个二进制文件进行加权:

sudo chmod +x ./minio

什么是《桶》?

在Minio中的概念中一共有两个重要概念,即桶和对象。
对象可以很好理解,无非就是传统意义上的文件对象,一个单独的file object。
可什么又是桶呢?你可以将文件对象抽象为水,那么水由桶撑着就很好理解。而Minio中的桶也是借鉴了这个概念,实际上这个桶也的确是一个标准的Linux文件夹。
我们通过cdls指令来检查桶,这里我们有一个名为:replays的桶。我们分别使用ls -alcd指令来试试看:

ls -al:

[root@localhost data]# ls -al
total 0
drwxr-xr-x. 4 root root 39 Jan 15 17:40 .
drwxr-xr-x. 4 root root 88 Jan 12 20:20 ..
drwxr-xr-x. 7 root root 98 Jan 15 17:40 .minio.sys
drwxr-xr-x. 3 root root 24 Jan 14 09:24 replays

cd

[root@localhost data]# cd replays/
[root@localhost replays]# ls
output.avi
[root@localhost replays]# 

至此,Minio中最重要的两个概念已经解释清楚了。

启动和配置Minio

我们使用nohup来为Minio创建守护进程

nohup minio server ./data > ./logs/server.log &
  • sever:指定minio server的管道操作,如果在不指定具体操作,如:start(启动)stop(停止)restart(重启)
  • ./data:指定Minio的主数据路径,所有的桶以及对象将存储在这里

启动后,访问您主机的IP:9000后,你将会在浏览器看到如下的界面:

至此,Minio的配置与启动就完成了。

Python API交互实现文件上传并获取可分享链接

PyPI包安装

Minio官方提供了可用的PyPI包,通过如下指令进行安装

pip install minio

终端构造

安装好后,我们将开始创建Minio客户端对象:

# 从minio库中导入Minio客户端类
from minio import Minio
# 实例化
client = Minio(
	# endpoint指定的是你Minio的远程IP及端口
	endpoint = "192.168.40.11:9000",
	# accesskey指定的是你的Minio服务器访问key
	# 默认值为minioadmin
	access_key= "minioadmin",
	# secret_key指定的是你登录时需要用的key,类似密码
	# 默认值也是minioadmin
	secret_key= "minioadmin",
	# secure指定是否以安全模式创建Minio连接
	# 建议为False
	secure= False

桶的检查

当我们创建好客户端后,我们需要开始与存储桶进行连接,通过client.bucket_exists()函数直接进行存储桶的查询,该还是接受一个参数:bucket_name,为了防止因存储桶不存在而无法上传的情况,我们使用if来进行检查:

if client.bucket_exists("replays"):

我们一定要通过桶连接来检查终端与Minio服务器的连接,因为当你创建Minio Client对象时,不会与远程服务器发生sock连接,而只有当检查桶或执行I/O操作时才会发生sock连接。

检查了连接性后,我们可以打开我们的目标文件了:

# 使用with open打开目标文件
with open("output.avi","rb") as file_data:
   # 使用os.path.getsize()获取目标文件的大小
   bytes_length = os.path.getsize("output.avi")

确认文件的可读性和大小后,我们可以使用client.put_object()函数将目标文件存储到远程存储桶内:

client.put_object("replays", "output.avi", file_data, bytes_length)

其中该函数的四个参数分别为:

  • bucket_name:目标远程存储桶名,指定文件将被存储在哪个桶下。
  • object_name:指定目标文件将在远程桶下以什么名字被存储。
  • data:指定文件的I/O缓冲数据,这也是为什么我们用with open先读取文件了
  • length:Minio需要在上传时指定文件的大小,它并不会自动计算文件的大小,因此需要我们在终端获取到文件的大小并作为参数传递给API。

获取可分享URL

使用client.presigned_get_object()函数获取一个文件对象的可分享URL。

url = client.presigned_get_object("replays", "output.avi")
print(url)

执行后的结果是:

PS E:\\My Code\\attention-concentration-test\\production\\student\\cache> python .\\test.py
http://192.168.40.11:9000/replays/output.avi?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20230115%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230115T163642Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=a1bc19c5568dd5e6963362a2a74fc0876cbe68333253f2023df266308b0ea650

复制这段URL到IDM下载器来检验可用性:

可以看到,IDM已经成功识别了该URL,并且这个.avi录像是可读的:

请不要在意我的脸,颜值无用,技术乃大!!

同时我们刷新Minio的Web中控台,可以发现文件也的确被存到桶里了

结语

作为被阿里,腾讯,百度,Amazon使用的对象存储OSS框架,MinIO确实做到了小而轻,快而稳。且高弹性的部署,让云对象存储充满了无限的可能。高可用,多语言的API让运维人员与开发者可以更轻松的使用和维护公共/私有的存储资源。
自后附上各种语言的API文档,下期博客再见。

MinIO 分布式集群搭建

MinIO 分布式集群搭建

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

Minio 分布式模式可以搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

(1)数据保护

分布式 Minio 采用纠删码(erasure code)来防范多个节点宕机和位衰减(bit rot)。

分布式 Minio 至少需要 4 个节点,使用分布式 Minio 就自动引入了纠删码功能。

纠删码是一种恢复丢失和损坏数据的数学算法, Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。

纠删码的工作原理和 RAID 或者复制不同,像 RAID6 可以在损失两块盘的情况下不丢数据,而 Minio 纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且 Minio 纠删码是作用在对象级别,可以一次恢复一个对象,而RAID 是作用在卷级别,数据恢复时间很长。 Minio 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio 纠删码的设计目标是为了性能和尽可能的使用硬件加速。

位衰减又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption ,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接故障还危险。 所以 Minio 纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。

(2)高可用

单机 Minio 服务存在单点故障,相反,如果是一个 N 节点的分布式 Minio ,只要有 N/2 节点在线,你的数据就是安全的。不过你需要至少有 N/2+1 个节点来创建新的对象。

例如,一个 8 节点的 Minio 集群,每个节点一块盘,就算 4 个节点宕机,这个集群仍然是可读的,不过你需要 5 个节点才能写数据。

(3)限制

分布式 Minio 单租户存在最少 4 个盘最多 16 个盘的限制(受限于纠删码)。这种限制确保了 Minio 的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。

注意,只要遵守分布式 Minio 的限制,你可以组合不同的节点和每个节点几块盘。比如,你可以使用 2 个节点,每个节点 4 块盘,也可以使用 4 个节点,每个节点两块盘,诸如此类。

(4)一致性
Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型。

搭建分布式集群

启动一个分布式 Minio 实例,你只需要把硬盘位置做为参数传给 minio server 命令即可,然后,你需要在所有其它节点运行同样的命令。

注意

  • 分布式 Minio 里所有的节点需要有同样的 access 秘钥和 secret 秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行 minio server 命令之前,先将 access 秘钥和 secret 秘钥 export 成环境变量。
  • 分布式 Minio 使用的磁盘里必须是干净的,里面没有数据。
  • 下面示例里的 IP 仅供示例参考,你需要改成你真实用到的 IP 和文件夹路径。
  • 分布式 Minio 里的节点时间差不能超过 3 秒,你可以使用 NTP 来保证时间一致。
  • 在 Windows 下运行分布式 Minio 处于实验阶段,不建议用于生产环境。

示例1:

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

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

示例2:

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

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<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

验证

验证是否部署成功,使用浏览器访问 Minio 服务或者使用 mc。多个节点的存储容量和就是分布式Minio的存储容量。


以上是关于高可用对象存储实战使用Python操作Minio存储桶的主要内容,如果未能解决你的问题,请参考以下文章

云原生之Docker实战使用Docker部署MinIO对象存储

分布式存储Minio集群环境搭建

分布式存储Minio集群环境搭建

MinIO 的分布式部署

MinIO 分布式集群搭建

MinIO 分布式集群搭建