使用 SafeKit 实现 KVM 高可用性:安装 kvm.safe 模块以实现故障转移
KVM 高可用性快速安装指南
本指南介绍如何使用 SafeKit 为 KVM 设置 mirror 集群,确保自动故障转移和同步复制,而无需共享存储。
如需帮助,您可以使用SafeKit AI 🤖。
1. 概述
- 架构: 采用双节点系统(主/备)。
- 数据保护: 实现实时同步复制,实现零数据丢失(RPO = 0)。
2. 安装
- 软件: 在两台服务器上安装 SafeKit 引擎。
- 模块: 下载预配置的
kvm.safe应用程序模块。
3. 配置
- Web 控制台: 配置包含 KVM 文件的特定文件夹。
- 监控: 开始监控和保护 KVM 应用程序。
SafeKit 高可用性限制
| 限制/要求 | 原因与影响 | 推荐替代方案 |
|---|---|---|
| 复制大小:几 TB | 故障后的重新同步时间(步骤 3): • 1 Gb/s 网络 ≈ 3 小时/TB • 10 Gb/s 网络 ≈ 1 小时/TB(取决于磁盘写入性能) | • 使用外部共享存储(更昂贵,更复杂)。 |
| 文件数量:< 1,000,000 个文件 | • 故障后的重新同步时间性能(步骤 3)。 • 比较两个节点之间每个文件所需的时间。 | • 将要复制的许多文件放入虚拟硬盘/虚拟机中。 • 在这种情况下,只有代表虚拟硬盘/虚拟机的那些文件会被复制和重新同步。 |
| 故障转移容量:≤ 32 台虚拟机 | • 每个虚拟机都在独立的 mirror 模块中运行。 • 同一集群中最多可运行 32 个 mirror 模块。 | • 使用外部共享存储和另一个虚拟机集群解决方案(更昂贵,更复杂)。 |
| 网络架构:远程站点之间的局域网/虚拟局域网 | • 虚拟 IP 地址在同一子网中的 2 个节点之间自动故障转移。 • 良好的带宽,用于重新同步(步骤 3)。 • 同步复制的低延迟:通常 < 5 毫秒 RTT;应根据应用程序的写入速率验证较高值。 | • 如果两个节点位于不同的子网中(云中常见),请使用其他重新路由选项:负载均衡器、云提供商 CLI、BGP 或 DNS 重定向。 • 对于高延迟网络,请使用具有异步复制的备份解决方案。 |
SafeKit/KVM 解决方案概述
解决方案在此处介绍:💡 无共享存储的简单 Linux KVM 高可用性
在 Linux 上安装 SafeKit/KVM 解决方案 (kvm.safe)
先决条件
- KVM 安装在 2 个 Linux 节点上。
- 安装在一个或多个虚拟机中的关键应用程序。
- 每个 KVM 主机最多可运行 32 台虚拟机。
- 复制数据的总量限制在几 TB 以内,超出此范围,重新同步所需的时间将变得非常长。
- 节点之间的最小互连速度为 1Gb/s(建议使用 10Gb/s 以实现更快的重新同步)。
- IP 故障转移要求两个节点位于同一 LAN 或扩展 LAN (L2) 上 — 不支持路由 L3 网络(🛠️ 云负载均衡器除外)。
在 Linux 上安装软件包
- 在 2 个 Linux 节点上安装免费版 SafeKit。注意:免费试用版包含所有 SafeKit 功能。试用期结束后,您无需卸载软件包即可激活永久许可证密钥。
- 下载 safekit_xx.bin 包后,运行该包以提取 rpm 和 safekitinstall 脚本,然后运行 safekitinstall 脚本
- 回答 “是” 以启用防火墙自动配置
- 为 Web 控制台和默认用户 admin 设置密码。在所有节点上设置相同的密码。
在 Linux 上安装模块
- 下载 kvm.safe 模块。
该模块是免费的。它包含 userconfig.xml 文件和重启脚本。 - 将 kvm.safe 放在 /opt/safekit/Application_Modules/generic/ 目录下。
SafeKit/KVM 解决方案的分步配置
⚠️ KVM 配置以名为 VM1 的虚拟机形式呈现,其中包含在发生故障时需要重新启动的应用程序。
⚠️ 您必须对所有要复制和重新启动的虚拟机重复此配置。
1. 先决条件
VM1 虚拟机镜像位于文件 /var/lib/libvirt/images/vm1.qcow2 中。在配置 SafeKit 之前,您必须执行以下配置,将虚拟机放置在 SafeKit 将复制的 vm1 特定目录中。
在节点 1 上:
停止 vm1:
virsh shutdown vm1创建
vm1/目录:mkdir -p /var/lib/libvirt/images/vm1/将 vm1 镜像复制到新位置:
cp -a /var/lib/libvirt/images/vm1.qcow2 /var/lib/libvirt/images/vm1/
一旦新位置的测试成功,即可删除原始 vm1 镜像。
编辑 vm1 配置文件:
EDITOR=vi virsh edit vm1
并更改该行:
<source file='/var/lib/libvirt/images/vm1.qcow2'>
作者:
<source file='/var/lib/libvirt/images/vm1/vm1.qcow2'>
在同一文件中将缓存选项设置为“无”,以防崩溃时数据完整性受损:
<disk type='file' device='disk'> <driver name='qemu' type='qcow2' **cache='none'** />关闭 vm1 配置文件
禁用vm1 自动启动:
virsh autostart vm1 --disable为 vm1 创建
vm1.xml配置文件:virsh dumpxml vm1 > vm1.xml
在节点 2 上:
从节点 1 复制
vm1.xml配置文件。注意:每当在节点 1 上更改 vm1 配置时,您必须在节点 2 上重新应用新配置。创建 vm1,但不要启动它:
virsh define vm1.xml禁用 vm1 自动启动:
virsh autostart vm1 --disable创建图像位置的目录:
mkdir -p /var/lib/libvirt/images/vm1/
2. 启动 SafeKit 控制台
- 在某个集群节点上,通过连接到
http://localhost:9010在浏览器中启动 Web 控制台。 - 输入用户名
admin和安装过程中定义的密码。
您也可以在集群外部工作站的浏览器中运行控制台。
⚠️ SafeKit 的配置通过单个浏览器在两个节点上完成。
ℹ️ 要保护 Web 控制台,请参阅用户指南中的 🛠️ 11. 保护 SafeKit Web 服务。

