在 MinIO 多节点集群中使用 LXMIN

Using LXMIN in MinIO Multi-Node cluster

MinIO 提供了多种数据复制方式,您可以自由选择最适合您需求的方法。我们已经撰写了关于基于 Bucket 的活跃-活跃复制(用于在 Bucket 级别复制对象)、批量复制(用于复制 Bucket 中的特定对象,为您提供更细粒度的控制)以及其他关于最佳实践的博客文章,这些文章都与站点到站点复制相关。MinIO 使用擦除编码来保护和确保数据冗余以及对象即时重建的可用性,而无需任何额外的硬件或软件。此外,MinIO 还可以确保捕获并即时修复任何损坏的对象,以使用数据腐败保护来确保数据完整性。物理磁盘上的数据可能由于多种原因而损坏,例如电压尖峰、固件错误、读写错误等。换句话说,只要您按照最佳实践设置 MinIO 集群,就无需担心备份保存到 MinIO 的数据。

当整个节点发生故障时,通常需要几分钟才能将其恢复联机。这是因为,在重新配置节点后,还需要对其进行重新配置,并且需要多次运行 Ansible/Puppet 等配置管理工具以实现幂等性。在这种情况下,如果能够拥有一个包含已内置配置的 VM 快照,以便节点能够尽快恢复联机,将非常有用。节点联机后,将使用集群中的其他节点重新加载数据,从而使集群恢复到良好的状态。

在这篇文章中,我们将介绍如何设置多个 LXMIN 服务器备份到多节点多驱动器 MinIO 集群。我们在内部使用 LXC 进行实验室测试,但您可以将这些概念应用于任何平台。我们将为每个 VM 代理服务器设置其自己的 LXMIN 服务,以此作为减少备份系统负载的一种方式。我们建议您使用此设置,因为来自特定实例的每个请求都会发送到其所在的 Hypervisor。此外,特定备份的请求将发送到能够列出该备份的节点。然后,LXMIN 服务连接到单个 MinIO 端点,在本例中,该端点允许访问多节点多驱动器 MinIO 集群。

image

对于集群中的每个服务器,请获取由证书颁发机构颁发的通配符证书。

在本例中,我们使用了 *.lab.domain.com 证书。

mkdir -p $HOME/.minio/certs/CAs
mkdir -p $HOME/.minio/certs_intel/CAs
vi $HOME/.minio/certs_intel/public.crt
vi $HOME/.minio/certs_intel/private.key

在每个 MinIO 服务器上下载并准备 LXMIN。

mkdir $HOME/lxmin
cd $HOME/lxmin
wget https://github.com/minio/lxmin/releases/latest/download/lxmin-linux-amd64
chmod +x lxmin-linux-amd64 
sudo mv lxmin-linux-amd64 /usr/local/bin/lxmin-aj

在 MinIO 服务器上为我们的 LXMIN 服务创建一个 systemctl 单元文件。注意 - 由于错误:无法获取实例配置,此文件可能需要以 User=rootGroup=root 运行。

sudo vi /etc/systemd/system/lxmin-aj.service

###
[Unit]
Description=Lxmin
Documentation=https://github.com/minio/lxmin/blob/master/README.md
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/lxmin-aj

[Service]
User=aj
Group=aj

EnvironmentFile=/etc/default/lxmin-aj
ExecStart=/usr/local/bin/lxmin-aj

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
###

为了配合 LXMIN 服务,我们需要一个包含 LXMIN 服务启动配置的设置文件。根据需要更改值。

sudo vi /etc/default/lxmin-aj

###
## MinIO endpoint configuration
LXMIN_ENDPOINT=https://node5.lab.domain.com:19000
LXMIN_BUCKET="lxc-backup"
LXMIN_ACCESS_KEY="REDACTED"
LXMIN_SECRET_KEY="REDACTED"
LXMIN_NOTIFY_ENDPOINT="https://webhook.site/REDACTED"

## LXMIN address
LXMIN_ADDRESS=":8000"

## LXMIN server certificate and client trust certs.
LXMIN_TLS_CERT="$HOME./lxmin/certs_intel/public.crt"
LXMIN_TLS_KEY="$HOME/.lxmin/certs_intel/private.key"
###

创建 systemctl 单元文件和配置文件后,请启用该服务,以便它可以在 VM 启动时自动启动。启用后,您可以启动它并通过日志检查其状态。

sudo systemctl enable --now lxmin-aj.service
sudo systemctl start lxmin-aj.service
sudo systemctl status lxmin-aj.service
sudo journalctl -f -u lxmin-aj.service

如果您想在启动时禁用服务、停止或重新启动服务,以下命令也很有用。

sudo systemctl disable lxmin-aj.service
sudo systemctl stop lxmin-aj.service
sudo systemctl restart lxmin-aj.service

接下来,让我们在实例上下载并准备 MinIO。

cd $HOME
mkdir minio
cd $HOME/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/minio-aj

对于集群中的每个 MinIO 服务器,请获取由证书颁发机构颁发的通配符证书。

将以下文件复制到服务器上。

注意:请务必使用集群中 MinIO 节点的 IP 更新以下 SAN(主题备用名称),以便接受证书。

