首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 [MinIO] 搭建 S3 兼容的云存储服务

使用 [MinIO] 搭建 S3 兼容的云存储服务

原创
作者头像
一粒花椒
修改2025-03-26 11:08:12
修改2025-03-26 11:08:12
87300
代码可运行
举报
文章被收录于专栏:MinioMinio
运行总次数:0
代码可运行

🚀 MinIO 简介

MinIO 是一个高性能的、S3 协议兼容的对象存储服务器,适合自建文件云存储,支持多用户、多桶、分布式部署。

🛠️ 一、部署 MinIO 单节点(适合入门测试)

1. 安装 MinIO(以 Linux 为例)

代码语言:javascript
代码运行次数:0
运行
复制
# 下载 MinIO 二进制文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

2. 创建存储目录

代码语言:javascript
代码运行次数:0
运行
复制
mkdir -p /data/minio

3. 启动 MinIO 服务

代码语言:javascript
代码运行次数:0
运行
复制
export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=minioadmin
minio server /data/minio --console-address ":9001"
  • Web 管理界面:http://your_ip:9001
  • S3 API 地址:http://your_ip:9000

🛡️ 二、后台运行(使用 systemd)

创建服务文件:

代码语言:javascript
代码运行次数:0
运行
复制
sudo nano /etc/systemd/system/minio.service

内容如下:

代码语言:javascript
代码运行次数:0
运行
复制
[Unit]
Description=MinIO
After=network.target

[Service]
ExecStart=/usr/local/bin/minio server /data/minio --console-address ":9001"
Environment="MINIO_ROOT_USER=minioadmin"
Environment="MINIO_ROOT_PASSWORD=minioadmin"
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

启动服务:

代码语言:javascript
代码运行次数:0
运行
复制
sudo systemctl daemon-reexec
sudo systemctl enable minio
sudo systemctl start minio

🌐 三、配置防火墙/开放端口

确保服务器开放以下端口:

  • 9000(S3 API 使用)
  • 9001(Web 管理界面)

例如:

代码语言:javascript
代码运行次数:0
运行
复制
sudo ufw allow 9000
sudo ufw allow 9001

⚙️ 四、在 Django 中接入 MinIO(使用 django-storages)

安装依赖:

代码语言:javascript
代码运行次数:0
运行
复制
pip install django-storages[boto3]

修改 Django settings.py

代码语言:javascript
代码运行次数:0
运行
复制
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_S3_ENDPOINT_URL = 'http://your_minio_ip:9000'
AWS_ACCESS_KEY_ID = 'minioadmin'
AWS_SECRET_ACCESS_KEY = 'minioadmin'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'us-east-1'  # 可自定义
AWS_S3_ADDRESSING_STYLE = "path"
写入文件(上传文件)

这是你提供的示例代码,上传文件到 MinIO。

代码语言:javascript
代码运行次数:0
运行
复制
from django.core.files.storage import default_storage

def save_upload_image(fp, path):
    with default_storage.open(path, 'wb') as f:
        f.write(fp.read())
  • fp 是文件对象(例如,通过表单上传的文件),path 是存储路径。
  • default_storage.open(path, 'wb') 将文件内容写入 MinIO 中指定的路径。
删除文件

你可以使用 default_storage.delete() 来删除存储在 MinIO 中的文件。

代码语言:javascript
代码运行次数:0
运行
复制
def delete_image(path):
    if default_storage.exists(path):
        default_storage.delete(path)
  • default_storage.exists(path) 用来检查文件是否存在。
  • default_storage.delete(path) 删除指定路径的文件。
修改文件

对于修改文件,通常是先删除旧文件,然后上传新文件。你可以结合上面的删除和写入操作来实现。

代码语言:javascript
代码运行次数:0
运行
复制
def update_image(fp, path):
    if default_storage.exists(path):
        default_storage.delete(path)
    
    with default_storage.open(path, 'wb') as f:
        f.write(fp.read())
  • 先使用 default_storage.exists(path) 检查文件是否存在。
  • 使用 default_storage.delete(path) 删除旧文件。
  • 使用 default_storage.open(path, 'wb') 写入新的文件。
下载文件

你可以使用 default_storage.open() 来读取存储在 MinIO 中的文件。

代码语言:javascript
代码运行次数:0
运行
复制
def download_image(path):
    if default_storage.exists(path):
        with default_storage.open(path, 'rb') as f:
            return f.read()
    return None
  • default_storage.open(path, 'rb') 以二进制模式读取文件。
  • 如果文件存在,则返回文件的内容;如果不存在,则返回 None