3. 配置节点地址
- 输入节点 IP 地址,按
Tab key检查连接性并填写节点名称。如果 node1 或 node2 为红色,请检查浏览器与这两个节点的连接性,并检查这两个节点的防火墙以进行 🛠️ 故障排除。 - 然后,单击
Save and apply以保存配置。 - 检查两个节点上的
Success✅ 消息。 - 如果某个节点上发生配置
Failure❌,请打开该节点的▼手风琴,然后查看消息。请注意,您可以使用 SafeKit AI 🤖 寻求帮助。
ℹ️ 如果您愿意,可以添加新的 LAN and nodes(首先 ➕),以创建第二个心跳和专用复制网络。
ℹ️ 如果您单击 Advanced configuration,则会显示 cluster.xml 文件。此文件由控制台自动填充并部署到节点上。

4. 选择模块
- 在
New module中,单击kvm.safe”模块。
ℹ️ 在顶部的蓝色横幅中,🛜 node1 代表控制台连接节点。此节点在需要时将请求中继到 node2。
ℹ️ 如果您在安装期间将模块放置在连接节点(node1)上的 Application_Modules/generic/ 目录中,则控制台会在该目录中搜索 xxx.safe

5. 配置模块
- 选择在启动时
Automatic启动模块,无需延迟。 - 通常,您有一个用于进行复制的单一
Heartbeat网络。但是,如有必要,您可以定义一个专用网络(在步骤 3 中添加一个 LAN)。 - 在
VM_PATH中,输入复制目录的根路径(/var/lib/libvirt/images)。 - 输入
VM_NAME,即虚拟机的名称 (vm1)。
我们假设 VM1 文件位于 /var/lib/libvirt/images/vm1/(请参阅先决条件)。将实时复制此 SafeKit。
ℹ️ 无需配置虚拟 IP 地址。VM1 将在辅助 KVM 上使用其物理 IP 地址重新启动,并且此 IP 地址将被重新路由。

6. 自定义检查器以检测虚拟机故障
自定义检查器会检查虚拟机是否正在运行(使用“virsh domstate”命令)。如果虚拟机未运行,自定义检查器会自动在同一 KVM 节点或其他节点上重新启动虚拟机。
- 点击
Checkers / Custom(见图片)。 Resource name用于在 SafeKit 中识别虚拟机,其资源名称为:custom.VM_NAME_check。Actionrestart后,虚拟机将在同一 KVM 节点上重启。如果在 24 小时内重启 3 次失败,SafeKit kvm 模块将停止在主节点上运行,虚拟机将故障转移到辅助节点。- 如果您在
Action中设置了stopstart,则一旦虚拟机停止运行,另一个 KVM 节点将立即进行故障转移。
ℹ️ 如果您想在维护期间停止虚拟机,自定义检查器将自动重新启动它。为避免这种情况,您可以暂时暂停检查器 🖼️。或者,您可以通过在控制台中删除配置行来将其移除。