mkdir -p $HOME/.minio/certs/CA
wget https://github.com/minio/certgen/releases/latest/download/certgen-linux-amd64
mv certgen-linux-amd64 certgen
chmod +x certgen 
./certgen -host "127.0.0.1,localhost,<node-1-IP>,<node-2-IP>,<node-3-IP>,<node-4-IP>"
mv public.crt $HOME/.minio/certs/public.crt
mv private.key $HOME/.minio/certs/private.key
cat $HOME/.minio/certs/public.crt | openssl x509 -text -noout

在 MinIO 服务器上为我们的 minio 服务创建一个 systemctl 单元文件。

sudo vi /etc/systemd/system/minio-aj.service

###
[Unit]
Description=MinIO
Documentation=https://min-io.cn/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio-aj

[Service]
WorkingDirectory=/usr/local

User=aj
Group=aj
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio-aj
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio-aj\"; exit 1; fi"
ExecStart=/usr/local/bin/minio-aj server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})
###

让我们打开 MinIO 默认配置文件并添加以下值

sudo vi /etc/default/minio-aj

###
# do paths in your home directory
MINIO_CI_CD=1
# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each MinIO server listens on
# (default 9000)

MINIO_VOLUMES="https://node{4...7}.lab.domain.com:19000/home/aj/disk{0...1}/minio"
#MINIO_VOLUMES="https://65.49.37.{20...23}:19000/home/aj/disk{0...1}/minio"

# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.

MINIO_OPTS="--address :19000 --console-address :19001 --certs-dir /home/aj/.lxmin/certs_intel"

# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=REDACTED

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=REDACTED

# Set to the URL of the load balancer for the MinIO deployment
# This value *must* match across all MinIO servers. If you do
# not have a load balancer, set this value to to any *one* of the
# MinIO hosts in the deployment as a temporary measure.
MINIO_SERVER_URL="https://node5.lab.domain.com:19000"
###

根据服务的状态启动或重新启动服务。

sudo systemctl enable --now minio-aj.service
sudo systemctl start minio-aj.service
sudo systemctl status minio-aj.service
sudo journalctl -f -u minio-aj.service

请务必对集群中的其他服务器重复安装 MinIO 和 LXMIN 的所有步骤。所有服务器都必须进行相同的配置。

让我们查看 MinIO 控制台以验证整个设置。

https://node5.lab.domain.com:19001/login

您也可以使用 mc 再次检查以确保集群正常运行。

mc alias set myminio https://node7.lab.domain.com MINIO_ROOT_USER MINIO_ROOT_PASSWORD

要测试 LXMIN/MinIO 备份,请访问以下 LXMIN 端点。这里假设通配符证书和密钥位于 $HOME/.vm-broker/ssl 中。

$ curl -X GET "https://node4.lab.domain.com:8000/1.0/instances/*/backups" -H "Content-Type: application/json" --cert $HOME/.vm-broker/ssl/tls.crt --key $HOME/.vm-broker/ssl/tls.key | jq .

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1100  100  1100    0     0   7766      0 --:--:-- --:--:-- --:--:--  8148
{
  "metadata": [
    {
      "instance": "delete",
      "name": "backup_2023-08-08-09-3627",
      "created": "2023-08-08T16:37:40.627Z",
      "size": 583116000,
      "optimized": false,
      "compressed": false
    },
    {
      "instance": "delete",
      "name": "backup_2023-08-08-10-3807",
      "created": "2023-08-08T17:39:21.241Z",
      "size": 583446188,
      "optimized": false,
      "compressed": false
    },
    {
      "instance": "delete",
      "name": "backup_2023-08-08-15-2135",
      "created": "2023-08-08T22:22:49.79Z",
      "size": 583774771,
      "optimized": false,
      "compressed": false
    },
    {
      "instance": "dilvm1",
      "name": "backup_2023-08-08-15-2618",
      "created": "2023-08-08T22:27:53.034Z",
      "size": 888696535,
      "optimized": false,
      "compressed": false
    },
    {
      "instance": "new0",
      "name": "backup_2023-08-08-17-5231",
      "created": "2023-08-09T00:53:52.235Z",
      "size": 617889321,
      "optimized": false,
      "compressed": false
    },
    {
      "instance": "new2",
      "name": "backup_2023-08-08-15-2805",
      "created": "2023-08-08T22:29:26.87Z",
      "size": 617917969,
      "optimized": false,
      "compressed": false
    },
    {
      "instance": "test-error",
      "name": "backup_2023-08-08-16-1501",
      "created": "2023-08-08T23:16:09.232Z",
      "size": 516457141,
      "optimized": false,
      "compressed": false
    }
  ],
  "status": "Success",
  "status_code": 200,
  "type": "sync"
}

复制不是备份

作为一名 DevOps 工程师,我早早就了解到复制不等同于备份(复制 != 备份)。MinIO 集群的性能非常快,可以扩展到数百或数千个节点,并可以即时修复损坏的对象。我们建议的不是备份 MinIO 内部的这些数据,而是备份节点上运行和操作 MinIO 集群所需的配置。我们的目标是,如果出现节点降级的情况,我们能够尽快将其恢复到良好状态,以便它可以重新加载数据(使用擦除编码)并参与 MinIO 集群操作。数据的实际完整性和复制由 MinIO 软件管理。

除了 API 之外,LXMIN 还包括一个用于本地管理备份的命令行界面。此命令行界面允许您使用您选择的任何语言构建在 LXMIN 功能之上。API 兼容性检查器和DirectPV可以简化持久卷的使用。

如果您想了解更多关于 MinIO 复制和集群的信息,请在Slack 上联系我们,我们会为您提供帮助!