TWINSTOR
Tech Preview · v0.7.4 · October 2026

Two hosts.
Zero compromise.
Full HA.

Hyperconverged storage for two XCP-ng hosts. TWINSTOR turns their local disks into redundant, self-healing shared storage, with live migration, automatic VM restart, and rolling updates.

No SANNo witness nodeNo third host

Tech Preview · For lab evaluation

Meet TWINSTOR1 min 27 sec
Two servers. A site that recovers.
Animated introduction · English captions available
Open video in a new tab ↗
Measured, not estimated

The numbers from our lab

Measured on our two test pools: power cables pulled, a power strip cut, network cables cut, disks removed live.

~3 minfrom a total site power cut to all VMs running again, zero human intervention
0dropped pings on the survivor when the other host loses power
22 sfrom OS boot to storage serving after a power outage
~340real fault cases run on the 0.7.1 release candidates, none losing a confirmed write
700+unit tests on the decision logic
1static binary in dom0, driving standard components (DRBD, LIO, multipath, XHA)
The problem

Two servers alone can't give you HA

Every small site faces the same dilemma: you need two servers for redundancy, but high availability needs shared storage, and every traditional answer adds cost and complexity.

  • Hardware SAN / NAS: a third box to buy, power, and maintain (and a new single point of failure)
  • Clustered storage: a witness or a third node somewhere else, and a steep learning curve
  • No shared storage: no live migration, no HA, manual disaster recovery
The solution

Shared storage from the disks you already have

Both hosts hold an identical, continuously synchronized copy of every byte. Both serve storage at all times: there is no passive node and no failover delay, because there is no failover.

  • Reads are local. Every VM reads from its own host's disk: zero network hop, full NVMe/SSD performance.
  • Writes are safe. Acknowledged only once stored on both hosts. Lose a server at any instant: not a single acknowledged write is lost.
  • No witness. TWINSTOR uses the network gateway you already have as the tie-breaker.
  • Zero patches to XCP-ng. A standard shared SR on XCP-ng 8.3; your support path stays standard.
One command

Everything, at a glance

twinstor status opens with a one-line health verdict and colors only the values that carry state: green while the pair is whole, amber or red the moment something needs you.

Host A always active VMs Local disk Host B always active VMs Local disk synchronous replication every byte on both hosts, reads always local
twinstor status

● healthy: serving, peer redundant

     version:     0.7.4
     daemon:      running
     host:        twinstor-1 (this node), peer twinstor-2
     pool master: twinstor-1 (this node)
     pool HA:     enabled

  ✓ drbd
       disk:       UpToDate
       connection: Connected
       peer disk:  UpToDate

  ✓ readiness:   ready (local serving, peer redundant)
  ✓ iscsi:       active
The data promise

Four commitments, in plain terms

Every failure behavior in TWINSTOR reduces to these four commitments. They are what actually protects your VMs when hardware and networks misbehave.

1

A write your VM was told is safe is never silently destroyed

A host cut off from the network freezes instead of serving, so a network cut does not lose confirmed writes. In the rare case where both hosts wrote apart, the writes that must go are announced: an alert names the VMs concerned.

2

When the evidence is ambiguous, it stops and asks

No verdict means no action: both copies are kept, an alert names the decision that is yours, and waiting costs nothing. It never silently picks a side it cannot justify.

3

Decisions follow the data

When a copy has to be chosen, TWINSTOR reads DRBD's own record of which copy holds which writes. The VMs on the other host are stopped before its copy is discarded, then restarted on the kept one.

4

Everything is accountable

Every incident is a numbered episode in the logs from open to close, every resolution names the VMs it touched, and every state that waits for a human is listed in the documentation.

Fire and forget

Every failure heals itself or fails closed

Designed to run unattended for years at sites with no IT staff. Every scenario below was exercised on real hardware; the numbers are measured, not estimated.