7. 编辑脚本(可选)
- 请勿编辑脚本。
8. 通信加密(可选)
- 保持节点间通信的加密。

9. 保存并应用
- 在两个节点上
Save and apply配置和脚本。

10. 验证配置是否成功
- 检查两个节点上的
Success✅ 消息,然后单击Monitor modules。 - 如果某个节点上发生配置
Failure❌,请打开该节点的▼手风琴,然后查看消息。请注意,您可以使用 SafeKit AI 🤖 寻求帮助。

11. 使用最新数据启动节点
- 如果节点 1 具有
vm1/的最新复制目录,请选择它,然后⋯Force start▶As primary。
当节点 2 启动时,所有数据将从节点 1 复制到节点 2。
⚠️ 如果您做出错误的选择,则有可能在两个节点上同步过时的数据。
⚠️ 还假定 VM1 在节点 1 上已停止,以便 SafeKit 安装复制机制,然后在 start_prim 脚本中启动 VM1。
⚠️ 首次启动后,请使用 Start:SafeKit 会保留最新的服务器。首次启动或在特殊操作期间,请使用“启动 As primary。

12. 等待过渡到 ALONE ”(绿色)
- 节点 1 应达到 ALONE(绿色)状态,这意味着
start_prim脚本已在节点 1 上执行。
⚠️ 如果未达到 ALONE(绿色)或未启动 VM1,请使用节点 1 的模块日志 🖼️分析原因。
- 单击
node1的 🔍日志图标,打开模块日志,查找错误消息,例如检查器检测到错误并停止模块。 - 单击日志中的
start_prim:脚本的输出消息显示在右侧,可以检测到错误,例如 VM1 启动不正确。 - 使用 SafeKit AI 🤖 获取日志消息方面的帮助。
⚠️ 如果集群处于 WAIT (red) not uptodate, STOP (red) not uptodate 状态,请停止 WAIT 节点并强制将其启动为主节点 🖼️。

13. 启动节点 2
- ⋯使用其上下文菜单
Start节点 2。 - 等待 SECOND(绿色)状态。
ℹ️
- 节点 2 在重新同步复制目录(从节点 1 复制到节点 2)时保持在 SECOND(橙色)状态。
- 这可能需要一段时间,具体取决于复制目录中要重新同步的文件大小和网络带宽。
- 要查看复制进度,请参阅节点 2 的模块日志 🖼️和复制资源 🖼️使用 SafeKit AI 🤖 协助处理日志消息。

14. 验证集群是否正常运行
- 检查集群是否为绿色/绿色,
VM1在 PRIM 节点上运行,而不是在 SECOND 节点上运行。
在此状态下,只有文件内部的更改会实时复制。

15. 测试
- 向下滚动 PRIM 节点的上下文菜单,然后单击
Stop。 - 验证 SECOND 节点上是否存在故障转移,该节点应变为 ALONE(绿色)。
- 使用 KVM 程序工具检查
VM1是否在节点 2 上运行。
⚠️ 如果 node2 未达到 ALONE(绿色)状态或 VM1 未启动,请使用节点 2 的模块日志 🖼️分析原因。
- 单击
node2的 🔍日志图标以打开模块日志,并查找错误消息,例如检测器检测到错误并停止模块。 - 单击日志中的
start_prim:脚本的输出消息显示在右侧,可以检测到错误,例如 VM1 启动不正确。 - 使用 SafeKit AI 🤖 获取日志消息方面的帮助。
⚠️
- 如果一切正常,请在 node1 上启动,这将从 node2 重新同步复制的目录。
- 如果出现问题,请停止 node2 并强制节点 1 启动为主节点 🖼️,它将使用停止时本地健康的数据重新启动。
ℹ️ 请注意,您有一个 🕒时间线 🖼️,可以帮助您了解集群中发生的情况。

