【Server】對象存儲OSS - Minio


 

官方文檔:

https://docs.min.io/docs/minio-quickstart-guide.html

看中文文檔CV命令發現下不下來安裝包,應該是地址問題

 

單擊搭建非常簡單,只有三個步驟:

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data

若需要后台執行,則這樣:

nohup ./minio server /data > /data/minio.log 2>&1 &

 

這里我使用的是Centos6最終版

[root@centos6-3 ~]# cat /etc/redhat-release
CentOS release 6.10 (Final)

發現啟動后警告

WARNING: Detected Linux kernel version older than 4.0.0 release, there are some known potential performance problems with this kernel version. MinIO recommends a minimum of 4.x.x linux kernel version for best performance

警告:檢測到Linux內核版本早於4.0.0版本,此內核版本存在一些已知的潛在性能問題。MinIO建議至少4個。x、 x linux內核版本以獲得最佳性能

 

Minio還提供了一個訪問頁面

http://localhost:9000/

 

賬號密碼:

minioadmin / minioadmin

 

 下面SDK參考視頻:

https://www.bilibili.com/video/BV1wh411B7QC

 

Java客戶端 SDK

需要的依賴:

        <!-- https://mvnrepository.com/artifact/io.minio/minio -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.3.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.8.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/me.tongfei/progressbar -->
        <dependency>
            <groupId>me.tongfei</groupId>
            <artifactId>progressbar</artifactId>
            <version>0.5.3</version>
        </dependency>

文件上傳則需要:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

 

上傳案例:

這里和官方文檔上的已經不太一樣了

老版本是使用字符串入參,新版本改用這種建造者模式注入參數

package cn.cloud9.mybatisplusgenerator;

import io.minio.BucketExistsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.UploadObjectArgs; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ApplicationTests {


    @Test
    void minioClientTest() throws Exception {

        // 1、創建Minio客戶端
        MinioClient minioClient = MinioClient
                .builder()
 .endpoint("http://centos6-2:9000") // Minio服務器地址 .credentials("minioadmin", "minioadmin") // 賬號
                .build();

        // 2、創建一個桶 // 桶名稱規范 https://blog.csdn.net/y_bccl27/article/details/118411780 String bucketName = "my-bucket"; // 判斷是否存在這個桶
        final boolean exists = minioClient.bucketExists(
                BucketExistsArgs
                        .builder()
                        .bucket(bucketName)
                        .build()
        );
        // 不存在則創建這個桶
        // 請求時發現報錯:The difference between the request time and the server's time is too large
        // 原因是時間不同步
        if (!exists) {
            minioClient.makeBucket(
                    MakeBucketArgs
                            .builder()
                            .bucket(bucketName)
                            .build()
            );
        }

        // 文件上傳
        String fileName = "C:\\Users\\Administrator\\Desktop\\fox.png";
        minioClient.uploadObject(
                UploadObjectArgs
                        .builder()
                        .bucket(bucketName)
 .object(fileName) // 存儲對象名稱 .filename(fileName) // 文件名稱,直接寫文件絕對路徑位置
                        .build()
        );
    }

}

 

 

文件下載案例:

還是使用之前的文件上傳下載,存取都要使用這個object名字

    @Test
    void minioClientDownloadTest() throws Exception {
        // 第一步拿到客戶端
        // 1、創建Minio客戶端
        MinioClient minioClient = MinioClient
                .builder()
                .endpoint("http://centos6-2:9000")
                .credentials("minioadmin", "minioadmin")
                .build();

        String bucketName = "my-bucket";
        String fileName = "C:\\Users\\Administrator\\Desktop\\fox.png";
        // 2、下載文件
        minioClient.downloadObject(
                DownloadObjectArgs
                        .builder()
                        .bucket(bucketName)
                        .object(fileName) .filename("C:\\Users\\Administrator\\Desktop\\fox-2.png")
                        .build()
        );
    }

 

 

SpringBoot整合Minio的SDK

追加MVC配置:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

 

封裝客戶端方便調用:

1、封裝一個屬性配置類:

package cn.cloud9.mybatisplusgenerator.config;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "minio-client")
public class MinioClientProperties {
    private String endpoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;
}

2、封裝客戶端Bean

package cn.cloud9.mybatisplusgenerator.config;


import io.minio.MinioClient;
import io.minio.MinioProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioClientConfiguration {

    @Autowired
    private MinioClientProperties mcp;

    @Bean
    public MinioClient minioClient() {
        return MinioClient
                .builder()
                .endpoint(mcp.getEndpoint())
                .credentials(mcp.getAccessKey(), mcp.getSecretKey())
                .build();
    }
}

 

配置文件編寫客戶端連接信息:

minio-client:
  endpoint: http://centos6-2:9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucket-name: my-bucket

 

編寫Minio的Controller

package cn.cloud9.mybatisplusgenerator.controller;


import cn.cloud9.mybatisplusgenerator.config.MinioClientProperties;
import com.alibaba.fastjson.JSON;
import io.minio.*;
import io.minio.messages.Item;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@RestController
@RequestMapping("/minio")
public class MinioController {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    MinioClientProperties mcp;

}

 

文件下載接口:

    /**
     * /list/download/{fileName}
     * @param resp
     * @param fileName
     * @throws Exception
     */
    @GetMapping("/download/{fileName}")
    public void download(HttpServletResponse resp, @PathVariable("fileName") String fileName) throws Exception {

        InputStream inputStream = null;

        try {

            // 取出對象信息
            final StatObjectResponse statObject = minioClient.statObject(
                    StatObjectArgs
                            .builder()
                            .bucket(mcp.getBucketName())
                            .object(fileName)
                            .build()
            );

            // 設置下載類型的響應信息
            resp.setContentType(statObject.contentType());
            resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));

            // 下載邏輯

            // 從客戶端獲取輸入流(獲取對象響應)
            final GetObjectResponse object = minioClient.getObject(
                    GetObjectArgs
                            .builder()
                            .bucket(mcp.getBucketName())
                            .object(fileName)
                            .build()
            );
            inputStream = object;
            // 輸出文件
            IOUtils.copy(inputStream, resp.getOutputStream());


        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            assert inputStream != null;
            inputStream.close();
        }
    }

 

文件上傳接口:

    /**
     * /minio/upload
     * @param files
     * @return
     */
    @PostMapping("/upload")
    public String upload(@RequestParam(name = "file", required = false)MultipartFile[] files) {
        if (null == files || files.length == 0) return "沒有上傳的文件!";

        final ArrayList<String> objects = new ArrayList<>(files.length);

        for (MultipartFile mFile : files) {

            // 先保存名稱
            final String filename = mFile.getOriginalFilename();
            objects.add(filename);

            // 然后上傳
            try {
                InputStream inputStream = mFile.getInputStream();

                // 上傳可以獲取一個輸入流
                final ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs
                        .builder()
                        .bucket(mcp.getBucketName())
                        .object(filename)
                        .stream(inputStream, mFile.getSize(), -1)
                        .build()
                );

                final String etag = objectWriteResponse.etag();
                System.out.println(etag);

                inputStream.close();

            } catch (Exception exception) {
                exception.printStackTrace();
                return "上傳失敗!";
            }

        }
        return "上傳成功 " + objects;

    }

注意上傳這里,MVC默認大小限制會報錯,需要自己增加配置

package cn.cloud9.mybatisplusgenerator.config;

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@Configuration
public class MultipartConfiguration {
    /**
     * 版權聲明:本文為CSDN博主「養生編程大隊長」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
     *     原文鏈接:https://blog.csdn.net/qq_27886773/article/details/102695145
     * @return
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxRequestSize(DataSize.ofGigabytes(1));
        factory.setMaxFileSize(DataSize.ofGigabytes(1));
        return factory.createMultipartConfig();
    }

}

Postman測試:

 

 

 

展示文件列表:

    /**
     * /minio/list
     * @return
     * @throws Exception
     */
    @GetMapping("/list")
    public List<String> listBucketObject() throws Exception {
        final Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs
                        .builder()
                        .bucket(mcp.getBucketName())
                        .build()
        );

