使用 Ansible 安装 MinIO 集群及集群数据迁移

883 阅读4分钟

历史版本地址:dl.minio.org.cn/server/mini…

环境

  • CentOS 7.6
  • MinIO RELEASE.2021-05-27T22-06-31Z
  • Ansible 2.9.17

0. 准备

  1. 确保待安装 MinIO 机器的 9091 端口对外开放
  2. 下载 Ansible 离线安装包然后解压
# yum 安装Ansible
yum install -y ansible

链接:https://pan.baidu.com/s/1ZDPiv_2reyvlK-10NgbiNA 
提取码:rjti

  1. 下载 MinIO 安装脚本然后解压
链接:https://pan.baidu.com/s/1xBIn1FXypexSnnu-KKOLwQ 
提取码:jb0p

4. 下载 MinIO 离线安装包放在上一步安装脚本的 roles/common/files 文件夹中

链接:https://pan.baidu.com/s/1eFmV7so6Q5byjsWnd8_13w 
提取码:ry5v

在装有ansible工具的机器上执行(配置 Ansible 到 多台 MinIO 主机免密)

# 生成密钥对
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
# 安装公钥
ssh-copy-id -i /etc/ssh/ssh_host_ecdsa_key.pub Minio主机IP
# 设置SSH(不设置免密不生效)
ssh-agent bash
ssh-add /etc/ssh/ssh_host_ecdsa_key

2. 安装 Ansible(如果yum 安装此步骤可省略)

bash install-ansible.sh

# 验证 Ansible 是否安装成功
ansible --version

3. 安装 MinIO 集群

切换到 ansible-minio 目录

3.1 配置 MinIO 集群机器的 IP

编辑 host 文件,写入待安装机器的 IP
示例:

172.23.0.2
172.23.0.3
172.23.0.4
172.23.0.5
172.23.0.6

如果本地也需要安装 MinIO,则在 local 块下写本机 IP,others 块下写其它节点的 IP 示例:

[local]
172.18.0.2

[others]
172.18.0.3
172.18.0.4
172.18.0.5
172.18.0.6

3.2 修改 MinIO 的配置信息

编辑 vars.yml 文件中的配置项

---
# MinIO 安装文件存放目录
minio_install_dir: /httx/run/minio/

# MinIO 进程运行的用户和用户组
minio_user: minio
minio_group: minio

# MinIO 环境变量配置文件存储路径
minio_server_envfile: /httx/run/minio/config/minio

# MinIO 服务监听端口
minio_server_addr: ":9091"

# MinIO 服务数据存储目录(单台服务器需要四个数据节点)
minio_server_datadirs:
  - /data/minio

# 是否自动创建 MinIO数据存储目录
minio_server_make_datadirs: true

# MinIO 集群节点列表, IP 以实际情况为准
minio_server_cluster_nodes:
  - 'http://172.18.0.2/data/minio'
  - 'http://172.18.0.3/data/minio'
  - 'http://172.18.0.4/data/minio'
  - 'http://172.18.0.5/data/minio'
  - 'http://172.18.0.6/data/minio'
# Additional environment variables to be set in minio server environment
minio_server_env_extra: ""
# Additional Minio server CLI options(2021-07-15 这个版本后才支持 console-address web控制台端口,不指定则端口随机生成)
minio_server_opts: "--console-address=:19092"
# MinIO access and secret keys
minio_access_key: "minio"
minio_secret_key: "3u5x9^WWH@!TjDa"

3.3 安装

  1. 当前安装所在机器也需要安装 MinIO,执行如下命令:
ansible-playbook -i hosts  install-minio-local.yml  -e"@vars.yml"

2. 当前安装所在机器不需要安装 MinIO,执行如下命令:

ansible-playbook -i hosts  install-minio.yml  -e"@vars.yml"

4. 验证集群是否正常

4.1 内置的监控服务

Minio服务通过内置的服务端点暴露监控数据,用来监控服务整体的健康状态以及性能指标:
Healthcheck 探针: 提供两个服务探活接口,一个用于检测服务是否启动,另外一个用于检测服务是否可以正常对外提供服务(服务就绪)

  • 探活接口: /minio/health/live
  • 就绪接口: /minio/health/ready
curl -v http://localhost:9091/minio/health/ready

结果示例:

* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9091 (#0)
> GET /minio/health/ready HTTP/1.1
> Host: localhost:9091
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Length: 0
< Content-Security-Policy: block-all-mixed-content
< Server: MinIO
< Vary: Origin
< X-Amz-Request-Id: 1686991480234B30
< X-Xss-Protection: 1; mode=block
< Date: Tue, 08 Jun 2021 11:50:29 GMT
<
* Connection #0 to host localhost left intact
* Closing connection 0

4.2 在其中一台创建 bucket 然后上传文件,通过另外一台验证是否能正常访问

5. 配置负载均衡

upstream minio {
    server 172.18.0.2:9091;
    server 172.18.0.3:9091;
    server 172.18.0.4:9091;
    server 172.18.0.5:9091;
    server 172.18.0.6:9091;
}

server {
    listen 9091;
    
    # To allow special characters in headers
    ignore_invalid_headers off;
    # Allow any size file to be uploaded.
    # Set to a value such as 1000m; to restrict file size to a specific value
    client_max_body_size 1000m;
    # To disable buffering
    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-Proto $scheme;
        proxy_set_header Host $http_host;
        
        proxy_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        
        proxy_pass http://minio;
    }
}

Minio集群数据迁移

获取上面minio安装包,解压里面有minio客户端工具mc,配置mc工具任何目录可使用

cp mc /usr/local/bin/ && chmod +x /usr/local/bin/mc

准备迁移 例如:A集群迁移到B集群

# 命令与解释
mc config host add cluster_name http://$clusterAddr "$accessKey" "$accessSecret"  --api S3v4
- cluster_name:定义集群名称
- clusterAddr:集群某台服务器ip+端口
- "$accessKey":集群的key
- "$accessSecret":集群secretKey

在A集群执行如下命令

mc config host add clusterA http://10.xxx.xxx.185:9091 A集群的key A集群secretKey --api S3v4

# B集群
mc config host add clusterB http://10.xxx.xxx.185:9091 B集群的key B集群secretKey --api S3v4

#执行以下命令查看A、B集群配置是否添加成功
mc config host ls

获取集群信息

执行命令测试能否连通:

mc ls clusterA

如有文件或至少存在一个 Bucket,会在回显中列出;

image.png

执行命令获取集群数据大小(最好不要执行此命令):

# 如果有文件或存在至少一个 Bucket,会在最后一行打印当前集群所有文件总大小。
mc du clusterA

对拷(镜像)

mc mirror clusterA/Bucket clusterB/Bucket

「实验性」: 若要实现不停机对拷,可以使用以下命令: bash mc mirror -w $srcCluster/Bucket $destCluster
-w 参数可以让 mirror 命令持续监控某一目录。由于 mirror 只能对拷单 Bucket,如果使用 Shell 脚本进行 for 轮询实现集群对拷时,一旦 Bucket 过多,此命令可能会造成大量监控线程,增加负载。

mc 无法实现集群全量对拷,单条命令只能逐个 Bucket 进行操作。

检查是否完全结束

使用命令检查是否有未完整传输的文件:

# 如果有未传输完全的文件,会在回显中列出。
mc ls --incomplete clusterA

如果有必要,可以删除某个桶中的残缺文件:

mc rm --incomplete clusterA/$bucket

一些说明

  • 无需担心数据分片等问题,哪怕节点数量不对等。

    因为是直接从集群入口访问并获取数据,并不是 ”磁盘 to 磁盘“ 的迁移方式,某个节点上的某块磁盘究竟存的是纠删码还是分片的数据都没有关系,因为从集群地址中读出来的数据是完整的数据,这就是为什么要求一定要能获取到集群地址的原因。

  • Bucket 在 MinIO 中应被视为 ”挂载目录“ (mount),而不是 "磁盘目录" (mkdir)。

  • mc cp 命令需要在目标集群拥有同名 Bucket,mc mirror 不需要,同时 mc mirror 会自动保存目录的层级信息,mc cp 需要额外指定 --recursive 参数,请根据需要酌情选择。

  • mc mirror 的集群 to 集群、集群 to 本地用法并未在 官方文档 中列出,很可能属于 hack 用法,请注意可能存在的风险。

minio历史版本下载地址

dl.minio.org.cn/server/mini…

  1. 例如下载minio.RELEASE.2021-12-18T04-42-33Z版本
  2. wget dl.minio.org.cn/server/mini…
  3. mv minio.RELEASE.2021-08-05T22-01-19Z minio
  4. 压缩为tar.gz文件 tar -czvf minio.tar.gz minio