End-to-end implementation guide for a 3-node Proxmox HA cluster with Ceph distributed storage, LACP-bonded live migration, centralized backups, and automatic VM failover.
A complete 3-node Proxmox VE High Availability cluster with replicated Ceph storage, LACP-bonded migration network, centralized PBS backups, and PDM multi-cluster management — designed for maximum redundancy, fast live migration, and automatic VM failover with zero manual intervention on node failure.
Six capabilities a production HA cluster gives you that a single Proxmox host cannot:
A live view of the running cluster. Watch the heartbeat pulse across the Corosync ring, data replicate down into Ceph, backups flow to PBS — and VM 100 stay continuously available as it migrates across nodes.
| Component | Technology | Purpose |
|---|---|---|
| Cluster Engine | Corosync | Cluster quorum, heartbeat, node communication |
| Distributed Storage | Ceph RADOS | Replicated block storage for HA-protected VMs |
| Backup Infrastructure | PBS | Centralised VM backup and restore across all nodes |
| Datacenter Management | PDM | Single-pane-of-glass for the entire cluster |
| Migration Fabric | LACP Bond | High-bandwidth 4× NIC bond for live VM migration |
| High Availability | PVE HA Manager | Automatic VM restart and relocation on node failure |
| Node | Management IP | Corosync IP | Migration IP | Role |
|---|---|---|---|---|
| pve01 (Node 1) | 192.168.10.11/24 | 192.168.20.11/24 | 192.168.30.11/24 | Primary |
| pve02 (Node 2) | 192.168.10.12/24 | 192.168.20.12/24 | 192.168.30.12/24 | Secondary |
| pve03 (Node 3) | 192.168.10.13/24 | 192.168.20.13/24 | 192.168.30.13/24 | Secondary |
| Plane | Subnet | Interface | Purpose |
|---|---|---|---|
| Management | 192.168.10.0/24 | vmbr0 / eth0 | Web UI, SSH, API, IPMI |
| Corosync Heartbeat | 192.168.20.0/24 | eth5 (dedicated) | Cluster quorum and heartbeat only |
| Live VM Migration | 192.168.30.0/24 | bond0 (4× NICs) | LACP bonded migration fabric |
| Storage | Type | Disk | Usage |
|---|---|---|---|
local-lvm | LVM-Thin | sda | OS, local non-HA VMs |
VM-Disk | Ceph RBD | sdb (all nodes) | HA-protected VMs — replicated 3 ways |
PBS | PBS Repository | Dedicated PBS host | Centralised backup for all VMs |
Before building the cluster, each node must be correctly named and have full hostname resolution between all peers. Proxmox identifies cluster members by hostname, not by IP address.
Execute on each node individually via SSH or the Proxmox console.
hostnamectl set-hostname pve01
hostname
# Expected output: pve01
hostnamectl set-hostname pve02 # on Node 2
hostnamectl set-hostname pve03 # on Node 3
hostname
Every node must resolve every peer by name. This must be applied on all three nodes.
127.0.0.1 localhost
192.168.10.11 pve01.cluster.local pve01
192.168.10.12 pve02.cluster.local pve02
192.168.10.13 pve03.cluster.local pve03
# From pve01
ping -c 3 pve02
ping -c 3 pve03
# From pve02
ping -c 3 pve01
ping -c 3 pve03
# From pve03
ping -c 3 pve01
ping -c 3 pve02
apt update && apt full-upgrade -y
reboot
Two dedicated network planes are configured: a 4-NIC LACP bond for VM live migration (high bandwidth), and a dedicated Corosync interface (low-latency, isolated heartbeat).
# List all interfaces
ip -o link show | awk '{print $2, $9}'
# Alternative
ls /sys/class/net/
The bond aggregates 4 physical NICs via IEEE 802.3ad for maximum migration bandwidth.
| Field | Value |
|---|---|
| Name | bond0 |
| Slaves / Members | eth1 eth2 eth3 eth4 (4 migration NICs) |
| Mode | LACP (802.3ad) |
| Hash Policy | layer2+3 |
| IPv4/CIDR | (leave blank — bond is enslaved to a bridge) |
| Comment | Migration Bond — 4× NIC LACP |
auto lo
iface lo inet loopback
# Management Interface
auto eth0
iface eth0 inet static
address 192.168.10.11/24
gateway 192.168.10.1
# Corosync Heartbeat — dedicated NIC, no gateway
auto eth5
iface eth5 inet static
address 192.168.20.11/24
# Migration Bond — 4 NICs in LACP
auto bond0
iface bond0 inet manual
bond-slaves eth1 eth2 eth3 eth4
bond-miimon 100
bond-mode 802.3ad
bond-xmit-hash-policy layer2+3
bond-lacp-rate fast
# Migration Bridge over bond0
auto vmbr1
iface vmbr1 inet static
address 192.168.30.11/24
bridge-ports bond0
bridge-stp off
bridge-fd 0
For pve02 / pve03: use the same structure, replacing host octets with .12 and .13 on each subnet.
# Apply network changes without rebooting
ifreload -a
# Verify bond is active and all slaves are up
cat /proc/net/bonding/bond0
# Verify all interfaces are up with correct IPs
ip addr show
# Test migration network connectivity (from pve01)
ping -c 3 192.168.30.12 # pve02 migration IP
ping -c 3 192.168.30.13 # pve03 migration IP
# Test Corosync network connectivity (from pve01)
ping -c 3 192.168.20.12
ping -c 3 192.168.20.13
The cluster is created on pve01; pve02 and pve03 join it. Corosync runs over the isolated 192.168.20.0/24 heartbeat network.
pvecm create proxmox-ha-cluster --ring0_addr 192.168.20.11
pvecm status
On pve01: Datacenter → Cluster → Join Information → Copy Information. Or via CLI: pvecm info
pvecm add 192.168.10.11 \
--ring0_addr 192.168.20.12 \
--use_ssh
Repeat with pve03 — peer 192.168.10.11, Ring 0 192.168.20.13.
pvecm status
# Expected:
# Name: proxmox-ha-cluster
# Nodes: 3
# Quorum: 2 (quorate)
# Nodeid Votes Name
# 1 1 pve01 (local)
# 2 1 pve02
# 3 1 pve03
secure192.168.30.0/24All live VM migrations now traverse the bonded high-bandwidth network — not the management interface.
PBS provides centralised, deduplicated backup storage for all VMs across the cluster. Install on a dedicated host (physical or VM) — never on cluster nodes themselves.
# Add PBS repository
echo 'deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription' \
> /etc/apt/sources.list.d/pbs.list
# Add Proxmox GPG key
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg \
-O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
# Install & start
apt update && apt install -y proxmox-backup-server
systemctl enable --now proxmox-backup
In PBS UI (https://<pbs-host>:8007): Administration → Datastores → Add Datastore
| Field | Value |
|---|---|
| Name | vm-backups |
| Backing Path | /mnt/backup-store |
| GC Schedule | daily |
| Prune Schedule | daily |
# Create dedicated backup user
proxmox-backup-manager user create backup-user@pbs \
--password 'StrongPassword123!'
# Grant datastore permissions
proxmox-backup-manager acl update /datastore/vm-backups \
--auth-id 'backup-user@pbs' \
--role DatastoreBackup
# Generate API token (save the output — won't be shown again)
proxmox-backup-manager user generate-token backup-user@pbs cluster-token
In Proxmox UI: Datacenter → Storage → Add → Proxmox Backup Server. Fill in PBS host IP, backup-user@pbs, the API token, datastore vm-backups, and the fingerprint from PBS Dashboard.
Datacenter → Backup → Add — daily at 02:00, mode snapshot, compression zstd, target PBS.
Ceph provides the replicated block storage (RBD) that makes true VM HA possible. With replication factor 3, every VM disk is written simultaneously to all three nodes — if any node fails, the VM restarts on a survivor with its local copy.
# Verify sdb is the correct disk — CHECK CAREFULLY
lsblk
# Wipe all signatures, partitions, filesystem headers
wipefs -af /dev/sdb
sgdisk --zap-all /dev/sdb
# Zero the first 100MB to clear any LVM/RAID metadata
dd if=/dev/zero of=/dev/sdb bs=1M count=100 status=progress
# Confirm disk is clean
lsblk /dev/sdb
# Expected: sdb [no children, no filesystem]
Via Web UI on each node: Node → Ceph → Install Ceph → choose Reef (latest stable) → Start Installation.
pveceph install --repository no-subscription
ceph --version
pveceph init --network 192.168.10.0/24
# The network here defines where Ceph public traffic goes.
# For a dedicated Ceph network, use your storage network instead.
Monitors maintain the cluster map and quorum — you need at least 3 for fault tolerance.
pveceph mon create # on pve01, pve02, and pve03
# Verify
ceph mon stat
# Expected: e3: 3 mons at {...}, quorum 0,1,2
pveceph mgr create # on each node
ceph mgr stat
One OSD per node, using the dedicated sdb disk.
pveceph osd create /dev/sdb # on each node
# Verify all 3 OSDs are up and in
ceph osd stat
# Expected: 3 osds: 3 up, 3 in
ceph health
# Expected: HEALTH_OK
ceph status
VM-Disk3 (one copy per node)2 (pool accepts writes if 2/3 OSDs are up)onpveceph pool create VM-Disk --size 3 --min_size 2 --pg_autoscale_mode on
pvesm add rbd VM-Disk --pool VM-Disk --content images --krbd 0
ceph osd pool ls
ceph osd pool stats VM-Disk
ceph health detail
ceph status
# Expected:
# cluster: HEALTH_OK
# services: mon: 3 daemons, quorum pve01,pve02,pve03
# mgr: pve01(active), pve02, pve03
# osd: 3 osds: 3 up, 3 in
# data: pools: 1 pools, N pgs · pgs: N active+clean
PDM provides a unified single-pane-of-glass over multiple Proxmox clusters, PBS instances, and remote sites. It doesn't replace the per-cluster UI — it sits above it.
echo 'deb http://download.proxmox.com/debian/pdm bookworm pdm-no-subscription' \
> /etc/apt/sources.list.d/pdm.list
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg \
-O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
apt update && apt install -y proxmox-datacenter-manager
systemctl enable --now proxmox-datacenter-manager
systemctl status proxmox-datacenter-manager
PDM listens on port 8443: https://<pdm-host>:8443 — default user admin@pdc.
proxmox-ha-cluster192.168.10.11 (pve01 management IP)8006root@pamPDM connects to pve01 and enumerates all cluster nodes automatically.
Remote → Add → Proxmox Backup Server — once added, PDM displays backup status across the entire datacenter in a single view.
| Feature | Description |
|---|---|
| Cluster Overview | Dashboard of all nodes, VMs, and health across every cluster |
| Cross-Cluster Migration | Migrate VMs between different Proxmox clusters |
| Backup Status | Unified view of all backup jobs and last status across all nodes |
| Resource Usage | Aggregate CPU, memory, storage usage across the entire datacenter |
| Remote Management | Manage multiple Proxmox clusters from one interface |
With cluster + Ceph running, HA can now be configured. Proxmox HA monitors VMs and restarts them on a surviving node within seconds of host failure. Only VMs on shared storage (the Ceph VM-Disk pool) can be HA-protected.
| Component | Role |
|---|---|
| CRM (Cluster Resource Manager) | Decides where resources run and coordinates failover decisions |
| LRM (Local Resource Manager) | Runs on each node, executes start/stop/migrate commands locally |
systemctl status pve-ha-crm
systemctl status pve-ha-lrm
ha-manager status
HA Groups define which nodes a VM can run on, and the failover priority.
production-hapve01:3, pve02:2, pve03:1 (priority:score)No · No Failback: NoHigher score = preferred host. pve01 is primary; pve02 the natural failover target; pve03 is last resort.
100production-hastarted3 · Max Relocate: 3ha-manager add vm:100 --group production-ha --state started
ha-manager status
ha-manager resources
| State | Meaning |
|---|---|
started | VM should be running — HA keeps it running on any available node |
stopped | VM should be stopped — HA won't start it automatically |
disabled | HA management temporarily disabled for this VM |
ignored | HA completely ignores this VM |
Before declaring the cluster production-ready, every subsystem is validated through controlled testing.
pvecm status
pvecm nodes
corosync-cfgtool -s
# Expected ring output (Link ID 0 udp):
# nodeid: 2: connected
# nodeid: 3: connected
ceph status
ceph osd tree
ceph osd pool stats VM-Disk
# I/O benchmarks
rados bench -p VM-Disk 10 write --no-cleanup
rados bench -p VM-Disk 10 seq
rados bench -p VM-Disk 10 rand
# Clean up
rados -p VM-Disk cleanup
# Start a test VM on pve01 (VM ID 100 on the VM-Disk pool)
qm start 100
# Live migrate to pve02
qm migrate 100 pve02 --online 1
qm status 100
# Migrate back
qm migrate 100 pve01 --online 1
# 1. Ensure test VM 100 is running on pve01
ha-manager status
# 2. Monitor HA events from pve02
journalctl -u pve-ha-crm -f
# 3. Simulate failure (hard poweroff)
# Press the power button, or via IPMI:
# ipmitool chassis power off
# OR less destructive — isolate Corosync only:
iptables -A INPUT -p udp --dport 5405 -j DROP
iptables -A OUTPUT -p udp --dport 5405 -j DROP
# 4. Within ~60 seconds: pve01 is detected down; VM 100 restarts on pve02 or pve03
# 5. Verify on surviving node
qm status 100
# 6. Restore pve01 and verify rejoin
pvecm status
# Remove iptables rules if used
iptables -D INPUT -p udp --dport 5405 -j DROP
iptables -D OUTPUT -p udp --dport 5405 -j DROP
# Trigger manual backup of VM 100 to PBS
vzdump 100 --storage PBS --mode snapshot --compress zstd
# List backups
proxmox-backup-client list
# Restore from PBS to a different VM ID (non-destructive)
qmrestore PBS:backup/vzdump-qemu-100-<timestamp>.vma.zst 999 \
--storage VM-Disk
# Verify
qm start 999
qm status 999
# Clean up
qm destroy 999
Cause: the node being joined has existing VMs/containers.
qm list
pct list
ls /etc/pve/qemu-server/
ls /etc/pve/lxc/
# Backup configs
mkdir -p /root/vm-config-backup
cp /etc/pve/qemu-server/*.conf /root/vm-config-backup/ 2>/dev/null
cp /etc/pve/lxc/*.conf /root/vm-config-backup/ 2>/dev/null
# Remove to allow join
rm -f /etc/pve/qemu-server/*.conf
rm -f /etc/pve/lxc/*.conf
# Retry join, then restore configs
cp /root/vm-config-backup/*.conf /etc/pve/qemu-server/
# Temporarily allow cluster operation with 1 node (split-brain risk)
pvecm expected 1
corosync-quorumtool -s
corosync-cfgtool -s
systemctl restart corosync # caution in production
journalctl -u corosync -n 100
ceph health detail
ceph pg stat
ceph osd tree | grep -i down
systemctl status ceph-osd@<OSD_ID>
systemctl start ceph-osd@<OSD_ID>
ceph df
ceph osd df
# Emergency only — temporarily raise full ratio
ceph osd set-nearfull-ratio 0.90
ceph osd set-full-ratio 0.95
ha-manager status
journalctl -u pve-ha-crm -n 50
journalctl -u pve-ha-lrm -n 50
# CRITICAL: verify VM disk is on shared Ceph storage
qm config <VMID> | grep scsi
# Must show VM-Disk: prefix, NOT local-lvm:
# Check bond status — all 4 slaves should be active
cat /proc/net/bonding/bond0
# Test migration bandwidth with iperf3
# On pve02 (receiver)
iperf3 -s -B 192.168.30.12
# On pve01 (sender)
iperf3 -c 192.168.30.12 -P 4 -t 30
# Confirm migration is using the right network
cat /etc/pve/datacenter.cfg | grep migration
| File / Path | Purpose |
|---|---|
/etc/pve/corosync.conf | Corosync cluster config — ring addresses, quorum |
/etc/network/interfaces | Network interface config including bond and bridges |
/etc/pve/datacenter.cfg | Datacenter-wide settings including migration network |
/etc/pve/ha/resources.cfg | HA resource definitions (VMs registered for HA) |
/etc/pve/ha/groups.cfg | HA group definitions and node priorities |
/etc/pve/qemu-server/<ID>.conf | Individual VM configuration files |
/etc/pve/storage.cfg | Storage definitions (PBS, Ceph, local-lvm) |
/etc/ceph/ceph.conf | Ceph cluster configuration |
| Command | Description |
|---|---|
pvecm status | Show cluster status, quorum, and node list |
pvecm nodes | List all nodes in the cluster |
ha-manager status | Show HA resource status and which node each runs on |
ha-manager resources | List all registered HA resources |
ceph status | Full Ceph cluster health and statistics |
ceph osd tree | OSD topology and status |
qm list | List all VMs on the current node |
qm migrate <ID> <NODE> --online 1 | Live migrate VM to another node |
pct list | List all LXC containers on the current node |
pvesm status | Show status of all configured storage |
| Term | Definition |
|---|---|
| Corosync | Open-source cluster messaging layer used by Proxmox for heartbeat and quorum |
| Quorum | Minimum votes for the cluster to operate — with 3 nodes, quorum requires 2 |
| Ceph | Distributed storage system providing replicated block (RBD), object, and file storage |
| OSD | Object Storage Daemon — the Ceph process that manages a single disk |
| RBD | RADOS Block Device — Ceph block storage format used for VM disks |
| LACP | Link Aggregation Control Protocol (IEEE 802.3ad) — bonds NICs for bandwidth + redundancy |
| CRM | Cluster Resource Manager — decides where HA VMs run |
| LRM | Local Resource Manager — runs on each node, executes HA commands locally |
| PBS | Proxmox Backup Server — dedicated backup solution for Proxmox VE |
| PDM | Proxmox Datacenter Manager — multi-cluster management interface |
You now have a production-ready Proxmox VE High Availability cluster: three nodes sharing replicated Ceph storage, LACP-bonded live migration, centralized PBS backups, and PDM oversight — with verified automatic failover under simulated node loss. Bump component versions periodically and re-run Phase 8 validation to keep the cluster healthy.