其他

MINIO的介绍和使用

转载:https://blog.csdn.net/qq_45765384/article/details/136342425

Minio介绍


目前可用于文件存储的网络服务选择也有不少,比如阿里云OSS、七牛云、腾讯云等等,可是收费都有点小贵。为了节约成本,很多公司使用MinIO做为文件服务器。

官网:https://www.minio.org.cn/

MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由选择底层存储介质。它基于Apache License 开源协议,兼容Amazon S3云存储接口。适合存储非结构化数据,如图片,音频,视频,日志等。


MinIO的主要特点包括:

  • 1、高性能:MinIO基于GO语言编写,具有高速、轻量级、高并发等性能特点,还支持多线程和缓存等机制进行优化,可以快速地处理大规模数据。
  • 2、安装部署简单:MinIO只需要执行这几行命令便可轻松搞定,也大大降低了学习和维护成本。
  • 3、操作简单,自带管理界面:MinIO在服务端安装后就自带了UI界面,可谓开箱即用。
  • 4、性能优秀,读写速度快:MinIO号称是世界上速度最快的对象存储服务器,读对象的速度能达到183 GB/s,写对象的速度能达到171 GB/s。
  • 5、支持云原生容器化部署:MinIO提供了与K8s、ETCD、Docker等容器化技术深度集成方案,可以说MinIO就是为云环境而生的。
  • 6、提供多语言SDK的支持:MinIO提供了绝大部分主流开发语言的SDK以及文档,比如Java、Python、Golang、JS、.NET等等。
  • 7、兼容亚马逊S3 API:亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界认可的对象存储标准。而MinIO是采用S3兼容协议的产品之一。

S3协议是Amazon Web Services (AWS) 提供的对象存储服务(Simple Storage Service)的API协议。它是一种 RESTful风格的Web服务接口,使用HTTP/HTTPS协议进行通信,支持多种编程语言和操作系统,并实现了数据的可靠存储、高扩展性以及良好的可用性。

Linux 安装(Docker)


具体命令:

//拉取镜像
docker pull minio/minio

// 创建数据存储目录
mkdir -p /mnt/minio/data

// 创建minio
docker run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name minio \
   -v /mnt/minio/data:/data \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   -d \
   minio/minio server /data --console-address ":9001"

上面的示例以以下方式工作:

  • mkdir 创建一个新的本地目录 /mnt/minio/data 映射给容器内部的 /data 使用。
  • docker run 启动运行容器。
  • -p 为容器绑定一个本地的端口.
  • -name 为容器创建一个本地的名字。
  • -v 将文件路径设置为容器使用的持久卷位置。 当MinIO将数据写入 /data 时,该数据会镜像到本地路径 /mnt/minio/data, 使其能够在容器重新启动时保持持久化。 您可以设置任何具有读取、写入和删除权限的文件路径来使用。
  • -e 分别为用户名和密码设置环境变量 MINIO_ROOT_USERMINIO_ROOT_PASSWORD. 这些说明了如下设置: 如何修改默认管理员的用户名和密码. 将示例值更改为您要用于容器的值。

容器启动以后,可以通过控制台访问 MinIO Console控制台。

云服务器地址:9001 端口
http://123.57.xxx.xxx:9001/

Java 操作 Minio


本章节会给大家介绍一下如何通过Java客户端操作Minio,可以参考官网地址。

官网地址:https://min.io/docs/minio/linux/developers/java/minio-java.html

具体步骤:

1、加入如下依赖

<!-- common-util模块中加入如下依赖 -->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.2</version>
</dependency>

2、示例代码

public class FileUploadTest {

    public static void main(String[] args) throws Exception {
        // 创建一个Minio的客户端对象
        MinioClient minioClient = MinioClient.builder()
                .endpoint("http://127.0.0.1:9000")
                .credentials("minioadmin", "minioadmin")
                .build();

        boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("spzx-bucket").build());

        // 如果不存在,那么此时就创建一个新的桶
        if (!found) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket("spzx-bucket").build());
        } else {  // 如果存在打印信息
            System.out.println("Bucket 'spzx-bucket' already exists.");
        }

        FileInputStream fis = new FileInputStream("D://01.jpg") ;
        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .bucket("spzx-bucket")
                .stream(fis, fis.available(), -1)
                .object("01.jpg")
                .build();
        minioClient.putObject(putObjectArgs) ;

        // 构建fileUrl
        String fileUrl = "http://127.0.0.1:9000/spzx-bucket/01.jpg" ;
        System.out.println(fileUrl);
    }
}

注意:设置minio的中该桶的访问权限为public,如下所示:

NodeJs 操作 Minio


  • 安装依赖
npm install minio
  • 完整示例代码
const Minio = require('minio');

// 初始化 MinIO 客户端(社区版与商业版使用相同的 SDK)
const minioClient = new Minio.Client({
  endPoint: 'localhost',      // MinIO 服务器地址
  port: 9000,                 // 端口
  useSSL: false,              // 是否使用 SSL(生产环境建议开启)
  accessKey: 'minioadmin',    // 默认 Access Key(测试环境)
  secretKey: 'minioadmin'     // 默认 Secret Key(测试环境)
});

// 桶名称和文件路径
const bucketName = 'my-bucket';
const objectName = 'example.txt';
const localFilePath = './local-file.txt';
const downloadPath = './downloaded.txt';

