在 MinIO 多节点集群中使用 LXMIN

MinIO 提供了多种数据复制方式,您可以自由选择最适合您需求的方法。我们已经撰写了关于基于 Bucket 的活跃-活跃复制(用于在 Bucket 级别复制对象)、批量复制(用于复制 Bucket 中的特定对象,为您提供更细粒度的控制)以及其他关于最佳实践的博客文章,这些文章都与站点到站点复制相关。MinIO 使用擦除编码来保护和确保数据冗余以及对象即时重建的可用性,而无需任何额外的硬件或软件。此外,MinIO 还可以确保捕获并即时修复任何损坏的对象,以使用数据腐败保护来确保数据完整性。物理磁盘上的数据可能由于多种原因而损坏,例如电压尖峰、固件错误、读写错误等。换句话说,只要您按照最佳实践设置 MinIO 集群,就无需担心备份保存到 MinIO 的数据。
当整个节点发生故障时,通常需要几分钟才能将其恢复联机。这是因为,在重新配置节点后,还需要对其进行重新配置,并且需要多次运行 Ansible/Puppet 等配置管理工具以实现幂等性。在这种情况下,如果能够拥有一个包含已内置配置的 VM 快照,以便节点能够尽快恢复联机,将非常有用。节点联机后,将使用集群中的其他节点重新加载数据,从而使集群恢复到良好的状态。
在这篇文章中,我们将介绍如何设置多个 LXMIN 服务器备份到多节点多驱动器 MinIO 集群。我们在内部使用 LXC 进行实验室测试,但您可以将这些概念应用于任何平台。我们将为每个 VM 代理服务器设置其自己的 LXMIN 服务,以此作为减少备份系统负载的一种方式。我们建议您使用此设置,因为来自特定实例的每个请求都会发送到其所在的 Hypervisor。此外,特定备份的请求将发送到能够列出该备份的节点。然后,LXMIN 服务连接到单个 MinIO 端点,在本例中,该端点允许访问多节点多驱动器 MinIO 集群。
对于集群中的每个服务器,请获取由证书颁发机构颁发的通配符证书。
在本例中,我们使用了 *.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=root
和 Group=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 上联系我们,我们会为您提供帮助!