这里以容器方式实现
MinIO 是一个高性能的对象存储系统,兼容 Amazon S3 API,适合用于云原生应用
部署Minio
准备
Server
两台服务器:
master
(192.168.1.101)、worker
(192.168.1.102)每台服务器暴露Minio的相关端口:2000&2001、3000&3001
每台服务器上安装了 Docker
两台服务器之间的网络连接正常
Folder
# 在每台服务器上创建用于存储 MinIO 数据的目录
mkdir -p /data/minio
安装
端口映射:
9000
是 MinIO 的默认 API 端口,9001
是控制台端口。数据目录:
/data/minio
是本地数据目录,映射到容器内的/data
。访问密钥和秘密密钥:
MINIO_ACCESS_KEY
和MINIO_SECRET_KEY
是访问 MinIO 的凭证,确保使用强密码。分布式模式:通过在启动命令中指定多个
http://<ip>/data
,MinIO 将以分布式模式运行。
Master
docker run -dit \
-h Minio-Master \
--name Minio-Master \
-p 2000:9000 \
-p 2001:9001 \
-v /data/minio:/data \
-e "MINIO_ACCESS_KEY=your_access_key" \
-e "MINIO_SECRET_KEY=your_secret_key" \
minio/minio \
server http://192.168.1.101:2000/data http://192.168.1.102:3000/data
Worker
docker run -dit \
-h Minio-Worker \
--name Minio-Worker \
-p 3000:9000 \
-p 3001:9001 \
-v /data/minio:/data \
-e "MINIO_ACCESS_KEY=your_access_key" \
-e "MINIO_SECRET_KEY=your_secret_key" \
minio/minio \
server http://192.168.1.101:2000/data http://192.168.1.102:3000/data
访问
Web 控制台:可以通过
http://192.168.1.101:2001
或http://192.168.1.102:3001
访问 MinIO 的 Web 控制台。API 访问:使用 MinIO 客户端或兼容 S3 的工具访问 MinIO 服务
注意
安全性:在生产环境中,确保使用 HTTPS 和强密码来保护 MinIO 服务。
持久化存储:确保
/data/minio
目录位于持久化存储上,以防止数据丢失。网络配置:确保两台服务器之间的网络连接稳定,允许必要的端口通信。
WebUI
查看节点
生成密钥
创建存储桶
Python使用
上传下载
实例化Minio参数
MinIO服务器地址
访问密钥
私有密钥
是否使用HTTPS
from minio import Minio
from minio.error import S3Error
# 实例化Minio连接对象
client = Minio("192.168.1.101:9001", access_key="access_key", secret_key="secret_key", secure=False)
def upload(bucket_name, file_path, object_name):
"""
上传一个本地文件到服务器
:param bucket_name: 存储桶名称
:param file_path: 本地文件路径
:param object_name: 上传到服务器的名称
:return:
"""
try:
# 确保存储桶存在
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
# 上传文件
client.fput_object(bucket_name, object_name, file_path)
print(f"文件 {object_name} 上传成功!")
except S3Error as err:
print(f"上传失败:{err}")
def download(bucket_name, object_name, file_path):
"""
下载一个文件到本地
:param bucket_name: 存储桶名称
:param object_name: 要下载的文件名称
:param file_path: 本地要保存的路径
:return:
"""
try:
client.fget_object(bucket_name, object_name, file_path)
print(f"文件 {object_name} 下载成功!")
except S3Error as err:
print(f"下载失败:{err}")
if __name__ == "__main__":
upload("master-test", "dfs_more.py", "test-1.txt")
download("master-test", "test-1.txt", "dfs_more_test.py")
获取信息
from minio import Minio
from minio.commonconfig import Tags
client = Minio("192.168.1.101:9001", access_key="access_key", secret_key="secret_key", secure=False)
# 列出存储桶中的所有对象
objects = client.list_objects("bucket-name", recursive=True)
for obj in objects:
print(obj.object_name)
# 为对象添加标签
tags = Tags.new_object_tags()
tags["project"] = "TestProject"
tags["user"] = "PySuper"
client.set_object_tags("bucket-name", "test-object.txt", tags)
# 获取对象的元数据
stat = client.stat_object("bucket-name", "test-object.txt")
print(f"大小:{stat.size} 字节")
print(f"最后修改时间:{stat.last_modified}")
Django集成
在Django中使用Minio可以通过django-storages
库来实现
Minio是一个兼容Amazon S3的对象存储服务,因此可以使用S3的存储后端来与Minio进行交互
安装依赖
# 确保安装了 boto3、django-storages
pip install boto3 django-storages
配置Minio
# settings.py
INSTALLED_APPS = [
# ... 其他应用 ...
'storages',
]
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = '你的Minio访问密钥'
AWS_SECRET_ACCESS_KEY = '你的Minio秘密密钥'
AWS_STORAGE_BUCKET_NAME = '你的Minio桶名称'
AWS_S3_ENDPOINT_URL = 'http://你的Minio服务器地址:端口'
AWS_S3_REGION_NAME = 'us-east-1' # 不需要特定的区域,但需要设置一个默认值
AWS_S3_SIGNATURE_VERSION = 's3v4'
上传下载
Minio存储文件配置完成后,你可以像使用Django默认的文件存储一样使用Minio。例如,上传文件到Minio:
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
def upload_file_to_minio(file_name, file_data):
"""
使用 django-storages 上传文件到 MinIO
:param file_name: 文件名称
:param file_data: 文件数据
:return: 文件在 MinIO 中的路径
"""
try:
path = default_storage.save(file_name, ContentFile(file_data))
print(f"文件 {file_name} 上传到 MinIO 成功,路径为: {path}")
return path
except Exception as e:
print(f"文件上传失败: {e}")
return None
def download_file_from_minio(file_name):
"""
使用 django-storages 从 MinIO 下载文件
:param file_name: 文件名称
:return: 文件数据
"""
try:
with default_storage.open(file_name, 'rb') as file:
file_data = file.read()
print(f"文件 {file_name} 从 MinIO 下载成功")
return file_data
except Exception as e:
print(f"文件下载失败: {e}")
return None
动态设置桶
配置MinIO客户端
在你的Django项目中,通常会在 settings.py
中配置MinIO的连接信息:
# settings.py
MINIO_ENDPOINT = 'your-minio-endpoint'
MINIO_ACCESS_KEY = 'your-access-key'
MINIO_SECRET_KEY = 'your-secret-key'
在视图中使用不同的桶
在你的视图中,你可以根据需要动态设置桶名称:
from django.conf import settings
from django.http import JsonResponse
from minio import Minio
# 初始化MinIO客户端
minio_client = Minio(
settings.MINIO_ENDPOINT,
access_key=settings.MINIO_ACCESS_KEY,
secret_key=settings.MINIO_SECRET_KEY,
secure=False, # 如果使用HTTPS,请设置为True
)
def view_one(request):
bucket_name = "bucket-one"
# 在这里使用bucket_one进行操作
objects = minio_client.list_objects(bucket_name)
return JsonResponse({"objects": [obj.object_name for obj in objects]})
def view_two(request):
bucket_name = "bucket-two"
# 在这里使用bucket_two进行操作
objects = minio_client.list_objects(bucket_name)
return JsonResponse({"objects": [obj.object_name for obj in objects]})
说明
Minio客户端初始化:在视图中初始化MinIO客户端时,使用Django的
settings
来获取连接信息。动态设置桶名称:在每个视图中,根据需要设置不同的
bucket_name
,然后使用minio_client
对该桶进行操作。操作示例:在示例中,使用
list_objects
方法列出桶中的对象。你可以根据需要替换为其他操作,如上传、下载或删除对象
评论区