一、MinIO基本知识

一、简介

  • 英文官网:https://min.io/
  • 中文官网:https://www.minio.org.cn
  • MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
  • MinIO 是一款开源的对象存储服务器,它是使用 Go 语言开发的,可以在多个操作系统上运行,包括 Linux、Windows 和 macOS。
  • MinIO是一个对象存储:对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据
    • 元数据主要包括对象的描述信息(如用户、存储桶以及存储桶索引等)
  • 对象存储系统通常通过基于HTTP或HTTPS协议的API进行数据读写。

1.许可

  • MniIO具有双重许可
    • 开源GNU APGPL v3:完全免费
    • 商业企业许可证:收费
  • 兼容亚马逊S3云存储服务接口

二、部署

1.Docker部署

1.1 部署容器

# 1.拉取最新镜像
docker pull minio/minio
# 2.创建minio挂载目录
mkdir -p /data/minio/data
mkdir -p /data/minio/config
# 3.启动容器
docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=minioadmin" \
     -e "MINIO_SECRET_KEY=minioadmin" \
     -v /data/minio/data:/data \
     -v /data/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"
  • 参数解释
    • -p 9000:9000 -p 9090:9090:将本地机器上的端口 9000 和 9090绑定到容器上相同的端口。 这允许通过本地机器访问容器。
      • 9090是客户端端口
    • -v /data/minio/data:/data:将本地机器上的存储卷 /data/minio/data 绑定到容器上的 /data 路径。 将此值替换为本地机器上一个存储卷或文件夹的完整路径。
    • -v /data/minio/config:/root/.minio:将上一步创建的环变变量配置文件挂载到容器上
      • MinIO服务器使用此环境变量配置文件进行配置。
    • -e “MINIO_CONFIG_ENV_FILE=/etc/config.env”:设置一个MinIO环境变量,指向容器挂载的环变变量配置文件的路径。
    • minio server --console-address “:9001”:使用之前步骤中拉取的 minio:minio 镜像启动MinIO服务器。 minio server --console-address “:9001” 选项指示服务器为MinIO控制台Web界面设置一个静态端口
    • -e “MINIO_ACCESS_KEY=minioadmin”:账号
    • -e “MINIO_SECRET_KEY=minioadmin”:密码(账号长度必须大于等于5,密码长度必须大于等于8位)

1.2 MinIO页面访问

  • http://部署服务器ip:9090
    在这里插入图片描述
  • 使用账号密码:minioadmin/minioadmin登录

1.3 创建Bucket在这里插入图片描述

三、Python-API

1.安装包

pip install minio

2.Bucket、Object概念

  • Bucket是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
  • Object是存储到Minlo的基本对象,对用户而言,相当于文件;

3.Bucket-API

from minio.error import S3Error
from minio import Minio


client = Minio(endpoint="192.168.86.128:9000",
               access_key="minioadmin",
               secret_key="minioadmin",
               secure=False
               )
# 1.判断Bucket是否存在
bucket_exists = client.bucket_exists("myfolder")
print(bucket_exists)

# 2.创建新的Bucket
try:
    client.make_bucket("myfolder1")
except S3Error:
    print("该名称目录已被创建")

# 3.获取所有Bucket名称和创建时间
print([(bucket.name, bucket.creation_date) for bucket in client.list_buckets()])

# 4.删除已存在的Bucket
try:
    client.remove_bucket("xxxxx")
except S3Error:
    print("该Bucket不存在")

4.MinIOClient-API

import os

from minio import Minio, S3Error
from minio.commonconfig import CopySource
from minio.deleteobjects import DeleteObject

client = Minio(endpoint="192.168.86.128:9000",
               access_key="minioadmin",
               secret_key="minioadmin",
               secure=False
               )
bucket_name = "myfolder"
# 1.判断Bucket是否存在
if not client.bucket_exists(bucket_name):
    client.make_bucket(bucket_name)

# 2.通过文件句柄上传文件到bucket
"""
单个对象的最大大小限制在5TB。put_object在对象大于5MiB时,自动使用multiple parts方式上传。
这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。
上传的对象使用MD5SUM签名进行完整性验证。
"""
with open('./test.txt', 'rb') as file:
    file_stat = os.stat('./test.txt')
    print(client.put_object(bucket_name, 'test.txt', file, file_stat.st_size))

# 3.通过文件名称上传文件到bucket(推荐)
print(client.fput_object(bucket_name, '12.docx', './12.docx'))
# 上传有文件路径的文件
print(client.fput_object(bucket_name, 'folder_name/12.docx', './12.docx'))

# 4.获取object元对象
try:
    object = client.stat_object(bucket_name, "12.docx")
    print(f"文件名称:{object.object_name}")
    print(f"文件大小:{object.size}")
except S3Error:
    print("文件不存在")

# 5.下载对象(文件)
data = client.get_object(bucket_name, '12.docx')
with open('./download/12.docx', 'wb') as file:
    for d in data.stream(32 * 1024):
        file.write(d)

# 6.下载对象(文件)(推荐)
client.fget_object(bucket_name, '12.docx', './download/123.docx')

# 7.拷贝object(从一个bucket的对象拷贝到另一个bucket)(从myfolder复制文件到myfolder1)
# 拷贝对象存储服务上的源对象到一个新对象
# 注:该API支持的最大文件大小是5GB
# 可通过copy_conditions参数设置copy条件
# 经测试copy复制28M的文件需要663ms; 1.8G的压缩包需要53s
copy_result = client.copy_object("myfolder1", "12333.docx",
                                 CopySource(bucket_name, "12.docx")
                                 )

# 8.删除单个object
client.remove_object(bucket_name, "12.docx")

# 9.删除多个object
client.remove_objects(bucket_name, [DeleteObject("12.docx"),
                                    DeleteObject("123.docx"),
                                    DeleteObject("124.docx")])

5.Presigned-API

from datetime import timedelta
from minio import Minio

client = Minio(endpoint="192.168.86.128:9000",
               access_key="minioadmin",
               secret_key="minioadmin",
               secure=False
               )

bucket_name = "myfolder"
# 1.判断Bucket是否存在
if not client.bucket_exists(bucket_name):
    client.make_bucket(bucket_name, )

print(client.fput_object(bucket_name, 'asdasd/12.docx', './12.docx'))

# 2.生成一个用于HTTP GET操作的签名 URL(不管文件存不存在,都会生成URL)
# 预先获得的对象名称的获取对象URL,将在2天后过期
url = client.presigned_get_object(bucket_name, 'test.txt', expires=timedelta(days=2))
print(url)

# 3.生成一个用于HTTP PUT操作的签名 URL(不管文件存不存在,都会生成URL)
# # 预先获得的对象名称的获取对象URL,将在2天后过期
url = client.presigned_put_object(bucket_name, 'test.txt', expires=timedelta(days=2))
print(url)

四、其他配置

1.将某个Bucket所有文件开放访问

  • 如果是private,那么需要使用 预签名URL才可以进行访问
    在这里插入图片描述
  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值