JDWA 技术文档
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
  • 数据库

    • 数据库教程
    • MySQL免安装版使用指南
    • MySQL性能优化实践
    • Redis入门与实践
    • MinIO快速部署指南
    • MinIO基础使用教程
  • 前端开发

    • 前端开发教程
    • Vue.js开发最佳实践
    • CSS常用技巧与解决方案
    • JavaScript实用技巧与编程模式
    • CSS Grid布局教程
  • 后端开发

    • 后端开发教程
    • Spring Boot实战指南
    • Node.js Express 框架开发实战指南
    • Python Flask 框架开发指南
  • 开发工具

    • 开发工具教程
    • Git 基础教程
    • Git工作流实践指南
    • VS Code 全面使用指南
    • VS Code必装插件推荐
    • Docker基础入门
    • IntelliJ IDEA 使用技巧
    • Eclipse配置与优化
    • Sublime Text 高级技巧
    • Vim 从入门到精通
    • Maven 详解
    • Gradle 入门与进阶
    • Webpack 配置指南
    • npm 与 yarn 使用技巧
    • Makefile 编写指南
    • Navicat 使用指南
    • MCP本地部署教程
  • 虚拟化技术

    • JDWA虚拟化技术专题
    • KVM虚拟机去虚拟化技术详解
  • KVM显卡直通

    • KVM显卡GPU直通教程
  • FPGA仿真固件

    • FPGA仿真固件开发指南
    • 基础-完整设备仿真定制固件开发指南
    • 中级-完整设备仿真定制固件开发指南
    • 高级-完整设备仿真定制固件开发指南

MinIO基础使用教程

Tips

本教程基于MinIO最新版本,介绍MinIO的基本使用方法,包括控制台操作和常用编程语言的SDK使用示例。

1. MinIO控制台操作指南

成功部署MinIO服务后,我们可以通过Web控制台进行基本操作。

1.1 登录控制台

  1. 打开浏览器,访问http://服务器IP:9001
  2. 输入配置的用户名和密码(默认为admin/12345678)
  3. 登录成功后,您将看到MinIO控制台主界面

1.2 存储桶管理

存储桶(Bucket)是MinIO中存储对象的容器,类似于文件系统中的文件夹。

创建存储桶

  1. 在左侧导航栏点击"Buckets"
  2. 点击"Create Bucket"按钮
  3. 输入存储桶名称(如"my-files")
    • 存储桶名称必须唯一
    • 只能包含小写字母、数字和连字符(-)
    • 长度在3-63个字符之间
  4. 点击"Create Bucket"按钮完成创建

设置存储桶访问策略

  1. 在存储桶列表中找到目标存储桶
  2. 点击存储桶名称右侧的"..."按钮
  3. 选择"Manage"
  4. 在"Access Policy"选项卡中:
    • "Private": 仅允许授权用户访问
    • "Public": 允许匿名访问所有对象
    • "Custom": 自定义访问策略

启用版本控制

  1. 在存储桶管理页面,切换到"Summary"选项卡
  2. 找到"Versioning"选项
  3. 点击开关启用版本控制
  4. 确认启用

1.3 文件操作

MinIO中的文件被称为对象(Object),每个对象有唯一的键(Key)。

上传文件

  1. 进入目标存储桶
  2. 点击"Upload"按钮
  3. 选择"Upload file"或"Upload folder"
  4. 选择要上传的文件或文件夹
  5. 点击"Upload"按钮开始上传

创建文件夹

  1. 进入目标存储桶
  2. 点击"Create new path"按钮
  3. 输入文件夹名称
  4. 点击"Create"按钮

下载文件

  1. 找到要下载的文件
  2. 点击文件名右侧的"..."按钮
  3. 选择"Download"选项

删除文件

  1. 选择要删除的文件(可多选)
  2. 点击"Delete"按钮
  3. 在确认对话框中输入"permanently delete"
  4. 点击"Delete"按钮确认删除

1.4 用户和访问控制