FailureWhat happensMeasured result
Host power lossSurvivor keeps serving, VMs auto-restart0 dropped pings; victim's VMs back in ~2 min
Total site power outageBoth hosts boot, storage converges, VMs restart~3 min from power cut to all VMs running, unattended
Local disk / RAID array failureVMs keep running, transparently served from the other host's copyWorkloads never missed a beat; full redundancy 23 s after the disk returned
Network cut between the hostsThe cut-off host freezes and steps aside; its VMs restart on the other host0 confirmed writes lost in testing; resync on rejoin
A host loses its client network (arbitrated)The isolated host stands its storage down; its VMs restart on the reachable hostUnattended failover, then resync on rejoin
Dead access switch (both hosts isolated at once, arbitrated)Both hosts hold and keep running: no pointless failover to an equally unreachable peerVMs stay up, no reboot; auto-resumes when the switch returns
Software crashStorage keeps serving while the service restarts itself0 s VM downtime
Split-brain (both sides writing)Fails closed: the copy with the newest writes wins (by DRBD generation, not by guess), loud alert; if undecidable, it refuses to discard anythingValidated end-to-end on a real crash
Rolling Pool UpdateFully transparent, no special commandsReal RPU via Xen Orchestra: ~7 min, VMs uninterrupted
TWINSTOR upgradeinstall.sh, then twinstor upgrade-apply, one host at a timeZero downtime: storage keeps serving during the update

Recovery times include the servers' own boot time. TWINSTOR's share is tiny: in the power-outage test, storage was serving 22 seconds after the OS booted. Safe even on consumer SSDs: TWINSTOR detects volatile write caches and disables them, so an acknowledged write is on persistent media before the ack.

Where TWINSTOR shines

Built for the millions of sites that need exactly two servers

Retail & franchise networks

POS, inventory, surveillance on two small hosts per store. No witness per store, no extra licence, the same setup at every site.

Remote & branch offices

File services, AD replicas, local apps with no IT staff on site. The ~3-minute unattended power-outage recovery means the site is back before anyone arrives in the morning.

Industrial & manufacturing edge

MES, SCADA historians, line supervision on the factory floor. Local reads give predictable latency; synchronous replication means a host failure never loses an acknowledged write.

Hospitality & healthcare

PMS/EMR systems that must stay up, in buildings with a network closet rather than a server room. Two short-depth hosts and a switch is the entire footprint.

Maritime, energy, disconnected sites

Ships, wind farms, substations: places where "send a technician" means days. No remote hands needed for recovery; the whole stack is observable from shore.

MSPs

A standardized, scriptable 2-node building block: identical setup at every client, alerts centralized in Xen Orchestra, zero-downtime updates during business hours.

Two ways to deploy

Pick your topology at setup; both keep your data safe

Fate-shared (default)

Replication and the clients share one network, so the two hosts always fail together, cleanly: no way to diverge, no split-brain to untangle. From a pair of mini-PCs on one switch up to a redundant MLAG pair run as a single segment, where you also drop the switch as a single point of failure. The simplest, most-tested path whenever storage and clients ride the same network.

Needs: one shared network between the hosts (single switch, or one redundant L2).

Arbitrated (dedicated storage network)

For enterprise builds where storage runs on its own network, separate from the clients and gateway (a storage plane on its own switches or fabric: spine/leaf, a separate 25/40/100G storage VLAN). Replication gets a back-to-back cable as its default path with that fabric as the automatic, alerted fallback, and the hosts stop depending on the gateway to tell isolation apart. Rides through switch-side gray failures that fate-shared cannot, and a dead access switch keeps VMs running (both hosts hold) instead of a compute outage.

Choose when your storage network can fail independently of the gateway. Needs a dedicated replication path (crossover / DAC direct cable).

Honest limits

TWINSTOR keeps exactly two synchronized copies on exactly two nodes. If you need 3+ nodes, 3-way replication, or multiple storage tiers, use XOSTOR or a SAN. The two hosts should share a reliable network (bonding or stacked switches recommended). There is no background scrub: silent corruption on one disk is only found when it is read. Tech Preview status: it's a 0.x series, so read the release notes before upgrading a live pool.

Get started

Two commands. That's the whole setup.

The interactive wizard auto-detects the pool peer, lists candidate disks with model and serial, generates credentials, creates the storage, and enables HA. twinstor uninstall reverses everything.

Requirements: 2 XCP-ng hosts in a pool, a free local disk on each, a network link between them (1 Gbps works, 10 Gbps recommended), BIOS set to power on after AC loss. No SAN, no witness, no special wiring.

# Node A: run the wizard, follow the prompts
twinstor setup

# Node B: same wizard; it detects node A
twinstor setup

# Live status anytime
twinstor status

Two commands later you have shared storage, live migration, and automatic VM restart on host failure. The documentation is on docs.vates.tech, and the source on GitHub.