        final Iterator<Result<Item>> iterator = results.iterator();

        final ArrayList<String> objects = new ArrayList<>();

        while (iterator.hasNext()) {
            Item item = iterator.next().get();
            objects.add(item.objectName() + " " + item.size());
        }
        return objects;
    }

測試:

 

刪除文件:

    @DeleteMapping("/delete/{fileName}")
    public String delete(@PathVariable("fileName") String filename) {
        try {
            minioClient.removeObject(
                    RemoveObjectArgs
                            .builder()
                            .bucket(mcp.getBucketName())
                            .object(filename)
                            .build()
            );
        } catch (Exception exception) {
            exception.printStackTrace();
            return "刪除失敗!";
        }
        return "刪除成功";
    }

測試:

 

 

 

 

Docker構建Minio分布式集群

參考文章:

https://blog.csdn.net/networken/article/details/111500745

 

嘗試在Centos6上面安裝Docker無果,官方停止6版本的維護,撤掉了所有的相關包資源

只能改用7版本部署

[root@centos7-1 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

 

三台機器,每台機器配置1個Minio並掛載兩個磁盤空間

192.168.124.31 centos7-1
192.168.124.32 centos7-2
192.168.124.33 centos7-3

 

配置IP映射和主機名的更改

# 1、配置機器IP映射 每台機器都要執行
cat >> /etc/hosts << EOF
192.168.124.31 centos7-1
192.168.124.32 centos7-2
192.168.124.33 centos7-3
EOF

# 2、對應機器IP執行
echo centos7-1 > /etc/hostname
echo centos7-2 > /etc/hostname
echo centos7-3 > /etc/hostname

 

一條命令自動安裝Docker:

curl -sSL https://get.daocloud.io/docker | sh

 

直接執行容器運行命令:

# 1號機器
docker run -d --name minio \
  --restart=always --net=host \
  -e MINIO_ACCESS_KEY=admin \
  -e MINIO_SECRET_KEY=admin123 \
  -v minio-data1:/data1 \
  -v minio-data2:/data2 \
  minio/minio server \
  --address 192.168.124.31:9000 \
  http://centos7-{1...3}/data{1...2}

# 2號機器
docker run -d --name minio \
  --restart=always --net=host \
  -e MINIO_ACCESS_KEY=admin \
  -e MINIO_SECRET_KEY=admin123 \
  -v minio-data1:/data1 \
  -v minio-data2:/data2 \
  minio/minio server \
  --address 192.168.124.32:9000 \
  http://centos7-{1...3}/data{1...2}

# 3號機器
docker run -d --name minio \
  --restart=always --net=host \
  -e MINIO_ACCESS_KEY=admin \
  -e MINIO_SECRET_KEY=admin123 \
  -v minio-data1:/data1 \
  -v minio-data2:/data2 \
  minio/minio server \
  --address 192.168.124.33:9000 \
  http://centos7-{1...3}/data{1...2}

 

可以訪問1號機的Minio的面板,創建一個桶,

訪問2號機和3號機的面板看看是否有這個桶

 

 

 

檢查是否成功執行,查看minio容器運行日志

[root@centos7-3 ~]# docker logs -f minio
WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
         Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
WARNING: Detected Linux kernel version older than 4.0.0 release, there are some known potential performance problems with this kernel version. MinIO recommends a minimum of 4.x.x linux kernel version for best performance
Waiting for all MinIO sub-systems to be initialized.. lock acquired
Automatically configured API requests per node based on available memory on the system: 19
All MinIO sub-systems initialized successfully
Waiting for all MinIO IAM sub-system to be initialized.. lock acquired
Status: 6 Online, 0 Offline. 
API: http://192.168.124.33:9000 

Console: http://192.168.124.33:45149 http://172.17.0.1:45149 http://127.0.0.1:45149     

Documentation: https://docs.min.io

WARNING: Console endpoint is listening on a dynamic port (45149), please use --console-address ":PORT" to choose a static port.
Exiting on signal: TERMINATED
WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
         Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
WARNING: Detected Linux kernel version older than 4.0.0 release, there are some known potential performance problems with this kernel version. MinIO recommends a minimum of 4.x.x linux kernel version for best performance
Waiting for all MinIO sub-systems to be initialized.. lock acquired
Automatically configured API requests per node based on available memory on the system: 19
All MinIO sub-systems initialized successfully
Waiting for all MinIO IAM sub-system to be initialized.. lock acquired
Status:         6 Online, 0 Offline. 
API: http://192.168.124.33:9000 

Console: http://192.168.124.33:35367 http://172.17.0.1:35367 http://127.0.0.1:35367     

Documentation: https://docs.min.io

WARNING: Console endpoint is listening on a dynamic port (35367), please use --console-address ":PORT" to choose a static port.

翻譯后:

警告:不推薦使用MINIO_ACCESS_密鑰和MINIO_SECRET_密鑰。
請使用MINIO_ROOT_用戶和MINIO_ROOT_密碼
警告:檢測到Linux內核版本早於4.0.0版本,此內核版本存在一些已知的潛在性能問題。MinIO建議至少4個。x、 x linux內核版本以獲得最佳性能
正在等待初始化所有MinIO子系統。。獲得鎖
根據系統上的可用內存自動配置每個節點的API請求:19
所有MinIO子系統均已成功初始化
正在等待初始化所有MinIO IAM子系統。。獲得鎖
狀態:6在線,0離線。
應用程序編程接口:http://192.168.124.33:9000
慰問:http://192.168.124.33:45149 http://172.17.0.1:45149 http://127.0.0.1:45149
文檔:https://docs.min.io
警告:控制台端點正在偵聽動態端口(45149),請使用--Console address“:port”選擇靜態端口。
信號退出:終止
警告:不推薦使用MINIO_ACCESS_密鑰和MINIO_SECRET_密鑰。 請使用MINIO_ROOT_用戶和MINIO_ROOT_密碼 警告:檢測到Linux內核版本早於4.0.0版本,此內核版本存在一些已知的潛在性能問題。MinIO建議至少4個。x、 x linux內核版本以獲得最佳性能 正在等待初始化所有MinIO子系統。。獲得鎖 根據系統上的可用內存自動配置每個節點的API請求:19 所有MinIO子系統均已成功初始化 正在等待初始化所有MinIO IAM子系統。。獲得鎖 狀態:6在線,0離線。 應用程序編程接口:http://192.168.124.33:9000 慰問:http://192.168.124.33:35367 http://172.17.0.1:35367 http://127.0.0.1:35367 文檔:https://docs.min.io 警告:控制台端點正在偵聽動態端口(35367),請使用--Console address“:port”選擇靜態端口。

 

客戶端查看minio狀態,3個節點及每個節點上的Drivers全部在線:

這里注意,客戶端還需要自己下載:

下載參考地址:

https://zhuanlan.zhihu.com/p/39572049

下載安裝:

wget https://dl.minio.io/client/mc/release/linux-amd64/mc
chmod +x mc

 

客戶端添加一個主機賬號配置:

[root@centos7-1 ~]# ./mc config host add minio http://centos7-1:9000 admin admin123 
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Added `minio` successfully.
[root@centos7-1 ~]#

查看集群節點狀態:

[root@centos7-1 ~]# ./mc admin info minio
●  centos7-1:9000
   Uptime: 11 minutes 
   Version: 2022-03-17T06:34:49Z
   Network: 3/3 OK 
   Drives: 2/2 OK 
   Pool: 1st

●  centos7-2:9000
   Uptime: 11 minutes 
   Version: 2022-03-17T06:34:49Z
   Network: 3/3 OK 
   Drives: 2/2 OK 
   Pool: 1st

●  centos7-3:9000
   Uptime: 11 minutes 
   Version: 2022-03-17T06:34:49Z
   Network: 3/3 OK 
   Drives: 2/2 OK 
   Pool: 1st

0 B Used, 1 Bucket, 0 Objects
6 drives online, 0 drives offline
[root@centos7-1 ~]#

 

斷開其中一個節點(centos7-3):

docker stop minio
docker rm minio

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM