Digital Sovereignty & Open Infrastructure

Coverage of open-source platforms, data ownership, and the technologies enabling organizations to operate on their own terms.

We Rebuilt Our Storage Architecture (and ZFS made it easy)

ZFS storage architecture

Most storage problems don’t start with a lack of capacity.

They start with a lack of structure.

Over time, infrastructure grows. New virtual machines get deployed. ISO images accumulate. Backup jobs get added. Snapshots begin to pile up. Before long, storage is technically working, but nobody can clearly answer questions like:

  • What data belongs where?
  • What should be backed up?
  • What should be snapshotted?
    • is that even a word??
  • What should be archived?
  • What can be safely deleted?

This week I spent some time reorganizing the storage architecture in my Proxmox lab to solve exactly those problems.

The project also provided a good example of why I continue to deploy ZFS as the foundation for infrastructure storage.

The Original Situation

My Proxmox environment was running on two separate storage pools.

tank

A mirrored SSD pool used for production workloads.

bulk

A mirrored HDD pool used for capacity storage.

The problem wasn’t capacity.

The problem was that several different storage types were living on the SSD pool:

  • Virtual machine disks
  • Database storage
  • ISO repositories
  • Backup storage
  • Historical snapshots

As the environment matured, those workloads began competing for space and making capacity planning more difficult.

The solution was to redesign storage around function rather than simply where space happened to be available.

Separating Storage by Purpose

The new architecture follows a simple principle:

Fast storage is for production workloads. Large storage is for retention workloads.

The SSD pool now contains only active workloads:

tank
├── vmdata
└── db

vmdata

Stores:

  • Virtual machine disks
  • Container storage
  • Cloud-Init images

db

Reserved for database workloads such as:

  • PostgreSQL
  • MariaDB
  • Redis persistence
  • Future application databases

Meanwhile the HDD pool now contains long-term storage:

bulk
├── backups
└── isos

backups

Stores:

  • Proxmox backup files
  • Recovery archives
  • Exported configurations

isos

Stores:

  • Operating system installation media
  • Appliance images
  • Utility boot environments

This separation makes storage behavior predictable and much easier to document.

Why ZFS Matters

Moving the data was only part of the project.

The real value came from the features provided by ZFS.

Unlike traditional filesystems, ZFS understands the relationship between:

  • Files
  • Datasets
  • Snapshots
  • Capacity
  • Replication
  • Integrity

This allows infrastructure to be managed at a much higher level.

For example:

Instant Snapshots

ZFS snapshots can capture an entire dataset in seconds.

That means a virtual machine datastore can be protected before:

  • Operating system upgrades
  • Application upgrades
  • Major configuration changes

without copying terabytes of data.

Data Integrity

Every block written to ZFS includes checksums.

When data is read, ZFS verifies that what comes back matches what was originally written.

This helps detect:

  • Bit rot
  • Silent corruption
  • Storage controller issues
  • Drive errors

before they become disasters.

Flexible Storage Design

Datasets can have independent settings.

For example:

tank/vmdata

can receive aggressive snapshot protection while:

bulk/backups

receives none at all.

Each dataset becomes its own administrative boundary.

Cleaning Up Snapshot Sprawl

During the migration I discovered something else.

A large amount of SSD capacity was being consumed by old ZFS snapshots.

The system had accumulated months of historical snapshots that were no longer aligned with current retention requirements.

After reviewing retention policies and removing unnecessary historical snapshots, more than 20 GB of SSD space was immediately reclaimed.

More importantly, the environment now follows a documented retention standard:

  • Frequent snapshots
  • Hourly snapshots
  • Daily snapshots
  • Weekly snapshots
  • Monthly snapshots

for production datasets only.

Backup repositories and ISO libraries are excluded because they already provide their own retention mechanisms.

This prevents unnecessary storage consumption while still protecting active workloads.

Storage Should Reflect Recovery Strategy

One lesson that repeatedly appears in infrastructure work is that storage design and recovery design are really the same conversation.

If you don’t know:

  • What needs snapshots
  • What needs backups
  • What needs replication
  • What needs offsite copies

then your storage layout will eventually become chaotic.

The architecture now follows a clear path:

Production Data
        ↓
ZFS Snapshots
        ↓
Proxmox Backups
        ↓
Backup Repository
        ↓
Offsite Copies

Each layer serves a specific purpose:

  • Snapshots provide rapid rollback
  • Backups provide recovery
  • Offsite copies provide disaster protection

Infrastructure Should Become Simpler Over Time

One of the goals behind FOSSnix infrastructure design is that systems should become easier to understand as they mature—not harder.

The final result of this project wasn’t more storage.

It was more clarity:

  • Every dataset now has a defined purpose
  • Every storage location has documented retention
  • Every pool has a clearly defined role

And because the entire design is built on ZFS, it remains flexible enough to grow without needing to be rebuilt later.

That’s the difference between having storage and having a storage architecture.


Article Tags: