首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >研发管理经验总结:3 私有化文件存储minio

研发管理经验总结:3 私有化文件存储minio

原创
作者头像
李福春
发布2025-07-05 23:36:57
发布2025-07-05 23:36:57
9300
代码可运行
举报
文章被收录于专栏:研发管理经验研发管理经验
运行总次数:0
代码可运行

1 故事-森林文件危机

橡树议会紧急召开。狐狸菲菲拍桌:"松鼠的存粮数据又丢了!我们需要私有化存储方案!"

猫头鹰奥利振翅而起:"MinIO符合S3标准,分布式架构可横向扩展。"他在树皮上画出拓扑图,"就像我们鸟巢的分层结构。"

树懒萨姆慢吞吞举起树皮笔记:"本地Docker部署只需一分钟。"他展示终端日志,"9000端口API,9001管理界面,挂载磁盘就能用。"

猎狗戴夫龇牙:"我测试过穿透攻击,数据加密可靠。"他甩出测试报告,"多租户权限控制比狐狸的树洞还严实。"

菲菲舔舔爪子:"客户端SDK兼容Java,上传下载像摘浆果一样简单。"她投影出控制台界面,"十分钟就能建好存储桶。"

月光下,四位长老碰触前爪达成决议。次日黎明,MinIO集群在森林数据中心启动,首个存储桶"data"开始接收松鼠的库存数据。当第一份备份成功写入时,连夜枭都吹起了口哨——这次,森林的数据终于安全了。

2 需求场景

私有化交付场景,需要有一个对象存储的组件,对文件进行统一的管理。

minio是一个不错的选择。符合S3标准。

部署步骤

本地docker部署

一分钟启动指令:

代码语言:javascript
代码运行次数:0
运行
复制
docker run --name minio --publish 9009:9000 --publish 9001:9001  
--volume  /data:/data  --env MINIO_DEFAULT_BUCKETS='data,conf' 
--env MINIO_FORCE_NEW_KEYS="yes" --env MINIO_ACCESS_KEY="carter" 
--env MINIO_SECRET_KEY="Carter123!"  --restart=always -d bitnami/minio:2022.3.5

Plain Text

启动日志:

代码语言:javascript
代码运行次数:0
运行
复制
$ docker logs -f minio 06:18:49.99 06:18:49.99 Welcome to the Bitnami minio 
container 06:18:49.99 Subscribe to project updates by watching 
https://github.com/bitnami/bitnami-docker-minio 06:18:49.99 Submit 
issues and feature requests at https://github.com/bitnami/bitnami-docker-minio/issues 
06:18:49.99 06:18:50.00 INFO  ==> ** Starting MinIO setup **minio 06:18:50.01 INFO  ==> 
Starting MinIO in background...minio 06:18:55.03 INFO  ==> Adding local Minio host to 'mc' 
configuration...minio 06:18:55.06 INFO  ==> Creating default buckets...Bucket created 
successfully `local/cycube`.Bucket created successfully `local/cycubedev`.minio 06:18:55.21 
INFO  ==> Stopping MinIO... 06:18:56.27 INFO  ==> ** MinIO setup finished! **
minio 06:18:56.28 INFO  
==> ** Starting MinIO **WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.         
Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORDAPI: http://172.17.0.7:9000  
http://127.0.0.1:9000
Console: http://172.17.0.7:9001 http://127.0.0.1:9001
Documentation: https://docs.min.io

Plain Text

9000端口是api端口,9001是后台管理系统端口;

更多配置:

配置

用途

--volume /data:/data --env

挂载磁盘到容器

--env MINIO_HTTP_TRACE=/opt/bitnami/minio/log/minio.log

指定http的日志输出目录

MINIO_DEFAULT_BUCKETS='cycube_local,cycube_dev'

启动即创建的bucket

访问控制后台:

主页:

k8s部署

文件挂载 10.10.1.24的nas盘,通过hostpath方式挂载到容器:

代码语言:javascript
代码运行次数:0
运行
复制
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio
spec:
  replicas: 1
  serviceName: svc-minio
  selector:
    matchLabels:
      name: minio
  template:
    metadata:
      labels:
        name: minio
    spec:
      nodeSelector:
        node: node24
      imagePullSecrets:
        - name: ali-sh2-cycube-images-mid
      volumes:
        - name: miniopv-icourt
          hostPath:
            path: /data/dev/minio/
            type: DirectoryOrCreate
      containers:
        - name: minio
          image: registry.cn-shanghai.aliyuncs.com/cycube/mid:bitnami-minio-2022.3.5
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: miniopv-icourt
            mountPath: "/data"
            subPath: "minio-dev"
          env:
            - name: MINIO_DEFAULT_BUCKETS
              value: "data,config"
            - name: MINIO_ROOT_USER
              value: "carter"
            - name: MINIO_ROOT_PASSWORD
              value: "Carter123!"
          resources:
            limits:
              cpu: 500m
              memory: 1024Mi
            requests:
              cpu: 250m
              memory: 512Mi
          ports:
            - name: minioadmin
              containerPort: 9001
              protocol: TCP
            - name: minioapi
              containerPort: 9000
              protocol: TCP






---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: minio
  name: svc-minio
spec:
  ports:
    - name: minioadmin
      port: 9001
      targetPort: 9001
      protocol: TCP
    - name: minioapi
      port: 9000
      targetPort: 9000
      protocol: TCP
  selector:
    name: minio
  sessionAffinity: None


---
apiVersion: v1
kind: Service
metadata:
  name: svc-minio-n
spec:
  ports:
    - name: minioadmin-port
      port: 9001
      protocol: TCP
      targetPort: 9001
  selector:
    name: minio
  sessionAffinity: None
  type: NodePort

访问地址: 通过nodePort方式访问,或者通过nginx转发:

代码语言:javascript
代码运行次数:0
运行
复制
  # Proxy requests to the bucket "photos" to MinIO server running on port 9000
 location /photos/ {
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host $http_host;


   proxy_connect_timeout 300;
   # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
   proxy_http_version 1.1;
   proxy_set_header Connection "";
   chunked_transfer_encoding off;


   proxy_pass http://localhost:9000;
 }


 # Proxy any other request to the application server running on port 9001
 location / {
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host $http_host;


   proxy_connect_timeout 300;
   # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
   proxy_http_version 1.1;
   proxy_set_header Connection "";
   chunked_transfer_encoding off;


   proxy_pass http://localhost:9001;
 }

接入步骤

客户端上传下载测试:

minio-java-sdk :

代码语言:javascript
代码运行次数:0
运行
复制
package com.joysky.joycode.lib.code.tool;




import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.util.UUID;


import org.apache.http.entity.ContentType;
import org.xmlpull.v1.XmlPullParserException;


import io.minio.MinioClient;
import io.minio.errors.MinioException;


public class FileUploader {


  private static final String bucketName = "data";
 public static final String  fileName ="/data/son1.jpg";


  public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
    try {
      // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
      MinioClient minioClient = new MinioClient("http://lifcHost:9009", "carte", "Carter123!");


      // 检查存储桶是否已经存在
      boolean isExist = minioClient.bucketExists("carter");
      if(isExist) {
        System.out.println("Bucket already exists.");
      } else {
        // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
        minioClient.makeBucket("carter");
      }


      // 使用putObject上传一个文件到存储桶中。
      minioClient.putObject("carter", UUID.randomUUID().toString()+".jpeg",new FileInputStream(new File("D:\\data\\son1.jpg")),"image/jpg");
      System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");
    } catch(MinioException e) {
      System.out.println("Error occurred: " + e);
    }
  }


}

上传效果:

小结

通过docker和k8s方式部署了minio, 并使用java的sdk完成了上传的操作。

参考资料

https://hub.docker.com/r/bitnami/minio docker官方镜像

https://github.com/minio/minio-java/tree/release java参考代码

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 故事-森林文件危机
  • 2 需求场景
  • 部署步骤
    • 本地docker部署
    • k8s部署
  • 接入步骤
  • 小结
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档