【高可用对象存储实战】利用Python操作Minio存储桶

种地  金牌会员 | 2024-6-15 03:06:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 852|帖子 852|积分 2556

什么是Minio

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

我们前往min.io进行下载,之所以不利用中文镜像源进行下载的一个缘故原由是,笔者在开始配置Minio时遇到了镜像404不可用的现象,固然读者您也可以重新实行前往中文镜像站进行下载,这里以min.io镜像站进行操作。
  1. wget https://dl.min.io/server/minio/release/linux-amd64/minio
复制代码
下载好后,我们就得到了minio的二进制执行文件。
  1. [root@localhost minio_server_side]# ls -al
  2. total 108340
  3. drwxr-xr-x.  4 root root        88 Jan 12 20:20 .
  4. dr-xr-x---. 14 root root      4096 Jan 15 23:59 ..
  5. drwxr-xr-x.  4 root root        39 Jan 15 17:40 data
  6. drwxr-xr-x.  2 root root        24 Jan 12 19:28 logs
  7. -rwxr-xr-x.  1 root root 110919680 Jan 12 15:05 minio
  8. -rwxr-xr-x.  1 root root        48 Jan 12 19:38 runServer.sh
  9. -rw-------.  1 root root     12288 Jan 12 20:20 .runserver.sh.swp
  10. [root@localhost minio_server_side]#
复制代码
为这个二进制文件进行加权:
  1. sudo chmod +x ./minio
复制代码
什么是《桶》?

在Minio中的概念中一共有两个紧张概念,即桶和对象。
对象可以很好明确,无非就是传统意义上的文件对象,一个单独的file object。
可什么又是桶呢?你可以将文件对象抽象为水,那么水由桶撑着就很好明确。而Minio中的桶也是鉴戒了这个概念,实际上这个桶也简直是一个标准的Linux文件夹。
我们通过cd和ls指令来检查桶,这里我们有一个名为:replays的桶。我们分别利用ls -al和cd指令来试试看:
ls -al:
  1. [root@localhost data]# ls -al
  2. total 0
  3. drwxr-xr-x. 4 root root 39 Jan 15 17:40 .
  4. drwxr-xr-x. 4 root root 88 Jan 12 20:20 ..
  5. drwxr-xr-x. 7 root root 98 Jan 15 17:40 .minio.sys
  6. drwxr-xr-x. 3 root root 24 Jan 14 09:24 replays
复制代码
cd:
  1. [root@localhost data]# cd replays/
  2. [root@localhost replays]# ls
  3. output.avi
  4. [root@localhost replays]#
复制代码
至此,Minio中最紧张的两个概念已经解释清晰了。
启动和配置Minio

我们利用nohup来为Minio创建守护历程
  1. nohup minio server ./data > ./logs/server.log &
复制代码


  • sever:指定minio server的管道操作,如果在不指定具体操作,如:start(启动)、stop(停止)、restart(重启)
  • ./data:指定Minio的主数据路径,所有的桶以及对象将存储在这里
启动后,访问您主机的IP:9000后,你将会在浏览器看到如下的界面:

至此,Minio的配置与启动就完成了。
Python API交互实现文件上传并获取可分享链接

PyPI包安装

Minio官方提供了可用的PyPI包,通过如下指令进行安装
  1. pip install minio
复制代码
终端构造

安装好后,我们将开始创建Minio客户端对象:
  1. # 从minio库中导入Minio客户端类
  2. from minio import Minio
  3. # 实例化
  4. client = Minio(
  5.         # endpoint指定的是你Minio的远程IP及端口
  6.         endpoint = "192.168.40.11:9000",
  7.         # accesskey指定的是你的Minio服务器访问key
  8.         # 默认值为minioadmin
  9.         access_key= "minioadmin",
  10.         # secret_key指定的是你登录时需要用的key,类似密码
  11.         # 默认值也是minioadmin
  12.         secret_key= "minioadmin",
  13.         # secure指定是否以安全模式创建Minio连接
  14.         # 建议为False
  15.         secure= False
复制代码
桶的检查

当我们创建好客户端后,我们需要开始与存储桶进行连接,通过client.bucket_exists()函数直接进行存储桶的查询,该照旧担当一个参数:bucket_name,为了防止因存储桶不存在而无法上传的情况,我们利用if来进行检查:
  1. if client.bucket_exists("replays"):
复制代码
我们一定要通过桶连接来检查终端与Minio服务器的连接,因为当你创建Minio Client对象时,不会与远程服务器发生sock连接,而只有当检查桶或执行I/O操作时才会发生sock连接。
检查了连接性后,我们可以打开我们的目标文件了:
  1. # 使用with open打开目标文件
  2. with open("output.avi","rb") as file_data:
  3.    # 使用os.path.getsize()获取目标文件的大小
  4.    bytes_length = os.path.getsize("output.avi")
复制代码
确认文件的可读性和巨细后,我们可以利用client.put_object()函数将目标文件存储到远程存储桶内:
  1. 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。
  1. url = client.presigned_get_object("replays", "output.avi")
  2. print(url)
复制代码
执行后的效果是:
  1. PS E:\My Code\attention-concentration-test\production\student\cache> python .\test.py
  2. 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文档,下期博客再见。


  • .NET API文档
  • Python API文档
  • Golang API文档
  • Java API文档
  • JS API文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表