高可用集群
Arkvory 集群在站点中的某台服务器故障时仍能继续工作。两到三台 Linux 服务器持有同一个块卷的相同副本。其中一台服务器处于活动状态并运行 Arkvory。它故障时,集群管理器会将其隔离(fencing),并在另一台拥有相同数据的服务器上启动 Arkvory。
集群可以防护单个站点内服务器、磁盘或网络链路的丢失,但不能防护整个站点的丢失。为此,请在另一个站点保留镜像,并在集群之外保留备份。
工作原理
- 一个卷,同步副本。 DRBD 9 会在写入完成之前,把卷上的每次写入复制到其他服务器(协议 C)。整个安装都位于该卷上:数据库、存储、配置和各个发布版本。目录与文件字节永远不会分叉。
- Pacemaker 决定 Arkvory 在哪里运行。 Corosync 和 Pacemaker 维持仲裁,选出活动服务器,并按顺序启动:卷、文件系统、按卷上保存的状态恢复的服务(
arkvory-units)、数据库、arkvory-replica、API、worker、备份代理、更新定时器和一个虚拟 IP 地址。Arkvory 自身没有选举机制。 - 隔离是强制的。 在另一台服务器接管之前,Pacemaker 会通过电源设备(IPMI、iDRAC、iLO、Redfish、PDU)或虚拟机管理程序关闭故障服务器。没有隔离,两台服务器可能同时写入。没有隔离的集群无法启动。
- 每次已确认的写入都有两份副本。 只有当写入已存在于至少两份完整副本上时,Arkvory 才会以成功响应写入(参见写入与副本)。缺少副本时,写入停止,读取继续。
| 配置 | 数据服务器 | 见证节点 | 一台数据服务器故障时 |
|---|---|---|---|
ha-2 | 2 | 必需:一台不存放数据的小型服务器,运行 corosync-qnetd 和 DRBD 仲裁者 | 写入停止,直到服务器恢复或由操作员做出决定 |
ha-3 | 3 | 不使用:三台服务器按多数票决定 | 写入继续:仍有两份副本 |
推荐使用 ha-3。ha-2 成本更低,并且会如实停止写入,而不是让数据只保留一份副本。
集群适用于原生 Linux 软件包。Windows 安装和 Docker Compose 仍是配合镜像与备份使用的独立服务器。
写入与副本
完整副本是指处于最新状态的活动服务器本地磁盘,加上每一台已连接、正在复制且处于最新状态的其他数据服务器。正在重新同步的服务器在追平之前不计入。见证节点没有数据,永远不计入。
每个会修改数据的请求(HTTP API、容器注册表、Git LFS、npm)都会被检查两次:
- 执行之前,依据最近一秒的副本情况;
- 数据提交并同步之后,依据对卷的一次最新读取。
当完整副本少于写入所需的数量时,客户端会收到 HTTP 503,代码为 unavailable,原因为 replication_degraded,并带有 Retry-After 标头,绝不会是 2xx。上传完成作业的状态(GET /api/v1/jobs/{id})以同样方式检查,因为它会告诉客户端某个大文件上传已发布。
提交之后出现的 503 表示该操作可能只存在于一份副本中。请使用相同的 Idempotency-Key 重复请求:重复请求会返回已有的结果,当两份副本再次存在时,它的 2xx 即表示确认。
在写入停止期间,读取、下载、控制台、登录与退出、反馈以及 Git LFS 的批量请求都可正常工作。
在写入停止期间,或单副本决定生效期间,登录控制台的管理员会看到一条横幅。
要求
- 两到三台数据服务器,使用相同的 Linux 发行版、相同的 Arkvory 软件包版本,并且每台都有一块能容纳整个卷的磁盘(或逻辑卷)。请按整个存储加数据库的大小规划。
- 对于
ha-2,需要第三台小型服务器作为见证节点。它不需要存放数据的磁盘,也不运行 Arkvory。 - 服务器之间需要低延迟网络。每次写入都要等待其他服务器,因此延迟会叠加到每次写入上。条件允许时请使用专用链路。
- DRBD 9(内核模块和
drbd-utils9;许多发行版自带较旧的 8.4 模块,因此请使用 LINBIT 软件包)、pacemaker、pcs、corosync、resource-agents(在 Ubuntu 上为resource-agents-base和resource-agents-extra),以及适用于你硬件的 fence agent。对于ha-2:数据服务器上需要corosync-qdevice,见证节点上需要corosync-qnetd。 - 每台数据服务器各一个隔离设备,以及它的凭据。
- 服务器所在网络中的一个空闲 IP 地址。客户端连接到这个虚拟地址。
- 虚拟地址的 TLS 证书。请把证书和密钥放在卷上,这样每台服务器都能在相同路径找到它们。
搭建集群
下面的命令使用默认资源名 arkvory、安装目录 /opt/proanima-arkvory,并以 /dev/vg0/arkvory 作为底层磁盘。请以 root 身份运行。
在每台数据服务器上,解包 Arkvory 软件包但不安装。这会添加文件和
arkvory命令,并且不会在/opt/proanima-arkvory中创建任何内容:bashdpkg --unpack Arkvory-amd64.deb使用 RPM 软件包时,请安装文件但不运行其脚本:
rpm -i --noscripts Arkvory-x86_64.rpm。在第一台服务器上,你改为在第 5 步中正常安装该软件包,因此请在另一台数据服务器上完成第 2 步的方案。在一台数据服务器上生成方案。它会把 DRBD 资源和 Pacemaker 命令写入一个目录,供你审阅:
basharkvory cluster-plan --cluster ha-2 \ --nodes node-a=10.0.0.11,node-b=10.0.0.12 --witness witness=10.0.0.13 \ --disk /dev/vg0/arkvory --fence-agent fence_ipmilan \ --virtual-ip 10.0.0.100/24 --output /root/arkvory-plan对于
ha-3,在--nodes中列出三台服务器,并省略--witness。可选项:--cluster-resource、--drbd-minor(默认 0)、--drbd-port(默认 7789)、--filesystem(xfs或ext4,默认xfs)。名称必须是服务器的主机名。地址为 IPv4。把
arkvory.res复制到每台服务器(包括见证节点)的/etc/drbd.d/。在数据服务器上创建元数据,并在所有服务器上启动资源:bashdrbdadm create-md arkvory # data servers only drbdadm up arkvory # every server在见证节点上,还要运行
systemctl enable drbd@arkvory.service,使仲裁者在重启后恢复。该方案让返回的副本即使在写入负载下也至少以 20 MB/s 重新同步,最高为 1 GB/s。请把
disk部分中的c-min-rate和c-max-rate设为你的复制链路能够承载的值。在第一台数据服务器上,将其设为主节点,创建文件系统并挂载。对于全新的空磁盘,请先跳过初始同步:
bashdrbdadm new-current-uuid --clear-bitmap arkvory/0 drbdadm primary arkvory mkfs.xfs /dev/drbd0 mkdir -p /opt/proanima-arkvory && mount /dev/drbd0 /opt/proanima-arkvory把 Arkvory 安装到已挂载的卷中(使用 RPM 时,用
rpm -i Arkvory-x86_64.rpm代替dpkg --configure),把 TLS 文件放到卷上,并启用集群模式:bashdpkg --configure proanima-arkvory install -d -m 0750 -o root -g arkvory /opt/proanima-arkvory/config/tls install -m 0644 tls.crt /opt/proanima-arkvory/config/tls/tls.crt install -m 0640 -g arkvory tls.key /opt/proanima-arkvory/config/tls/tls.key arkvory configure --root /opt/proanima-arkvory --tls-cert /opt/proanima-arkvory/config/tls/tls.crt --tls-key /opt/proanima-arkvory/config/tls/tls.key --listen-host 0.0.0.0 arkvory configure --root /opt/proanima-arkvory --cluster ha-2configure --cluster会检查安装目录是否是已挂载的 DRBD 设备、此服务器是否为主节点,以及是否至少有两份副本完整。它会启动arkvory-replica,让 Arkvory 只在有两份完整副本时才确认写入,并关闭 Arkvory 服务的自动启动:从现在起由 Pacemaker 启动它们。如果某一步失败,会恢复独立配置。在第一台服务器上停止 Arkvory 并释放卷:
basharkvory cluster-release --root /opt/proanima-arkvory该命令按顺序停止 Arkvory 服务,卸载卷,并把此服务器设为从节点(secondary)。
依次在其他每台数据服务器上准备服务器:
basharkvory cluster-node --root /opt/proanima-arkvory dpkg --configure proanima-arkvory # 仅限 .deb;使用 RPM 时无需其他操作cluster-node会接管卷,准备服务器,然后再次释放卷,某一步失败时也是如此;报告的是第一个错误。只有当资源名不是arkvory时才需要--cluster-resource。在已挂载卷并正在为集群提供服务的服务器上(请先用cluster-release释放卷),以及当 Pacemaker 正在管理 Arkvory 组时,该命令会拒绝执行,因为此时卷归集群所有:要向正在运行的集群添加服务器,请按更换服务器中的说明操作。cluster-node会创建与第一台服务器用户 ID 和组 ID 相同的服务账户(卷上的文件归它们所有),并安装相同的服务,这些服务都不会自动启动。如果某个账户已存在但 ID 不同,命令会停止并告诉你应设置哪些 ID。每当一台服务器成为活动服务器时,arkvory-units会先从卷上获取服务,因此之后在活动服务器上更改的设置(例如备份存储)在故障切换后同样生效。在数据服务器上用
pcs设置 Corosync 集群(pcs host auth、pcs cluster setup、pcs cluster start --all)。在 Debian 和 Ubuntu 上,请先在每台数据服务器上运行pcs cluster destroy:软件包会安装一份示例 Corosync 配置,pcs会把它当作已有的集群。不要运行pcs cluster enable:被隔离的服务器应当只在你启动它时才重新加入。对于ha-2,还要对见证节点进行认证,并在其上运行pcs qdevice setup model net --enable --start。在 Debian 和 Ubuntu 上,软件包已经为其自身的服务账户设置好了仲裁设备:请改为在那里运行systemctl enable --now corosync-qnetd。打开
/root/arkvory-plan/pacemaker.sh。把每个<agent parameters: …>替换为你的隔离设备的参数:其地址、登录名、密码文件或密钥,以及该服务器的插座或端口。然后在一台数据服务器上运行该脚本:bashsh /root/arkvory-plan/pacemaker.sh该脚本在一个文件中构建全部配置,并一次性推送:隔离、仲裁策略、DRBD 资源、Arkvory 组及其约束。
在活动服务器上检查集群:
basharkvory cluster-check --root /opt/proanima-arkvory该命令检查仲裁、隔离是否已启用、每台服务器是否有隔离设备、DRBD 的仲裁与隔离设置、是否至少有两份副本完整,以及 Arkvory 是否恰好运行在一台服务器上。某项检查失败时,命令会以错误退出。
验证一次隔离:隔离每台备用服务器并让它恢复(参见隔离测试)。
把你的客户端和 DNS 名称指向虚拟地址。
日常运维
请以 root 身份运行这些命令。cluster-status、cluster-single-copy 和 cluster-kit 需要读取卷,因此请在活动服务器上运行;cluster-check、cluster-switchover 和 cluster-fence-test 可在任一数据服务器上运行。
| 命令 | 作用 |
|---|---|
arkvory cluster-status --root <dir> | 以 JSON 输出配置、此服务器的角色、完整副本数与所需副本数,以及任何操作员决定 |
arkvory cluster-check --root <dir> | 健康集群的全部检查;某项失败时以错误退出 |
arkvory cluster-switchover --root <dir> --to <server> | 有计划地把 Arkvory 迁移到另一台数据服务器;除非目标服务器持有完整副本,否则被拒绝 |
arkvory cluster-fence-test --root <dir> --node <standby> [--yes] | 隔离一台备用服务器以验证其隔离设备;活动服务器会被拒绝 |
arkvory cluster-single-copy --root <dir> --until <time> --reason <text> | 在某个时间之前接受只有一份副本的写入;参见单副本 |
arkvory cluster-kit --root <dir> --output <file> | 在活动服务器上:生成新服务器加入所需的文件;参见更换服务器 |
arkvory cluster-node --root <dir> --kit <file> | 在新服务器上:用该文件加入集群,无需接管卷 |
pcs status 显示 Pacemaker 所看到的集群状态。
在控制台中
在集群安装中,管理员可以在菜单中找到 集群。该页面显示集群布局、当前提供服务的服务器、完整副本数、是否接受写入,以及其他每台服务器的连接状态和副本状态(完整、正在追赶 或 缺失)。下方的 下一步 给出适合当前状态的那一步操作及其命令:一切完整时进行计划切换;缺少副本时让服务器恢复或更换它(在 ha-3 中写入仍以两份副本继续时也是如此);以及如何结束单副本决定。该页面每 15 秒自动刷新一次。
写入停止时,每个界面上都会出现一条横幅说明这一点;管理员可以从横幅打开该页面。没有管理权限的用户只会看到上传暂停,而下载仍然正常。
计划切换
cluster-switchover 请求 Pacemaker 迁移该组,最多等待 5 分钟,直到 Arkvory 在目标服务器上运行,然后移除临时的放置规则。当目标服务器没有自己的完整副本时(例如正在重新同步),该命令会被拒绝。迁移期间到旧服务器的连接会断开;客户端会重复其请求。Arkvory 绝不会自行切回。
隔离测试
cluster-fence-test 首先运行 cluster-check 的各项检查,某项失败时拒绝执行。在 ha-2 中,隔离唯一的备用服务器会使写入停止,直到它恢复,因此该命令还要求提供 --yes。它通过备用服务器的隔离设备将其重启。重启后,用 pcs cluster start 在该服务器上启动集群。集群服务在重启后不会自行启动(参见搭建集群的第 8 步),因此被隔离的服务器没有你的操作就永远不会重新加入。
更新
在每台数据服务器上安装新软件包。在备用服务器上,软件包只替换程序文件,因为发布版本位于卷上。在活动服务器上,软件包会应用该发布版本:Arkvory 通知 Pacemaker 不要动这个组,停止服务,迁移,启动服务,等待它们就绪,然后把组交还。自动更新在活动服务器上的工作方式相同。如果更新及其回滚都失败,该组会保持非托管状态,Pacemaker 不会进行故障切换:请先排除原因,然后运行 pcs resource cleanup arkvory 和 pcs resource manage arkvory。
不要在集群服务器上用 systemctl 启动或停止 Arkvory 服务。Pacemaker 会把这当作故障。需要有计划地停止整个服务时,请使用 pcs resource disable arkvory 和 pcs resource enable arkvory。
故障
| 发生的情况 | ha-2 | ha-3 |
|---|---|---|
| 一台备用服务器故障 | 被隔离。读取继续,写入收到 503 replication_degraded | 被隔离。读取和写入继续 |
| 活动服务器故障 | 被隔离,Arkvory 在另一台服务器上启动。读取恢复,写入等待第二份副本 | 被隔离,Arkvory 在另一台服务器上启动。读取和写入恢复 |
| 数据服务器之间发生网络分裂 | 见证节点把仲裁权交给一侧;另一侧被隔离。绝不会有两个写入者 | 多数一侧继续;另一台服务器被隔离 |
| 三个成员中的两个故障(ha-2:一台数据服务器和见证节点) | 最后一台服务器没有仲裁:Arkvory 停止。绝不会有没有仲裁的写入者。恢复服务器(见下文) | 两台数据服务器故障时同样处理 |
| 隔离不起作用 | 不进行故障切换。Arkvory 保持停止,直到隔离成功 | 同样 |
恢复被隔离的服务器:
- 修复原因并启动服务器。
- 在其上运行
pcs cluster start。 - 卷会重新同步已更改的块。当所需的每份副本再次完整时,写入会自动恢复;
arkvory cluster-status显示进度。
丢失仲裁后,请在每台已恢复的服务器上启动集群。Pacemaker 会在拥有最新副本的服务器上再次运行 Arkvory。最后一个丢失仲裁的服务器在恢复途中可能再被隔离一次,因为它无法干净地停止:请在它重启后再次在其上启动集群。
当隔离失败而你已将其修复后,请在一台正在运行的服务器上清除失败的尝试,让 Pacemaker 重试:pcs stonith history cleanup <server> 和 pcs resource cleanup。
更换服务器
当一台数据服务器永久丢失时,请用一台使用相同名称和地址的新服务器替换它。在此期间,Arkvory 始终在活动服务器上提供服务;新副本完整后,写入即恢复。
在新服务器上,安装相同的 Linux 发行版、DRBD、Pacemaker 和隔离代理,并像搭建集群的第 1 步那样解包相同版本的 Arkvory 软件包。对于
ha-2,还要安装corosync-qdevice。在活动服务器上,写出新服务器所需的文件:资源名、服务账户的 ID 和服务。
basharkvory cluster-kit --root /opt/proanima-arkvory --output /root/arkvory-node.kit通过安全通道把它复制到新服务器。该文件不包含机密,但它描述了集群。
在新服务器上,用该文件加入集群。它不需要卷:
basharkvory cluster-node --root /opt/proanima-arkvory --kit /root/arkvory-node.kit dpkg --configure proanima-arkvory # 仅限 .deb从另一台数据服务器复制
/etc/drbd.d/arkvory.res,然后创建元数据并启动资源。新副本开始从活动服务器填充:bashdrbdadm create-md arkvory drbdadm up arkvory更换集群成员:在活动服务器上运行
pcs host auth <server>、pcs cluster node remove <server>,然后运行pcs cluster node add <server> addr=<address> --start。如果新服务器响应相同的设备设置,该服务器的隔离设备会保留其配置;否则请用pcs stonith update更新它。在控制台的 集群 或通过
arkvory cluster-status观察:在副本完整之前,该服务器显示 正在追赶。之后写入会自动恢复。用
arkvory cluster-fence-test --node <server> --yes验证新服务器的隔离设备,并运行arkvory cluster-check。
单副本
当某台数据服务器长时间缺席(例如更换磁盘),并且停止写入的代价超过风险时,操作员可以在有限时间内接受只有一份副本的写入:
arkvory cluster-single-copy --root /opt/proanima-arkvory --until 2026-10-12T18:00:00Z --reason "disk replacement on node-b"- 时间必须在未来 7 天以内,并带有时区:
Z表示 UTC,或使用+03:00这样的偏移量。没有时区时命令会拒绝执行,因为活动服务器会按其本地时间解读该时间。该命令仅在缺少副本时才有效。 - 决定生效期间,如果活动服务器丢失,此后已确认的写入也会随之丢失。
- 控制台横幅、指标
arkvory_replication_required_copies和告警ArkvorySingleCopyWrites会显示该决定。 - 它会在到期时间结束,也可用
--off结束,或在每份副本再次完整时自动结束。之后若再出现丢失,写入会再次停止。
监控
在写入停止期间,活动服务器上的 GET /health/ready 仍返回 200,因此监控不会移动健康的服务器。其字段 writable 为 false,字段 replication 显示 copies、required 和 singleCopyUntil;无法读取副本时,replication 为 null。对管理员,它还包含 node(作出响应的服务器)、profile 和 peers(其他服务器及其连接和副本),控制台页面显示的正是这些信息。独立服务器没有 replication 字段。
| 指标 | 含义 |
|---|---|
arkvory_replication_copies | 最近一次检查时的完整副本数 |
arkvory_replication_required_copies | 一次写入所需的副本数:2,单副本决定期间为 1 |
arkvory_replication_writes_refused_total | 以 503 replication_degraded 响应的写入数 |
arkvory_replication_check_failures_total | 读取副本状态失败的次数 |
deploy/monitoring/arkvory-alerts.yml 中的告警规则包括 ArkvoryReplicationDegraded、ArkvorySingleCopyWrites 和 ArkvoryReplicationCheckFailing。也请监控集群本身:定期运行 arkvory cluster-check 并根据其退出码告警,或使用你的 Pacemaker 安装自带的监控。参见监控。
备份
备份代理只在活动服务器上运行,作为组的一部分。请把备份存储放在集群卷之外,例如放在 NAS 上。参见备份。