文章目录
MinIO概述
Docker单节点部署
docker run \
-dit \
--net=host \
--name minio \
-v /mnt/data/minio/data:/data \
-v /mnt/data/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
minio/minio server /data \
--console-address ":9001" -address ":9000"
说明:
–net=host 网络模式是直连模式
–name minio 容器的名称是MinIO
-v /mnt/data/minio/data:/data 定义数据在宿主机的保存位置
-v /mnt/data/minio/config:/root/.minio 定义配置在宿主机的保存位置
-e “MINIO_ROOT_USER=minio” 登录账户是minio
-e “MINIO_ROOT_PASSWORD=minioadmin” 登录密码是minioadmin
–console-address “:9001” -address “:9000” 图形化客户端的端口是9001,api交互端口是9000
MINIO 集群搭建
使用五台服务器,安排如下
服务器作用*...75Nginx反向代理,以及https*...76minio节点*...77minio节点,管理节点(处理所有的请求)...178minio节点...179minio节点
1. 下载文件
下载软件安装包,我是用的是CentOS系统,系统架构是arrch64。所以下载linux-amd64版本的软件安装包。
https://dl.min.io/server/minio/release/linux-amd64/minio
2. 创建文件保存地址
在每台服务器上创建一个文件夹,用于保存MinIO的数据和配置。文件夹位置和名称随意。
例如我在CentOS的根目录下有个software文件,是软件的安装目录。然后在其中创建minio文件夹,其中的config文件夹用于保存MinIO的配置文件,data文件夹用于保存数据文件。
cd /software
mkdir minio
cd minio
mkdir config
mkdir data
3. 配置账户和密码
在启动软件之前我们可以配置一些参数。
# 配置MinIO的用户名和密码,若未配置,则默认账号和密码均为 minioadmin
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minioadmin
#为文件分享网址。若未设置,则默认为本身的容器 IP,不可正常使用。若使用了 nginx 反向代理,则更需要设置此参数;
export MINIO_SERVER_URL=http://*.*.*.77:9000
# 为 Console 管理平台登录网址,若不希望通过浏览器登录,可以增加 MINIO_BROWSER: off,禁止浏览器登录;
export MINIO_BROWSER_REDIRECT_URL=http://*.*.*.77:9001
4. 执行脚本
在和minio软件相同目录下执行如下命令。
./minio server \
--config-dir /software/minio/config \
--address ":9000" \
--console-address ":9001" \
http://*.*.*.76:9000/software/minio/data \
http://*.*.*.77:9000/software/minio/data \
http://*.*.*.178:9000/software/minio/data \
http://*.*.*.179:9000/software/minio/data
后台启动使用 nohup
配置 Nginx 代理
如果想要在MinIO中使用HTTPS,我试过两种方式,一个是在MinIO的配置文件中添加证书文件,另一个就是使用Nginx代理https请求。目前集群方式我推荐使用Nginx的方式。
配置文件
在Nginx的配置文件中添加如下配置:
worker_processes 2;
#配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 65535;
events {
#单个进程允许的客户端最大连接数
worker_connections 1024;
#使用epoll模型
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#nginx优化----------------------
#隐藏版本号
server_tokens on;
#优化服务器域名的散列表大小
server_names_hash_bucket_size 64;
server_names_hash_max_size 2048;
#开启高效文件传输模式
sendfile on;
#减少网络报文段数量
#tcp_nopush on;
#提高I/O性能
tcp_nodelay on;
#连接超时 时间定义 默认秒 默认65秒
keepalive_timeout 60;
#读取客户端请求头数据的超时时间 默认秒 默认60秒
client_header_timeout 15;
#读取客户端请求主体的超时时间 默认秒 默认60秒
client_body_timeout 15;
#响应客户端的超时时间 默认秒 默认60秒
send_timeout 15;
#上传文件的大小限制 默认1m
client_max_body_size 1024m;
#gzip on;
# minio 集群反向代理
server {
# 端口可以自定义
listen 9443 ssl;
server_name *.*.*.75;
# 证书的地址要绝对路径,最好保存在MinIO的config文件夹中,以免忘记。
ssl_certificate /software/minio/config/public.crt;
ssl_certificate_key /software/minio/config//private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
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-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
chunked_transfer_encoding off;
proxy_pass http://*.*.*.77:9000;
}
}
}
关于生成https的证书,可以参考 https://blog.csdn.net/You_are_my_zing/article/details/124448893 这篇文章中的certgen生成证书工具。
Java客户端使用
最低要求
Java 1.8 及以上
Maven依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.6</version>
</dependency>
构建客户端
普通客户端
MinioClient minioClient =
MinioClient.builder(
.endpoint("http://play.min.io")
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
.build();
构建 Https 客户端
因为目前使用的Https证书是私签证书,通过OpenSSL等工具生成SSL证书,不被浏览器信任,仍然显示不安全。同时也无法通过普通客户端的方式访问,所以我们需要做如下改动就可以正常使用。
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s){
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s){
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
X509TrustManager x509TrustManager = (X509TrustManager) trustAllCerts[0];
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory,x509TrustManager);
builder.hostnameVerifier((s, sslSession) -> true);
OkHttpClient okHttpClient = builder.build();
MinioClient client = MinioClient.builder()
# 这里配置的IP和PORT一定要是Nginx的地址,不然会因为IP和端口的不同出现数据签名不正确的问题。
.endpoint("https://*.*.*.75", 9443, true)
.httpClient(okHttpClient).region("eu-west-1")
.credentials("username", "password")
.build();
桶操作
对象操作
getPresignedObjectUrl(GetPresignedObjectUrlArgs args)
获取 HTTP 方法、到期时间和自定义请求参数的对象的预签名 URL。
public String getPresignedObjectUrl(GetPresignedObjectUrlArgs args)
参数
参数类型描述argsGetPresignedObjectUrlArgs参数
返回值
String - URL字符串
示例
- 下载URL
// 获取预签名的 URL 字符串用于下载“my-bucketname”中的“my-objectname”,有效期为 2 小时。
// 此外,还添加“响应内容类型”以动态设置服务器响应的内容类型。不是直接下载文件,而是在浏览器展示。
Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
String url =
minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket("my-bucketname")
.object("my-objectname")
.expiry(2, TimeUnit.HOURS)
.extraQueryParams(reqParams)
.build());
System.out.println(url);
- 上传URL
// 获取预签名的 URL 字符串,用于在“my-bucketname”中上传过期时间为 1 天的“my-objectname”。
String url =
minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.PUT)
.bucket("my-bucketname")
.object("my-objectname")
.expiry(1, TimeUnit.DAYS)
.build());
System.out.println(url);
生成上传的URL后,使用PUT请求发送数据,文件要使用body里面的binary方式上传。
- 查看元数据
// 获取预签名的 URL 字符串,以查找“my-bucketname”中“my-objectname”的元数据,有效期为 2 小时。
// 此外,还添加“响应内容类型”以动态设置服务器响应的内容类型。
// 在自签名的https中存在SignatureDoesNotMatch的问题
Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
String url =
minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.HEAD)
.bucket("my-bucketname")
.object("my-objectname")
.expiry(2, TimeUnit.HOURS)
.extraQueryParams(reqParams)
.build());
System.out.println(url);
版权归原作者 馥凝儒雅 所有, 如有侵权,请联系我们删除。