高性能云原生数据对象存储MinIO实战-中
@
实战使用
设置Nginx代理
前面我们部署4个节点的MinIO Server,更为合理的使用的用Nginx配置代理转发实现客户端接入高可用及负载均衡。
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
server_tokens off;
tcp_nodelay on;
keepalive_timeout 10;
client_header_timeout 10;
client_body_timeout 10;
reset_timedout_connection on;
send_timeout 10;
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 100;
gzip on;
gzip_disable "msie6";
gzip_proxied any;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
limit_req_zone $binary_remote_addr zone=myRateLimit:100m rate=1r/s;
upstream minio {
server 192.168.5.52:9900 weight=1;
server 192.168.5.53:9900 weight=1;
server 192.168.50.95:9900 weight=1;
server 192.168.12.28:9900 weight=1;
}
upstream minio-console {
server 192.168.5.52:9901 weight=1;
server 192.168.5.53:9901 weight=1;
server 192.168.50.95:9901 weight=1;
server 192.168.12.28:9901 weight=1;
}
server {
listen 9900;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio;
}
}
server {
listen 9901;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio-console;
}
}
}
后续直接访问Nginx 服务器的9900和9901端口接口,访问http://192.168.50.156:9901/ 出现登录页面
创建用户
- MinIO用户由唯一的接入密钥(用户名)和对应的密钥(密码)组成。客户端必须通过指定有效的访问密钥(用户名)和现有MinIO用户的相应密钥(密码)来验证其身份。
- 组提供了一种简化的方法,用于管理具有常见访问模式和工作负载的用户之间的共享权限。
- 用户通过所属的组继承对数据和资源的访问权限。
- MinIO使用基于策略的访问控制(Policy-Based Access Control, PBAC)来定义经过身份验证的用户可以访问的授权操作和资源。每个策略描述一个或多个操作和条件,这些操作和条件概述了一个或一组用户的权限。
- 每个用户只能访问内置角色显式授予的资源和操作。默认情况下,MinIO拒绝访问任何其他资源或操作。
点击创建用户按钮输入用户信息
创建组,选择用户
创建服务账号
MinIO客户端使用
# 下载客户端,可以按需下载
wget https://dl.min.io/client/mc/release/linux-amd64/mc
# 赋执行权限
chmod +x mc
# 拷贝到/usr/local/sbin/
cp mc /usr/local/sbin/
# mc命令帮助
./mc --help
MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。
alias 在配置文件中设置、删除和列出别名
ls 列出文件和文件夹。
mb 创建一个存储桶或一个文件夹
rb 删除一个桶
cp 拷贝文件和对象。
mirror 给存储桶和文件夹做镜像。
cat 显示文件和对象内容。
head 显示对象的第一个'n'行
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
share 生成用于共享的URL。
find 基于参数查找文件。
sql 在对象上运行SQL查询
stat 显示对象的元数据
mv 移动对象
tree 以树格式列出存储桶和对象
du 递归总结磁盘使用情况
retention 设置对象和桶的保留率
legalhold 设置对象的合法持有权
diff 列出两个桶之间对象名称、大小和日期的差异
rm 删除文件和对象。
version 输出版本信息
ilm 生命周期管理桶
encrypt 管理桶加密配置
event 管理对象通知。
watch 监视文件和对象的事件
undo 撤销更新/删除操作
policy 管理访问策略
tag 管理桶和对象的标签
replicate 配置服务器端桶复制
admin 管理MinIO服务器
update 更新MC到最新版本
support 更新MC到最新版本
# 查询 mc host配置
mc config host ls
# 添加minio服务
mc config host add minio-server http://192.168.5.52:9900 miniotest miniotest123
# 删除host
mc config host remove minio-server
# 显示所有桶
mc ls minio-server
# 创建桶
mc mb minio-server/mybucket
# 显示所有桶
mc ls minio-server
# 上传文件
mc cp /home/commons/jdk-8u112-linux-x64.tar.gz minio-server/file
# 下载文件
mc cp minio-server/file/jdk-8u112-linux-x64.tar.gz /home/
MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务。页面上可以操作功能如管理用户、用户组、策略都可以使用mc admin来操作
service 服务重启并停止所有MinIO服务器
update 更新更新所有MinIO服务器
info 信息显示MinIO服务器信息
user 用户管理用户
group 小组管理小组
policy MinIO服务器中定义的策略管理策略
replicate 管理MinIO站点复制
config 配置管理MinIO服务器配置
decommission, decom 管理MinIO服务器池解除
heal 修复MinIO服务器上的磁盘,存储桶和对象
prometheus Prometheus管理Prometheus配置
kms kms执行KMS管理操作
bucket 管理MinIO服务器中定义的桶
tier 管理远程层目标,用于ILM转换
top 顶部提供MinIO的顶部统计信息
trace 跟踪显示MinIO服务器的http跟踪
console 控制台显示MinIO服务器的控制台日志
Java客户端使用
引入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.3</version>
</dependency>
创建MinIOFileUploader 文件上传演示工程
package com.itxs;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class MinIOFileUploader {
public static void main(String[] args)
throws IOException, NoSuchAlgorithmException, InvalidKeyException {
try {
// Create a minioClient with the MinIO server playground, its access key and secret key.
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://192.168.5.52:9900")
.credentials("J8LjOoIIvPYEeuQ7", "UiSVBMr3UeMHvIutwobOvpUifMZMNAvK")
.build();
// Make 'newbucket' bucket if not exist.
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket("newbucket").build());
if (!found) {
// Make a new bucket called 'asiatrip'.
minioClient.makeBucket(MakeBucketArgs.builder().bucket("newbucket").build());
} else {
System.out.println("Bucket 'newbucket' already exists.");
}
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket("newbucket")
.object("tinyid-server-1.0-001.tar.gz")
.filename("G:/tinyid-server-1.0.tar.gz")
.build());
System.out.println(
"'G:/tinyid-server-1.0.tar.gz' is successfully uploaded as "
+ "object 'tinyid-server-1.0-001.tar.gz' to bucket 'newbucket'.");
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
System.out.println("HTTP trace: " + e.httpTrace());
}
}
}
启动测试程序,可以看输出上传文件成功日志
通过查看控制台也显示在newbucket的新上传的文件
创建MinIOFileDownloader 文件下载演示工程
package com.itxs;
import io.minio.*;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class MinIOFileDownloader {
public static void main(String[] args)
throws IOException, NoSuchAlgorithmException, InvalidKeyException {
try {
// Create a minioClient with the MinIO server playground, its access key and secret key.
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://192.168.5.52:9900")
.credentials("J8LjOoIIvPYEeuQ7", "UiSVBMr3UeMHvIutwobOvpUifMZMNAvK")
.build();
minioClient.downloadObject(
DownloadObjectArgs.builder()
.bucket("newbucket")
.object("tinyid-server-1.0-001.tar.gz")
.filename("G:/my-tinyid-server-1.0-001.tar.gz")
.build());
System.out.println("bucket 'newbucket' 'tinyid-server-1.0-001.tar.gz' is successfully downloaded as "
+ "object 'G:/my-tinyid-server-1.0-001.tar.gz'");
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
System.out.println("HTTP trace: " + e.httpTrace());
}
}
}
通过查看控制台也显从newbucket的下载了文件,本地磁盘也有该文件
SpringBoot Starter使用
针对前面官网的Java客户端代码可以直接包装成springboot starter使用,也比较简单。而这里使用GitHub上已封装好的源码资源jlefebure/spring-boot-starter-minio,下载源码后可以修改spring-boot-starter-parent版本为较新的2.7.1,修改打包的版本号为1.11,执行maven install
使用之前的一个SpringBoot测试项目由于jlefebure/spring-boot-starter-minio依赖都是使用
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.3</version>
</dependency>
<dependency>
<groupId>com.jlefebure</groupId>
<artifactId>spring-boot-starter-minio</artifactId>
<version>1.11</version>
</dependency>
创建MinIO测试控制器MinioTestController.java
package cn.aotain.controller;
import com.jlefebure.spring.boot.minio.MinioException;
import com.jlefebure.spring.boot.minio.MinioService;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import java.nio.file.Paths;
import java.util.List;
@RestController
@RequestMapping("/minio")
public class MinioTestController {
@Autowired
private MinioService minioService;
@GetMapping("/")
public List<io.minio.messages.Item> testMinio(){
return minioService.list();
}
@GetMapping("/{object}")
public void getObject(@PathVariable("object") String object, HttpServletResponse response) throws MinioException, IOException {
InputStream inputStream = minioService.get(Paths.get("", object));
// Set the content type and attachment header.
response.addHeader("Content-disposition", "attachment;filename=" + object);
response.setContentType(URLConnection.guessContentTypeFromName(object));
// Copy the stream to the response's output stream.
IOUtils.copy(inputStream, response.getOutputStream());
response.flushBuffer();
}
}
浏览器输入http://localhost:8080/minio/tinyid-server-1.0-001.tar.gz 后成功下载前面上传的文件,MinioService也封装很多的方法,这些方法可以自行再测试下。
**本人博客网站 **IT小神 www.itxiaoshen.com