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 则更适合于手动的、一次性的数据迁移或备份。

相关推荐
陌上花开࿈38 分钟前
调用第三方接口
java
Aileen_0v01 小时前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
桂月二二3 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
海绵波波1073 小时前
flask后端开发(10):问答平台项目结构搭建
后端·python·flask
小马爱打代码3 小时前
设计模式详解(建造者模式)
java·设计模式·建造者模式
栗子~~4 小时前
idea 8年使用整理
java·ide·intellij-idea
2301_801483694 小时前
Maven核心概念
java·maven
网络风云4 小时前
【魅力golang】之-反射
开发语言·后端·golang
Q_19284999064 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端