创建桶(bucket)

可以在 MinIO 控制台创建桶(如 media),或使用 mc 命令行工具。


📦 五、进阶部署方案(可选)

✅ 多节点高可用部署

MinIO 支持分布式部署,例如在 4 台服务器上进行数据副本冗余,提高可靠性。

✅ 搭配反向代理(如 Nginx)+ HTTPS(SSL)

使用 Nginx 作为前端代理,结合 Let's Encrypt 为 MinIO 提供 HTTPS 访问。


✅ 总结:MinIO 的优势

优点

说明

开源免费

不依赖商业云,适合私有化部署

S3 兼容

完美对接 Django、Flask 等框架

支持分布式

可水平扩展

高性能

适用于大文件、高并发上传


❌注意事项

直接修改 MinIO 存储的物理文件是非常不推荐的,以下是一些潜在的影响:

1. 数据一致性问题

MinIO 是一个对象存储系统,底层并不像传统的文件系统那样直接管理每个文件的元数据。它使用内部的对象存储方式来管理文件。直接修改物理文件可能导致:

  • 元数据不一致:MinIO 会依赖内部的数据库记录文件的元数据(如文件大小、修改时间等),直接修改物理文件可能导致元数据与文件内容不同步,产生一致性问题。
  • 对象损坏:对象存储系统通常会有校验和等验证机制,直接修改物理文件可能会破坏这些验证机制,导致对象损坏。

2. 无法正确获取文件

  • MinIO 使用对象存储方式管理文件路径和名称。直接修改文件可能导致 MinIO 无法正确识别文件,导致 文件无法通过 API 访问,甚至无法在控制台查看。
  • 如果文件被修改或移动,MinIO 无法更新路径信息或文件指针,导致数据丢失或无法访问。

3. 可能引发文件权限问题

  • MinIO 是基于存储权限进行访问控制的。直接修改文件时,你可能会不小心改变文件权限,导致:
    • 无法访问该文件
    • 权限管理混乱
  • 这可能会影响整个系统的稳定性,尤其是涉及多用户和多权限管理时。

4. 性能问题

  • MinIO 是分布式系统,直接修改物理文件可能导致 节点同步失败对象冗余问题,从而影响集群性能和数据一致性。
  • 在分布式存储系统中,文件通常是分割成多个小块存储的,直接修改单个块可能破坏数据的完整性,导致 数据丢失或不一致

5. 不便于恢复和备份

  • 修改物理文件后,如果发生系统崩溃或出现错误,可能很难通过常规的备份和恢复机制恢复被修改的文件。
  • 直接修改文件可能会导致备份机制无法正确识别文件的变化,甚至可能丢失部分数据。

最佳实践:

  • 通过 API 或管理工具来操作文件:修改、删除或移动文件时,应该通过 MinIO 提供的 API 或 Web 控制台来进行,而不是直接操作文件系统。
  • 使用版本控制:如果需要修改文件,可以使用 MinIO 的对象版本控制功能来保留文件的历史版本,避免修改带来的问题。

总之,直接修改 MinIO 物理文件不仅会影响系统稳定性,还可能引起不可预见的错误,强烈建议通过标准接口进行所有文件管理操作。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀 MinIO 简介
  • 🛠️ 一、部署 MinIO 单节点(适合入门测试)
    • 1. 安装 MinIO(以 Linux 为例)
    • 2. 创建存储目录
    • 3. 启动 MinIO 服务
  • 🛡️ 二、后台运行(使用 systemd)
  • 🌐 三、配置防火墙/开放端口
  • ⚙️ 四、在 Django 中接入 MinIO(使用 django-storages)
    • 安装依赖:
    • 修改 Django settings.py:
      • 写入文件(上传文件)
      • 删除文件
      • 修改文件
      • 下载文件
    • 创建桶(bucket)
  • 📦 五、进阶部署方案(可选)
    • ✅ 多节点高可用部署
    • ✅ 搭配反向代理(如 Nginx)+ HTTPS(SSL)
  • ✅ 总结:MinIO 的优势
  • ❌注意事项
    • 1. 数据一致性问题
    • 2. 无法正确获取文件
    • 3. 可能引发文件权限问题
    • 4. 性能问题
    • 5. 不便于恢复和备份
    • 最佳实践:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档