什么是 Minio
MinIO 是一款基于 Golang 编写的高性能、分布式对象存储系统。
数据是企业最关键的资产,因此必须在整个组织中方便、安全地提供数据,以便使其对每个人的价值最大化。因此,企业必须根据用户的需求采用一系列数据接口方法。
MinIO 提供了一套标准接口,可以覆盖数据驱动企业中的每个角色,比如图形用户界面(GUI)、命令行界面(CLI)和应用程序编程接口(API)。
集群部署
MinIO集群采用去中心化无共享架构,各节点间为对等关系,连接至任一节点均可实现对集群的访问,并通过DNS轮询等方式实现节点间的负载均衡。
集群负载均衡
minio 有两个端口,固定端口 9000 是 API 端口 ;前端访问的console端口默认随机启动的一个动态端口,如果希望使用固定端口,就需要在启动时加上--console-address
参数指定端口。
当你部署了 minio 集群,ip 地址如下:
- 172.17.7.2:9000
- 172.17.7.3:9000
- 172.17.7.4:9000
SpringBoot 服务应该怎么连接 minio 集群,这样才能保证随机一个节点宕机,依旧能正常使用,比如直接连接 172.17.7.2,当 172.17.7.2 宕机后,SpringBoot 服务无法正常访问集群,但实际上集群可以通过其他节点正常访问。
在这种情况下,你需要引入一个负载均衡(Load Balancer)来正确处理这个问题。当然,Spring Boot 的 Minio 服务客户端默认不支持群集连接,因此你需要一个外部负载均衡器,如 Nginx、HAProxy 等来分发请求到活动的 Minio 节点。
比如使用 Nginx 设置一个反向代理服务器,相关配置可能如下:
nginx
http {
upstream Minio {
server 172.17.7.2:9000;
server 172.17.7.3:9000;
server 172.17.7.4:9000;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://Minio;
}
}
}
如何判断集群是否可用
如果是一个有 N 块硬盘的分布式 Minio,只要有 N/2 硬盘在线,你的数据就是安全的。不过你需要至少有 N/2+1 个硬盘来创建新的对象。
对于一个 3 节点的 Minio 集群,每个节点 2 块硬盘,有 1 台服务器宕机,这个集群仍然是可读可写的,但有 2 台服务器宕机就不行了。
所以一个节点宕机: 服务可正常使用
可视化界面
创建 Bucket
如图所示创建一个 bucket,MinIO 使用存储桶来组织对象。存储桶类似于文件系统中的文件夹或目录,其中每个存储桶可以容纳任意数量的对象。
解读一下:
- bucket name:bucket名字。
- 长度最小3最大63;
- 只能使用小写字母、数字。虽然写着可以用. 和 -,但实际使用时发现会报错,直接复制也不行。
- versioning:版本控制允许在同一个键下保留同一个对象的多个版本。
- object locking:对象锁定防止对象被删除。需要支持保留和合法持有。只能在创建桶时启用。
- quota:配额用于限制桶内的数据量。
- retention:保留强制实施规则以阻止在一段时间内删除对象。必须启用版本控制才能设置存储桶保留策略。
Bucket相关的配置
Summary(概要):主要是展示当前bucket相关的配置。
Access Poilcy:一共有三个值。
- private 代表需要通过验签且生成的url只有7天有效期。
- public 代表不需要验签通过 http://127.0.0.1:端口/test/minio.jpg 永久可以访问。
- 自定义就是可以自己定义那些前缀是只读,那些前缀是读写的等等。这个在Anonymous里面可以配置。
Encyption: 就是配置是否加密。
Anonymous:配置Access Poilcy为custom,可以自己定义那些前缀是只读,那些前缀是读写的等等。
Events:事件,主要是给这个Bucket绑定那些事件通知
Lifecycle(生命周期):就是配置生命这个bucket的生命周期。
迁移方案
安装 MC
mc 是用来访问MinIO服务的命令行客户端,参考 min.io/docs/minio/...
MinIO 客户端 mc 命令行工具提供了一个类UNIX命令的替代,例如 ls, cat, cp, mirror, 以及 diff ,同时支持文件系统和亚马逊的 S3兼容云存储服务。
shell
curl https://dl.min.io/client/mc/release/linux-amd64/mc \
--create-dirs \
-o $HOME/minio-binaries/mc
chmod +x $HOME/minio-binaries/mc
export PATH=$PATH:$HOME/minio-binaries/
mc --help
使用 mc mirro 迁移
通过 mc mirror 命令可以实现数据的迁移,很简单,假设本来跑了一个 Minio 服务是 minio0,现在多服务器跑了两个服务:minio1 和 minio2,因为 minio1 和 minio2 已经做了集群,所以数据传给 minio1 还是 minio2 都是一样的。
注意❗: mc mirror 仅同步当前对象,而不同步任何版本信息或元数据。要同步对象的版本历史记录和元数据,请考虑使用 mc replicate 或 mc admin replicate 。
以下命令将本地文件系统目录中的内容同步到 myminio MinIO 部署上的 mydata 存储桶。
bash
mc mirror --watch ~/mydata myminio/mydata
我们来说明一下数据的迁移:
- 首先我们需要将客户端连接上 minio 服务
csharp
# 旧Minio服务,添加客户端,需要输入用户名密码,old和new是取的别名
# 新Minio服务
mc alias set minio1 http://172.17.7.2:9000
# 使用 mc admin info 命令测试与新添加的 MinIO 部署的连接
mc admin info minio1
- mc 迁移数据通常有下面三种场景:
shell
# 全量迁移
# 格式:mc mirror <旧数据源> <新数据源>
mc mirror --watch minio0 minio1
# 指定桶迁移,迁移的目标bucket需要提前创建
mc mirror --watch minio0/demo minio1
# 加上--overwrite参数,覆盖重名文件
mc mirror --overwrite minio2021 minio2023
mc mirror --overwrite minio2021/test minio2023/te
- --watch:该命令"监视"在本地文件系统上添加或删除的文件,并将这些操作同步到 MinIO,直到显式终止。
使用 mc replicate 迁移
mc replicate 和 mc mirror 都是 Minio 客户端 mc 提供的命令,用于不同的数据复制和同步需求。
mc replicate 用于配置 Minio 服务器上的桶(replication rules)用于在区域间自动复制对象。这通常用于地理冗余和跨区域数据复制。最大的优势是在源桶和目标桶之间实现自动、异步的对象复制。mc replicate 命令支持如下参数:
shell
mc replicate add <source-bucket> --priority <arg> --remote-bucket <arg> --storage-class <value> --tags <value> --prefix <string> --arn <string>
例如将 "minio/sourcebucket" 的对象同步到与 "minio2/destbucket" 桶:
shell
mc admin bucket remote add minio/sourcebucket https://accessKey:secretKey@minio2:9000/destbucket --service "replication"
mc replicate add minio/sourcebucket --remote-bucket "destbucket" --arn "arn:minio:replication::9cec63a6-260b-4042-8a9e-b63bd1a514b8:destbucket"
mc mirror 用于在两个minio server中的桶之间进行数据同步。mc mirror 命令类似于 Unix rsync 命令,会对源和目标地址进行比较,并只将新增或修改的内容从源复制到目标,可以实现将源目录快速同步到目标目录。对于大规模文件和桶,这通常是一个更快捷的方式。
例如,从本地 "minio/sourcebucket" 桶同步到远程"minio2/destbucket"桶:
shell
mc mirror minio/sourcebucket minio2/destbucket
两者的主要区别在于mc replicate 适用于设置自动跨区域复制规则,而 mc mirror 则更适合于手动的、一次性的数据迁移或备份。