" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 231 篇文章
  • 累计创建 15 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Minio 分布式对象存储服务

PySuper
2024-11-23 / 0 评论 / 2 点赞 / 22 阅读 / 0 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

这里以容器方式实现

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_KEYMINIO_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:2001http://192.168.1.102:3001 访问 MinIO 的 Web 控制台。

  • API 访问:使用 MinIO 客户端或兼容 S3 的工具访问 MinIO 服务

注意

  • 安全性:在生产环境中,确保使用 HTTPS 和强密码来保护 MinIO 服务。

  • 持久化存储:确保 /data/minio 目录位于持久化存储上,以防止数据丢失。

  • 网络配置:确保两台服务器之间的网络连接稳定,允许必要的端口通信。

WebUI

查看节点

5315D04E-82F2-4A21-8989-FCE5A90AC452.png

生成密钥

10A91AB2-B15F-4690-B646-6F9D15871D6B.png

45BBB44A-C3EE-4A98-863F-FC715783FFEF.png

创建存储桶

E5B9FB57-7C08-44B3-8E11-23A3E11E9E3D.png

60FD22ED-907D-4C07-AFEF-4585B77C478D.png

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 方法列出桶中的对象。你可以根据需要替换为其他操作,如上传、下载或删除对象

2

评论区