官方文檔:
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

