MinIO基本知识
一、简介
二、部署 1.Docker部署
1.2 MinIO页面访问 1.3 创建Bucket![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6c8aa92975f146b691f1f36ce1033e7c.png)
三、Python-API 1.安装包 2.Bucket、Object概念 3.Bucket-API 4.MinIOClient-API 5.Presigned-API
四、其他配置
一、简介
英文官网: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 部署容器
docker pull minio/minio
mkdir -p /data/minio/data
mkdir -p /data/minio/config
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绑定到容器上相同的端口。 这允许通过本地机器访问容器。
-v /data/minio/data:/data :将本地机器上的存储卷 /data/minio/data 绑定到容器上的 /data 路径。 将此值替换为本地机器上一个存储卷或文件夹的完整路径。-v /data/minio/config:/root/.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
)
bucket_exists = client. bucket_exists( "myfolder" )
print ( bucket_exists)
try :
client. make_bucket( "myfolder1" )
except S3Error:
print ( "该名称目录已被创建" )
print ( [ ( bucket. name, bucket. creation_date) for bucket in client. list_buckets( ) ] )
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"
if not client. bucket_exists( bucket_name) :
client. make_bucket( bucket_name)
"""
单个对象的最大大小限制在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) )
print ( client. fput_object( bucket_name, '12.docx' , './12.docx' ) )
print ( client. fput_object( bucket_name, 'folder_name/12.docx' , './12.docx' ) )
try :
object = client. stat_object( bucket_name, "12.docx" )
print ( f"文件名称: { object . object_name} " )
print ( f"文件大小: { object . size} " )
except S3Error:
print ( "文件不存在" )
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)
client. fget_object( bucket_name, '12.docx' , './download/123.docx' )
copy_result = client. copy_object( "myfolder1" , "12333.docx" ,
CopySource( bucket_name, "12.docx" )
)
client. remove_object( bucket_name, "12.docx" )
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"
if not client.bucket_exists( bucket_name) :
client.make_bucket( bucket_name, )
print( client.fput_object( bucket_name, 'asdasd/12.docx' , './12.docx' ))
url = client.presigned_get_object( bucket_name, 'test.txt' , expires = timedelta( days= 2 ))
print( url)
url = client.presigned_put_object( bucket_name, 'test.txt' , expires = timedelta( days= 2 ))
print( url)
四、其他配置
1.将某个Bucket所有文件开放访问
如果是private,那么需要使用 预签名URL才可以进行访问