创建用户

  1. 在左侧导航栏点击"Identity"
  2. 选择"Users"
  3. 点击"Create User"按钮
  4. 填写用户信息:
    • Access Key: 用户ID(如"user1")
    • Secret Key: 用户密码(至少8个字符)
  5. 点击"Save"按钮

创建组

  1. 在"Identity"页面选择"Groups"
  2. 点击"Create Group"按钮
  3. 输入组名称(如"developers")
  4. 点击"Save"按钮

分配用户到组

  1. 进入目标组详情页
  2. 点击"Add Users"按钮
  3. 选择要添加的用户
  4. 点击"Add"按钮

创建访问策略

  1. 在"Identity"页面选择"Policies"
  2. 点击"Create Policy"按钮
  3. 填写策略信息:
    • Policy Name: 策略名称(如"read-only")
    • Policy: JSON格式的策略定义
  4. 点击"Save"按钮

访问策略示例(只读权限):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket/*",
        "arn:aws:s3:::my-bucket"
      ]
    }
  ]
}

2. SDK使用示例

除了通过Web控制台,我们也可以通过各种编程语言的SDK与MinIO交互。

2.1 JavaScript (Node.js)

首先安装MinIO客户端:

npm install minio

基本使用示例:

const Minio = require('minio');

// 初始化MinIO客户端
const minioClient = new Minio.Client({
  endPoint: '10.102.3.42',  // 服务器IP
  port: 9000,               // API端口
  useSSL: false,            // 是否使用HTTPS
  accessKey: 'admin',       // 访问密钥
  secretKey: '12345678'     // 秘密密钥
});

// 列出所有存储桶
async function listBuckets() {
  try {
    const buckets = await minioClient.listBuckets();
    console.log('Buckets:');
    buckets.forEach(bucket => console.log(bucket.name));
  } catch (err) {
    console.error('Error listing buckets:', err);
  }
}

// 上传文件
async function uploadFile(bucketName, objectName, filePath) {
  try {
    await minioClient.fPutObject(bucketName, objectName, filePath);
    console.log(`File ${filePath} uploaded successfully as ${objectName} to ${bucketName}`);
  } catch (err) {
    console.error('Error uploading file:', err);
  }
}

// 下载文件
async function downloadFile(bucketName, objectName, filePath) {
  try {
    await minioClient.fGetObject(bucketName, objectName, filePath);
    console.log(`File ${objectName} downloaded successfully to ${filePath}`);
  } catch (err) {
    console.error('Error downloading file:', err);
  }
}

// 删除文件
async function deleteFile(bucketName, objectName) {
  try {
    await minioClient.removeObject(bucketName, objectName);
    console.log(`File ${objectName} deleted successfully from ${bucketName}`);
  } catch (err) {
    console.error('Error deleting file:', err);
  }
}

// 示例使用
(async () => {
  await listBuckets();
  // 上传示例
  // await uploadFile('my-bucket', 'test-file.txt', './local-file.txt');
})();

2.2 Java

首先添加Maven依赖:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.4.3</version>
</dependency>

基本使用示例:

import io.minio.*;
import io.minio.messages.Bucket;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

public class MinioExample {

    public static void main(String[] args) {
        try {
            // 初始化MinIO客户端
            MinioClient minioClient = MinioClient.builder()
                    .endpoint("http://10.102.3.42:9000")
                    .credentials("admin", "12345678")
                    .build();

            // 列出所有存储桶
            listBuckets(minioClient);
            
            // 上传文件示例
            // uploadFile(minioClient, "my-bucket", "test-file.txt", "C:\\path\\to\\local-file.txt");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 列出所有存储桶
    private static void listBuckets(MinioClient minioClient) throws Exception {
        List<Bucket> bucketList = minioClient.listBuckets();
        System.out.println("Buckets:");
        for (Bucket bucket : bucketList) {
            System.out.println(bucket.name());
        }
    }

    // 上传文件
    private static void uploadFile(MinioClient minioClient, String bucketName, 
                                  String objectName, String filePath) throws Exception {
        // 检查存储桶是否存在
        boolean found = minioClient.bucketExists(BucketExistsArgs.builder()
                .bucket(bucketName).build());
        if (!found) {
            // 创建存储桶
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName).build());
            System.out.println("Bucket " + bucketName + " created");
        }

        // 上传文件
        minioClient.uploadObject(
                UploadObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .filename(filePath)
                        .build());
        System.out.println("File " + filePath + " uploaded successfully as " 
                          + objectName + " to " + bucketName);
    }

    // 下载文件
    private static void downloadFile(MinioClient minioClient, String bucketName, 
                                    String objectName, String filePath) throws Exception {
        minioClient.downloadObject(
                DownloadObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .filename(filePath)
                        .build());
        System.out.println("File " + objectName + " downloaded successfully to " + filePath);
    }

    // 删除文件
    private static void deleteFile(MinioClient minioClient, String bucketName, 
                                  String objectName) throws Exception {
        minioClient.removeObject(
                RemoveObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .build());
        System.out.println("File " + objectName + " deleted successfully from " + bucketName);
    }
}

2.3 Python

首先安装MinIO客户端:

pip install minio

基本使用示例:

from minio import Minio
from minio.error import S3Error

# 初始化MinIO客户端
client = Minio(
    "10.102.3.42:9000",
    access_key="admin",
    secret_key="12345678",
    secure=False  # 是否使用HTTPS
)

# 列出所有存储桶
def list_buckets():
    try:
        buckets = client.list_buckets()
        print("Buckets:")
        for bucket in buckets:
            print(f" - {bucket.name}")
    except S3Error as e:
        print(f"Error listing buckets: {e}")

# 上传文件
def upload_file(bucket_name, object_name, file_path):
    try:
        # 检查存储桶是否存在
        if not client.bucket_exists(bucket_name):
            # 创建存储桶
            client.make_bucket(bucket_name)
            print(f"Bucket {bucket_name} created")
        
        # 上传文件
        client.fput_object(bucket_name, object_name, file_path)
        print(f"File {file_path} uploaded successfully as {object_name} to {bucket_name}")
    except S3Error as e:
        print(f"Error uploading file: {e}")

# 下载文件
def download_file(bucket_name, object_name, file_path):
    try:
        client.fget_object(bucket_name, object_name, file_path)
        print(f"File {object_name} downloaded successfully to {file_path}")
    except S3Error as e:
        print(f"Error downloading file: {e}")

# 删除文件
def delete_file(bucket_name, object_name):
    try:
        client.remove_object(bucket_name, object_name)
        print(f"File {object_name} deleted successfully from {bucket_name}")
    except S3Error as e:
        print(f"Error deleting file: {e}")

# 示例使用
if __name__ == "__main__":
    list_buckets()
    # 上传示例
    # upload_file("my-bucket", "test-file.txt", "./local-file.txt")

3. 高级使用技巧

3.1 预签名URL

预签名URL允许临时访问私有对象,无需提供额外认证。

Node.js示例:

// 生成有效期为1小时的下载链接
async function getPresignedUrl(bucketName, objectName) {
  try {
    const url = await minioClient.presignedGetObject(bucketName, objectName, 3600); // 3600秒(1小时)
    console.log('Presigned URL:', url);
    return url;
  } catch (err) {
    console.error('Error generating presigned URL:', err);
  }
}

// 生成有效期为10分钟的上传链接
async function getPresignedPutUrl(bucketName, objectName) {
  try {
    const url = await minioClient.presignedPutObject(bucketName, objectName, 600); // 600秒(10分钟)
    console.log('Presigned Put URL:', url);
    return url;
  } catch (err) {
    console.error('Error generating presigned put URL:', err);
  }
}

3.2 对象加密

MinIO支持服务端加密(SSE)和客户端加密:

服务端加密配置(启动时):

Windows环境:

set MINIO_KMS_KES_ENDPOINT=https://kes-server:7373
set MINIO_KMS_KES_KEY_FILE=path/to/key.key
set MINIO_KMS_KES_CERT_FILE=path/to/cert.cert
set MINIO_KMS_KES_CA_PATH=path/to/ca.cert

Linux环境:

export MINIO_KMS_KES_ENDPOINT=https://kes-server:7373
export MINIO_KMS_KES_KEY_FILE=path/to/key.key
export MINIO_KMS_KES_CERT_FILE=path/to/cert.cert
export MINIO_KMS_KES_CA_PATH=path/to/ca.cert

3.3 对象生命周期管理

通过生命周期规则自动管理对象:

控制台配置:

  1. 进入存储桶管理页面
  2. 选择"Management"选项卡
  3. 点击"Lifecycle"
  4. 点击"Create lifecycle rule"按钮
  5. 配置规则:
    • 规则名称
    • 过滤前缀(可选)
    • 过期时间(如30天后)
    • 转换到低成本存储(可选)

通过API配置示例(Node.js):

const lifecycleConfig = {
  Rules: [
    {
      ID: "expire-rule",
      Status: "Enabled",
      Prefix: "logs/",
      Expiration: {
        Days: 30
      }
    }
  ]
};

async function setLifecyclePolicy(bucketName) {
  try {
    await minioClient.setBucketLifecycle(bucketName, lifecycleConfig);
    console.log(`Lifecycle policy set for bucket ${bucketName}`);
  } catch (err) {
    console.error('Error setting lifecycle policy:', err);
  }
}

3.4 事件通知

MinIO可以发送对象变化的事件通知到各种目标(如Kafka、NATS、MySQL等):

配置示例(控制台):

  1. 进入存储桶管理页面
  2. 选择"Events"选项卡
  3. 点击"Add Event Notification"
  4. 配置事件:
    • 事件类型(如PUT, DELETE等)
    • 前缀/后缀过滤器(可选)
    • 通知目标(如Kafka, NATS, MySQL等)

通过API配置(Node.js):

const arn = "arn:minio:sqs::primary:kafka";
const events = ['s3:ObjectCreated:*', 's3:ObjectRemoved:*'];
const pattern = 'images/*';

async function configureEventNotification(bucketName) {
  try {
    await minioClient.setBucketNotification(bucketName, {
      QueueConfigurations: [
        {
          Queue: arn,
          Events: events,
          Filter: {
            Key: {
              FilterRules: [
                {
                  Name: 'prefix',
                  Value: pattern
                }
              ]
            }
          }
        }
      ]
    });
    console.log(`Event notification configured for bucket ${bucketName}`);
  } catch (err) {
    console.error('Error configuring event notification:', err);
  }
}

4. 性能优化建议

4.1 客户端优化

  • 并行上传:使用分片上传和并行处理加速大文件上传
  • 连接池:保持连接重用,避免频繁建立新连接
  • 合理设置超时:根据网络情况调整连接和读写超时
  • 压缩:对文本文件考虑使用gzip压缩后再上传

4.2 网络优化

  • 本地部署:尽可能将MinIO部署在应用服务器同一内网
  • 带宽监控:监控网络带宽使用,避免瓶颈
  • 负载均衡:使用负载均衡器分配请求

4.3 应用实践

  • 批量操作:尽可能使用批量操作API减少请求次数
  • CDN集成:对频繁访问的静态内容考虑结合CDN使用
  • 缓存策略:实现客户端缓存策略,减少重复请求

总结

本教程介绍了MinIO的基本使用方法,包括Web控制台操作和各种编程语言的SDK使用示例。MinIO作为高性能的对象存储服务,提供了丰富的功能和灵活的访问方式,可以满足各种应用场景的需求。

通过合理配置和优化,MinIO可以成为您应用架构中可靠的存储基础设施,无论是用于图片、视频存储,还是作为数据备份和归档的解决方案。

相关资源

  • MinIO官方文档
  • MinIO快速部署指南
  • MinIO与Spring Boot集成

如有问题或建议,欢迎联系作者: 1412800823@qq.com

粤ICP备2025415495号
Prev
MinIO快速部署指南