// 示例:完整的 MinIO 操作流程
async function runExample() {
  try {
    // 1. 创建存储桶(如果不存在)
    const bucketExists = await minioClient.bucketExists(bucketName);
    if (!bucketExists) {
      await minioClient.makeBucket(bucketName);
      console.log(`✅ 存储桶 "${bucketName}" 创建成功`);
    } else {
      console.log(`ℹ️ 存储桶 "${bucketName}" 已存在`);
    }

    // 2. 上传文件
    await minioClient.fPutObject(bucketName, objectName, localFilePath);
    console.log(`✅ 文件 "${localFilePath}" 已上传为 "${objectName}"`);

    // 3. 生成预签名 URL(用于临时访问,无需凭证)
    const presignedUrl = await minioClient.presignedGetObject(
      bucketName,
      objectName,
      60 * 60 // 有效期 1 小时
    );
    console.log(`🔗 预签名下载链接(1小时有效): ${presignedUrl}`);

    // 4. 下载文件
    await minioClient.fGetObject(bucketName, objectName, downloadPath);
    console.log(`✅ 文件 "${objectName}" 已下载到 "${downloadPath}"`);

    // 5. 获取文件元数据
    const stat = await minioClient.statObject(bucketName, objectName);
    console.log(`📊 文件元数据: ${JSON.stringify(stat, null, 2)}`);

    // 6. 列出存储桶中的所有文件
    const stream = minioClient.listObjectsV2(bucketName);
    stream.on('data', (obj) => console.log(`📄 桶内文件: ${obj.name}`));
    stream.on('error', console.error);

    // 7. 删除文件(可选,取消注释以执行)
    // await minioClient.removeObject(bucketName, objectName);
    // console.log(`❌ 文件 "${objectName}" 已删除`);

  } catch (error) {
    console.error('❌ 操作失败:', error);
  }
}

// 执行示例
runExample();
  • 存储桶操作
// 检查桶是否存在
await minioClient.bucketExists(bucketName);

// 创建桶(带区域参数)
await minioClient.makeBucket(bucketName, 'us-east-1');

// 列出所有桶
const buckets = await minioClient.listBuckets();
  • 文件操作
// 上传文件
await minioClient.fPutObject(bucketName, objectName, localFilePath);

// 下载文件
await minioClient.fGetObject(bucketName, objectName, downloadPath);

// 删除文件
await minioClient.removeObject(bucketName, objectName);

// 获取文件流(用于流式处理)
const stream = await minioClient.getObject(bucketName, objectName);
stream.pipe(process.stdout); // 输出到控制台
  • 预签名 URL
// 生成只读 URL(有效期 1 小时)
const readUrl = await minioClient.presignedGetObject(bucketName, objectName, 3600);

// 生成可写 URL(用于客户端直接上传)
const uploadUrl = await minioClient.presignedPutObject(bucketName, 'new-file.txt', 3600);
  • 错误处理

MinIO SDK 会抛出详细的错误信息,建议在生产环境中添加完善的错误处理:

try {
  await minioClient.makeBucket(bucketName);
} catch (err) {
  if (err.code === 'BucketAlreadyOwnedByYou') {
    console.log('桶已存在,无需创建');
  } else {
    throw err;
  }
}

MinIO Client(mc


MinIO Client(mc)是一个强大的命令行工具,用于管理和操作 MinIO 服务器,也兼容 Amazon S3 服务。以下是安装和使用 mc 的详细示例:

安装 MinIO Client(mc)

macOS/Linux: 使用 Homebrew(macOS):

# macOS(通过 Homebrew)
brew install minio/stable/mc

配置 MinIO 服务器连接

首次使用前,需要添加 MinIO 服务器信息(称为 alias):

mc alias set myminio https://play.min.io ACCESSKEY SECRETKEY
  • 参数说明
    • myminio:自定义的服务器别名(方便后续操作)。
    • https://play.min.io:MinIO 服务器 URL(使用公共测试服务器)。
    • ACCESSKEY 和 SECRETKEY:你的访问密钥和秘密密钥。
mc alias set play https://play.min.io Q3AM3UQ867SPQQA43P2F S3K3T867SPQQA43P2F78

基本操作示例

  • 创建存储桶(Bucket)
mc mb myminio/my-bucket
  • 上传文件
# 上传单个文件
mc cp /path/to/local/file.txt myminio/my-bucket/

# 递归上传目录
mc cp --recursive /path/to/local/dir/ myminio/my-bucket/
  • 下载文件
# 下载到当前目录
mc cp myminio/my-bucket/file.txt .

# 下载到指定目录
mc cp myminio/my-bucket/file.txt /path/to/download/dir/
  • 列出存储桶和对象
# 列出所有存储桶
mc ls myminio

# 列出存储桶中的对象
mc ls myminio/my-bucket

# 递归列出子目录
mc ls --recursive myminio/my-bucket
  • 删除文件或存储桶
# 删除文件
mc rm myminio/my-bucket/file.txt

# 删除空存储桶
mc rb myminio/my-bucket

# 强制删除非空存储桶(递归删除所有内容)
mc rb --force myminio/my-bucket

高级操作

  •  生成预签名 URL(用于临时访问)
# 生成 7 天有效的下载链接
mc share download --expire=7d myminio/my-bucket/file.txt
  • 设置存储桶策略(公开 / 私有)
# 设置存储桶为只读公开访问
mc policy set download myminio/my-bucket

# 设置为私有访问
mc policy set private myminio/my-bucket
  • 查看服务器状态
mc admin info myminio

使用示例:下载图片

假设要从 play 服务器的 my-bucket 下载 photos/pic1.jpg 到本地:

# 1. 添加服务器配置
mc alias set play https://play.min.io Q3AM3UQ867SPQQA43P2F S3K3T867SPQQA43P2F78

# 2. 创建本地目录
mkdir -p ~/downloads/photos

# 3. 下载文件
mc cp play/my-bucket/photos/pic1.jpg ~/downloads/photos/