The box in the cupboard had grown organically, which is a polite way of saying nobody planned it. Four disks of three different sizes, a pool built years ago when "I'll fix it later" still sounded credible. It worked, mostly, until a SMART warning on one of the older 2TB drives made the maths uncomfortable. One more failure and the pool was gone.
So I bit the bullet and bought four matching 4TB drives. The plan was simple on paper: build a fresh raidz2 vdev, copy everything across, decommission the old mess. The plan was less simple in a case with six bays, two of them awkward to reach, and a power supply I no longer fully trusted.
ZFS makes the actual data move pleasant, at least. A snapshot and a zfs send | zfs recv between pools is the right tool, and it preserves everything: snapshots, properties, the lot. No rsync subtleties, no worrying about extended attributes. The bottleneck was never the software. It was me, shuffling drives between bays, relabelling SATA cables with a marker pen because past-me hadn't bothered.
zfs snapshot -r tank@migrate
zfs send -R tank@migrate | zfs recv -F newtank
The resilver after I'd dropped the old disks out took the best part of a weekend. Roughly 6TB of actual data, and ZFS only reads what's used rather than scrubbing the whole platter, which is one of the quieter joys of the filesystem. I left it running, checked zpool status every few hours like a worried parent, and resisted the urge to power-cycle anything.
A few things I'd tell past-me. Label the bays before you start, not halfway through. raidz2 over raidz1 is worth the lost capacity the moment you have disks old enough to fail in pairs. And buy the matching disks up front: the great disk shuffle exists entirely because I didn't, twice. The pool is healthy now, scrubs clean, and I've set a monthly scrub on a cron so the next bad sector announces itself before it becomes a crisis. Boring is the goal. Storage should be boring.