Minio 配置负载均衡和迁移

什么是 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 迁移

参考:min.io/docs/minio/...

通过 mc mirror 命令可以实现数据的迁移,很简单,假设本来跑了一个 Minio 服务是 minio0,现在多服务器跑了两个服务:minio1 和 minio2,因为 minio1 和 minio2 已经做了集群,所以数据传给 minio1 还是 minio2 都是一样的。

注意❗: mc mirror 仅同步当前对象,而不同步任何版本信息或元数据。要同步对象的版本历史记录和元数据,请考虑使用 mc replicatemc admin replicate

以下命令将本地文件系统目录中的内容同步到 myminio MinIO 部署上的 mydata 存储桶。

bash 复制代码
mc mirror --watch ~/mydata myminio/mydata

我们来说明一下数据的迁移:

  1. 首先我们需要将客户端连接上 minio 服务
csharp 复制代码
# 旧Minio服务,添加客户端,需要输入用户名密码,old和new是取的别名

# 新Minio服务
mc alias set minio1 http://172.17.7.2:9000

# 使用 mc admin info 命令测试与新添加的 MinIO 部署的连接
mc admin info minio1
  1. 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 则更适合于手动的、一次性的数据迁移或备份。

相关推荐
chuanauc3 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴19 分钟前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao26 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc78729 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野6 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person7 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜8 小时前
java异常学习
java