16. 如有必要,请配置裂脑检查器
- 请参阅“集群中网络隔离的不同场景是什么?”,了解您是否需要配置裂脑检查器。
- 转到模块配置,然后单击
Checkers / Splitbrain”(参见图片)以编辑裂脑参数。 Save and apply新配置,以便在两个节点上重新部署(必须在两个节点上停止模块才能保存和应用)。
参数:
Resource name通过资源名称来识别见证:splitbrain.witness。您可以更改此值来识别见证。- 当节点从 PRIM 变为 ALONE 或从 SECOND 变为 ALONE 时,
Witness address是 ping 的参数。使用见证的 IP(一个可靠的元素,通常是路由器)更改此值。 - 注意:您可以使用空格分隔设置多个 IP。请注意,在网络隔离的情况下,IP 地址必须可以从一个节点访问,但不能从另一个节点访问。

17. 复制快照
包含快照 XML 文件的目录是:
/var/lib/libvirt/qemu/snapshot/%VM_NAME%
其中 VM_NAME 是虚拟机的名称 (vm1)。
注意:如果没有创建快照,请创建一个快照以生成目录(否则 SafeKit 配置将失败)。
复制方法:
在模块配置中,单击
Advanced Configuration(见图)以编辑userconfig.xml。将以下行插入 userconfig.xml 的
<rfs>部分:<replicated dir="/var/lib/libvirt/qemu/snapshot/%VM_NAME%" mode="read_only"> </replicated>Save and apply新配置,以便在两个节点上重新部署修改后的 userconfig.xml 文件(必须在两个节点上停止模块才能保存和应用)。通过 virt-manager 或命令行在 PRIM 节点上创建快照:
virsh snapshot-create-as vm1 snapshot-name
注意:使用命令行创建快照时,您必须将快照视图刷新到 virt-manager 中。
在 PRIM 节点上创建的快照在故障转移后可在节点 2 上运行,但不会列在节点 2 上。
要在节点 2 上导入快照,您必须运行以下命令:
virsh snapshot-create --redefine vm1 /var/lib/libvirt/qemu/snapshot/vm1/snapshot-name列出 vm1 所有快照的命令行是:
virsh snapshot-list vm1

18. 支持
- 如需获取支持,请为每个节点拍摄 2 个 SafeKit
Snapshots(2 个 .zip 文件)。
ℹ️ 有关支持的更多信息,请点击此处。

虚拟机级别高可用性解决方案演示
SafeKit 视频:使用 Hyper-V 进行虚拟机级集群 (5:15)
在本视频中,您将了解 SafeKit 如何在不使用 SAN 的情况下为 Hyper-V 实现高可用性。学习如何在两个节点之间配置虚拟机复制,以确保关键虚拟化工作负载的无缝故障转移。尽管此演示使用 Windows 上的 Hyper-V,但该解决方案在 Linux 上的 KVM 上也能同样运行。
章节
- 🎬 架构概述:2 个 Hyper-V 节点和 2 个虚拟机 (0:49)
- 🎬 配置集群和 hyperv.safe 模块 (1:59)
- 🎬 实时测试:虚拟机复制、迁移和崩溃时自动故障转移 (2:26)
分步实施
🔍 探索 SafeKit
查找有关 SafeKit 功能、架构、视频、文档和免费试用的信息。
| 资源 | 描述 | 链接 |
|---|---|---|
| 主要功能 | 了解 SafeKit 为何是一种简单且经济高效的高可用性解决方案。 | 探索主要功能 |
| 用例 | 了解 SafeKit 如何保持关键应用程序和基础设施的可用性。 | 探索用例 |
| 部署模型 | SafeKit 无需 SAN 或共享存储即可提供高可用性。 | 探索部署模型 |
| 高可用性策略 | 比较虚拟机的可用性与应用程序的可用性。 | 比较这两种策略 |
| 技术规格 | 查看 SafeKit 集群的技术要求和限制。 | 阅读技术规格 |
| 视频 | 观看 SafeKit 配置和自动故障转移的演示。 | 观看技术视频 |
| 架构 | 了解 SafeKit mirror 集群如何实时复制文件并处理故障转移。 | 探索 Mirror 架构 |
| 架构 | 了解 SafeKit farm 集群如何平衡网络流量并处理故障转移。 | 探索 Farm 架构 |
| 产品对比 | 将 SafeKit 与传统的高可用性集群进行比较。 | 比较解决方案 |
| 技术资源 | 查找技术文档、下载 SafeKit 并访问免费试用版。 | 访问文档和免费试用版 |
| 应用模块 | 使用预配置的 SafeKit 模块为您的应用程序设置高可用性。 | 探索应用模块 |