<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ha on rHomelab</title><link>https://rhomelab.com/tags/ha/</link><description>Recent content in Ha on rHomelab</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Thu, 29 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rhomelab.com/tags/ha/index.xml" rel="self" type="application/rss+xml"/><item><title>Proxmox Storage Replication: Near-HA Without Ceph or Shared Storage</title><link>https://rhomelab.com/proxmox/proxmox-storage-replication-near-ha-without-ceph/</link><pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate><guid>https://rhomelab.com/proxmox/proxmox-storage-replication-near-ha-without-ceph/</guid><description>How Proxmox&amp;#39;s built-in storage replication (pvesr) uses ZFS send/receive to give a small homelab cluster automatic failover without Ceph, a SAN, or any shared storage at all.</description><content:encoded><![CDATA[<p>The clustering article on this site already made the point that shared or replicated storage is the real gate on HA failover, not quorum. What it didn&rsquo;t do is explain the replication half of that sentence, because it&rsquo;s a separate feature with its own setup, its own limits, and its own failure modes. If you&rsquo;re running a two or three node homelab cluster without Ceph and without a NAS acting as shared storage over NFS or iSCSI, Proxmox&rsquo;s built-in storage replication is very likely the tool that gets you automatic failover anyway, and it&rsquo;s worth understanding on its own rather than as a footnote to HA.</p>
<h2 id="what-it-actually-is">What it actually is</h2>
<p>Storage replication, usually just called <code>pvesr</code> after the CLI tool and systemd timer behind it, periodically copies a guest&rsquo;s disk from one node to another using <code>zfs send</code> and <code>zfs receive</code> under the hood. It is not a general-purpose backup, and it is not Ceph. It&rsquo;s narrower than both: a scheduled, incremental, ZFS-to-ZFS copy of a specific guest&rsquo;s disk onto a specific other node in the same cluster, kept close enough to current that HA can start that guest on the target node if the source node disappears.</p>
<p>Because it rides on ZFS send/receive, the mechanics are the same ones covered in the ZFS send/receive article on this site, just wired into Proxmox&rsquo;s own scheduler and HA stack instead of something you run by hand or glue together with sanoid/syncoid. The first replication run is a full send of the dataset; every run after that is an incremental send of only the blocks that changed since the last successful sync, which is why replication stays cheap even on guests with large disks, as long as the actual write rate between syncs is modest.</p>
<h2 id="what-it-requires">What it requires</h2>
<p>This only works if the requirements line up, and homelabs trip on these more often than the feature itself:</p>
<ul>
<li><strong>Both the source and target node need ZFS-backed storage</strong>, and the storage ID has to exist with the same name on both nodes. Proxmox validates the job against that name, not against the underlying pool layout, so a storage named <code>local-zfs</code> on one node has to be named <code>local-zfs</code> on the other too, even if the actual pools underneath differ in size or layout.</li>
<li><strong>The guest&rsquo;s disk has to actually live on that ZFS storage.</strong> A VM with its disk on <code>local-lvm</code> or a directory-backed store can&rsquo;t be replicated this way at all; LVM-thin and plain directory storage have no send/receive equivalent Proxmox can drive. If a guest you want covered is sitting on the wrong storage type, you move the disk to a ZFS-backed store first (<code>qm move-disk</code> for VMs, <code>pct move-volume</code> for containers), then set up the replication job.</li>
<li><strong>Both nodes have to be in the same cluster.</strong> Replication is a cluster-aware feature, not a point-to-point tool you can aim at an arbitrary remote host the way a manual <code>zfs send | ssh ... zfs receive</code> pipeline can.</li>
<li><strong>LXC containers are covered the same way as VMs</strong>, since a container&rsquo;s root filesystem on ZFS storage is just another dataset Proxmox can snapshot and send, not a special case.</li>
</ul>
<h2 id="setting-up-a-job">Setting up a job</h2>
<p>From the GUI, it&rsquo;s attached to the guest, not the storage: open the VM or container, go to Replication, and add a job specifying the target node and a schedule. The schedule uses the same cron-like syntax as Proxmox&rsquo;s backup jobs, and a short interval (commonly set to every few minutes to every fifteen minutes, depending on how much data loss is acceptable) is typical for anything HA is meant to fail over automatically. The CLI equivalent is <code>pvesr create-local-job</code>, useful for scripting this across a fleet of guests instead of clicking through each one.</p>
<p>Once the job exists, Proxmox snapshots the source dataset, sends it (full the first time, incremental after), and tracks the last successfully replicated snapshot on both ends so the next run knows exactly where to resume the incremental chain from.</p>
<h2 id="how-this-plugs-into-ha">How this plugs into HA</h2>
<p>HA failover for a guest with no shared storage works by having Proxmox start that guest on the replication target node using the most recently replicated snapshot, if the source node is confirmed down by the cluster&rsquo;s fencing and quorum mechanics. That&rsquo;s the entire trick, and it&rsquo;s also the entire limitation: the guest comes back up from whatever state existed at the last successful replication, not the actual moment the node died. Anything written between the last sync and the failure is gone. This is a real, bounded Recovery Point Objective measured in however long your replication interval is, not the zero-RPO guarantee Ceph or a real shared SAN gives you, and it&rsquo;s worth being explicit with yourself about that gap before leaning on it for anything where losing the last few minutes of writes would actually hurt (a database, anything transactional), versus something where it plainly wouldn&rsquo;t (a reverse proxy, most stateless services, a media server whose state is mostly read-only).</p>
<h2 id="the-gotchas-worth-knowing-before-you-hit-them">The gotchas worth knowing before you hit them</h2>
<p><strong>A manual snapshot outside the replication job can break the incremental chain.</strong> <code>pvesr</code> tracks a specific snapshot lineage to compute each incremental send. If something else deletes or renames the snapshot it&rsquo;s expecting, the next replication run can&rsquo;t find a common point to diff against and falls back to a full resync, which on a large disk means a slow, bandwidth-heavy re-copy instead of a quick incremental one. Leave the snapshots pvesr creates alone, and if you&rsquo;re also running your own ZFS snapshot schedule on the same dataset for other reasons, be deliberate about not deleting the ones with the replication job&rsquo;s naming pattern.</p>
<p><strong>Changing a job&rsquo;s target node forces a full resync, not an incremental move.</strong> The new target has no prior snapshot to diff against, so switching where a guest replicates to means paying the full-send cost again, scaled to however big that disk actually is. Plan replication topology with that cost in mind rather than shuffling targets casually.</p>
<p><strong>A failed replication run doesn&rsquo;t fail loudly on its own.</strong> A transient network blip or a target node that&rsquo;s briefly unreachable just means that cycle&rsquo;s sync didn&rsquo;t happen; the job retries on its next scheduled run. The risk isn&rsquo;t a single missed cycle, it&rsquo;s a replication job that&rsquo;s been silently failing for a while, during which the RPO gap just keeps growing without anyone noticing. Check the Replication tab in the GUI (it shows last-run status per job) or <code>journalctl</code> for <code>pvesr</code> periodically, the same way you&rsquo;d want to notice a failed backup job rather than assume it&rsquo;s fine.</p>
<p><strong>Failover with replication is crash-consistent, not graceful.</strong> The guest that comes up on the target node is in the state a dataset-level snapshot captured it in, which is roughly equivalent to yanking the power on that VM at the last sync point. Most modern filesystems and databases handle that correctly on their own recovery path, but it&rsquo;s a meaningfully different guarantee than a clean live migration, and it&rsquo;s worth knowing which one you&rsquo;re actually getting before you need it.</p>
<h2 id="when-this-is-the-right-tool-and-when-it-isnt">When this is the right tool, and when it isn&rsquo;t</h2>
<p>Storage replication earns its keep in the common small-cluster homelab shape: two or three nodes, ZFS already the storage backend of choice (which it usually already is, for the same reasons covered in the ZFS pool layout article), a handful of guests worth protecting automatically, and an RPO of a few minutes being genuinely acceptable for those guests. It gets you real automatic failover without standing up Ceph&rsquo;s OSD/MON/MGR stack and its own hardware and network overhead, and without a NAS serving shared storage over NFS or iSCSI.</p>
<p>It&rsquo;s the wrong tool if you need zero data loss on failover, since no replication-interval-based scheme gives you that, Ceph or a real shared SAN is the honest answer there. It&rsquo;s also not a replacement for actual backups; a replicated disk that gets corrupted or has something deleted from it replicates that corruption or deletion to the target just as faithfully, on schedule, with no independent history to roll back to unless you&rsquo;re separately keeping Proxmox Backup Server snapshots as well. And if every guest you care about is already sitting on LVM-thin or directory storage for reasons that make sense for your setup, converting just to unlock replication is a real migration project, not a config toggle, so weigh that cost against just accepting manual recovery for the guests that would need it.</p>
<h2 id="bottom-line">Bottom line</h2>
<p>Proxmox&rsquo;s storage replication feature is the practical middle ground between &ldquo;no failover plan at all&rdquo; and &ldquo;stand up Ceph,&rdquo; and it&rsquo;s already built into a cluster you likely have running today if you&rsquo;re on ZFS storage. It buys real automatic HA failover at the cost of a bounded, interval-sized RPO and a few operational habits (don&rsquo;t touch its snapshots, expect a full resync after changing targets, watch for silently failing jobs) that are easy to live with once you know they exist. For the two or three node ZFS-based homelab cluster this site keeps assuming as the default shape, it&rsquo;s very often the right amount of complexity for the problem it solves.</p>
]]></content:encoded></item></channel></rss>