ZFS on Linux Microservices Architecture
โดย อ. บอมกิตติทัศน์เจริญพนาสิทธิ์ | อัปเดต 24 ก. พ. 2026 | อ่าน 15 นาที
- ZFS คืออะไร — ทำไมถึงเป็น File System ที่ดีที่สุด
- คุณสมบัติเด่นของ ZFS
- ติดตั้ง ZFS on Linux
- ZPool — สร้างและจัดการ Storage Pool
- RAID-Z — Software RAID ที่ดีกว่า Hardware RAID
- Dataset — แยก Storage สำหรับแต่ละ Service
- Snapshot — Backup ทันทีไม่กี่วินาที
- Send/Receive — Replication ข้าม Server
- Compression และ Deduplication
- ZFS กับ Docker — Storage Driver
- ZFS กับ Kubernetes — Persistent Volume
- Microservices Storage Design Pattern
- Performance Tuning
- Monitoring ZFS
- Best Practices และสรุป
ZFS คืออะไร — ทำไมถึงเป็น File System ที่ดีที่สุด
ZFS (Zettabyte File System) เป็นระบบไฟล์และ Volume Manager ในตัวเดียวกันถูกพัฒนาโดย Sun Microsystems ในปี 2001 สำหรับ Solaris ต่อมาถูก Port มาเป็น OpenZFS ที่ทำงานบน Linux, FreeBSD, macOS และ Windows ZFS ถูกออกแบบมาเพื่อแก้ปัญหาใหญ่ที่สุดของ Storage คือ Data Integrity ด้วยการ Checksum ข้อมูลทุก Block และตรวจสอบอัตโนมัติทุกครั้งที่อ่าน
สิ่งที่ทำให้ ZFS แตกต่างจาก File System อื่นอย่าง ext4 หรือ XFS คือการรวม File System + Volume Manager + RAID เข้าไว้ในระบบเดียวไม่ต้องใช้ LVM แยกไม่ต้องใช้ mdadm ทำ Software RAID ไม่ต้องใช้ Hardware RAID Controller ทุกอย่างจัดการผ่าน ZFS Command เดียวลดความซับซ้อนและเพิ่มความน่าเชื่อถืออย่างมาก
คุณสมบัติเด่นของ ZFS
| คุณสมบัติ | รายละเอียด | ประโยชน์ |
|---|---|---|
| Copy-on-Write (CoW) | ไม่เขียนทับข้อมูลเดิมสร้างสำเนาใหม่แล้วเปลี่ยน Pointer | ป้องกัน Data Corruption, Snapshot ทันที |
| Checksumming | Checksum ทุก Block ตรวจสอบทุกครั้งที่อ่าน | ตรวจจับ Silent Data Corruption (Bit Rot) |
| Self-healing | ถ้า Checksum ไม่ตรงจะซ่อมจาก Mirror/Parity อัตโนมัติ | ข้อมูลไม่เสียแม้ Disk มีปัญหา |
| Snapshot | สร้าง Point-in-time Copy ทันทีโดยไม่ใช้พื้นที่เพิ่ม | Backup เร็ว, Rollback ได้ทันที |
| Compression | LZ4, ZSTD, GZIP แบบ Transparent | ประหยัดพื้นที่ 30-60% โดยไม่กระทบ Performance |
| RAID-Z | Software RAID ที่แก้ Write Hole Problem | ไม่ต้องซื้อ Hardware RAID Controller |
| Send/Receive | ส่ง Snapshot ไป Server อื่นแบบ Incremental | Backup/Replication ข้าม Data Center |
| Dataset & Quota | แยก Namespace แต่ละ Dataset กำหนด Quota ได้ | แยก Storage ต่อ Service/Tenant |
ติดตั้ง ZFS on Linux
# Ubuntu / Debian
sudo apt update
sudo apt install zfsutils-linux -y
# Rocky Linux / AlmaLinux / RHEL 9
sudo dnf install https://zfsonlinux.org/epel/zfs-release-2-3.el9.noarch.rpm
sudo dnf install kernel-devel zfs -y
sudo modprobe zfs
# ตรวจสอบว่า ZFS พร้อมใช้งาน
zfs version
# zfs-2.2.x
# zfs-kmod-2.2.x
# ดู Kernel Module
lsmod | grep zfs
ข้อควรระวัง ZFS ใช้ RAM ค่อนข้างมากสำหรับ ARC (Adaptive Replacement Cache) กฎทั่วไปคือ 1 GB RAM ต่อ 1 TB Storage สำหรับ Basic Use Server ที่มี Storage 10 TB ควรมี RAM อย่างน้อย 16 GB โดย 8-10 GB จะถูกใช้เป็น ARC Cache ทำให้ Read Performance สูงมาก
ZPool — สร้างและจัดการ Storage Pool
ZPool คือ Storage Pool ที่รวม Disk หลายตัวเข้าด้วยกันเป็น Layer ล่างสุดของ ZFS ทุก Dataset และ Filesystem จะถูกสร้างบน ZPool
# สร้าง Simple Pool (ไม่มี Redundancy)
sudo zpool create tank /dev/sdb
# สร้าง Mirror Pool (เหมือน RAID 1)
sudo zpool create tank mirror /dev/sdb /dev/sdc
# สร้าง RAID-Z1 Pool (เหมือน RAID 5)
sudo zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
# สร้าง RAID-Z2 Pool (เหมือน RAID 6)
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# ดู Status
sudo zpool status tank
sudo zpool list
# เพิ่ม Cache (L2ARC) — SSD สำหรับ Read Cache
sudo zpool add tank cache /dev/nvme0n1
# เพิ่ม Log (SLOG) — SSD สำหรับ Write Log
sudo zpool add tank log mirror /dev/nvme0n2 /dev/nvme0n3
# Scrub — ตรวจสอบ Data Integrity ทั้ง Pool
sudo zpool scrub tank
RAID-Z — Software RAID ที่ดีกว่า Hardware RAID
RAID-Z เป็น Software RAID ของ ZFS ที่แก้ปัญหา Write Hole ของ RAID 5/6 ด้วย Copy-on-Write ทำให้ไม่ต้องใช้ BBU (Battery Backup Unit) เหมือน Hardware RAID Controller
| ระดับ | Parity | Disk ขั้นต่ำ | เสียได้ | เทียบเท่า | Usable Space |
|---|---|---|---|---|---|
| RAID-Z1 | Single | 3 | 1 Disk | RAID 5 | (N-1) × Disk Size |
| RAID-Z2 | Double | 4 | 2 Disk | RAID 6 | (N-2) × Disk Size |
| RAID-Z3 | Triple | 5 | 3 Disk | ไม่มีเทียบ | (N-3) × Disk Size |
| Mirror | Full Copy | 2 | N-1 Disk | RAID 1 | 1 × Disk Size |
คำแนะนำสำหรับปี 2026: ด้วยขนาด Disk ที่ใหญ่ขึ้น (18-24 TB ต่อตัว) ทำให้ Rebuild Time นานมากหากเสีย Disk 1 ตัวระหว่าง Rebuild อาจเสียอีกตัวแนะนำใช้ RAID-Z2 เป็นขั้นต่ำสำหรับ Disk ขนาดใหญ่กว่า 12 TB ควรใช้ RAID-Z3
Dataset — แยก Storage สำหรับแต่ละ Service
Dataset เป็นจุดแข็งของ ZFS ในการใช้กับ Microservices สามารถสร้าง Dataset แยกสำหรับแต่ละ Service กำหนด Quota, Compression, Record Size แยกกันได้โดยไม่ต้อง Partition Disk ใหม่
# สร้าง Dataset สำหรับแต่ละ Microservice
sudo zfs create tank/services
sudo zfs create tank/services/user-api
sudo zfs create tank/services/order-api
sudo zfs create tank/services/payment-api
sudo zfs create tank/services/notification
# กำหนด Quota แต่ละ Service
sudo zfs set quota=50G tank/services/user-api
sudo zfs set quota=100G tank/services/order-api
sudo zfs set quota=30G tank/services/payment-api
# กำหนด Compression
sudo zfs set compression=zstd tank/services/user-api
sudo zfs set compression=lz4 tank/services/order-api
# กำหนด Record Size ตามลักษณะ Workload
sudo zfs set recordsize=16K tank/services/user-api # Database
sudo zfs set recordsize=1M tank/services/notification # Large Files
# สร้าง Dataset สำหรับ Database
sudo zfs create tank/databases
sudo zfs create tank/databases/postgres
sudo zfs set recordsize=8K tank/databases/postgres # Match PG block size
sudo zfs set logbias=throughput tank/databases/postgres
sudo zfs set primarycache=metadata tank/databases/postgres
# ดู Dataset ทั้งหมด
zfs list -r tank
Snapshot — Backup ทันทีไม่กี่วินาที
Snapshot เป็นฟีเจอร์ที่ทรงพลังที่สุดของ ZFS สร้าง Point-in-time Copy ของ Dataset ทั้งหมดได้ภายในเสี้ยววินาทีไม่ว่าข้อมูลจะมีขนาดเท่าไรเพราะใช้ Copy-on-Write จึงไม่ต้อง Copy ข้อมูลจริงแค่เก็บ Pointer ไว้ Snapshot ใช้พื้นที่เพิ่มเฉพาะ Block ที่ถูกเปลี่ยนแปลงหลังจากสร้าง Snapshot
# สร้าง Snapshot
sudo zfs snapshot tank/services/user-api@before-deploy-v2.1
sudo zfs snapshot tank/databases/postgres@daily-2026-02-24
# สร้าง Snapshot ทุก Dataset พร้อมกัน (Recursive)
sudo zfs snapshot -r tank/services@backup-20260224
# ดู Snapshot ทั้งหมด
zfs list -t snapshot
# Rollback — กลับไปที่ Snapshot
sudo zfs rollback tank/services/user-api@before-deploy-v2.1
# Clone — สร้าง Writable Copy จาก Snapshot
sudo zfs clone tank/databases/postgres@daily-2026-02-24 tank/databases/postgres-staging
# ลบ Snapshot
sudo zfs destroy tank/services/user-api@old-snapshot
# Auto Snapshot ด้วย cron
# ทุกชั่วโมง เก็บ 24 Snapshot
0 * * * * /sbin/zfs snapshot tank/databases/postgres@hourly-$(date +\%Y\%m\%d\%H)
# ลบ Snapshot เก่ากว่า 7 วัน
0 0 * * * /sbin/zfs list -H -t snapshot -o name | grep daily | head -n -7 | xargs -n1 zfs destroy
Send/Receive — Replication ข้าม Server
ZFS Send/Receive ส่ง Snapshot ไป Server อื่นได้ผ่าน SSH รองรับ Incremental Send ที่ส่งเฉพาะ Block ที่เปลี่ยนแปลงประหยัด Bandwidth มากเหมาะสำหรับ Disaster Recovery, Offsite Backup หรือ Replication ไป DR Site
# Full Send — ส่ง Snapshot แรก
sudo zfs send tank/databases/postgres@snap1 | \
ssh backup-server "sudo zfs receive backup/postgres"
# Incremental Send — ส่งเฉพาะ Delta
sudo zfs send -i tank/databases/postgres@snap1 \
tank/databases/postgres@snap2 | \
ssh backup-server "sudo zfs receive backup/postgres"
# Compressed Send (ลด Bandwidth)
sudo zfs send --compressed tank/databases/postgres@snap2 | \
ssh -C backup-server "sudo zfs receive backup/postgres"
# Automated Replication Script
#!/bin/bash
DATASET="tank/databases/postgres"
REMOTE="backup-server"
REMOTE_DATASET="backup/postgres"
SNAP="@repl-$(date +%Y%m%d%H%M)"
zfs snapshot "$SNAP"
LAST=$(ssh "$REMOTE" "zfs list -H -t snapshot -o name $REMOTE_DATASET | tail -1")
if [ -n "$LAST" ]; then
LAST_LOCAL="@"
zfs send -i "$LAST_LOCAL" "$SNAP" | ssh "$REMOTE" "zfs receive $REMOTE_DATASET"
else
zfs send "$SNAP" | ssh "$REMOTE" "zfs receive $REMOTE_DATASET"
fi
Compression และ Deduplication
Compression ของ ZFS ทำแบบ Transparent คือ Compress ตอนเขียน Decompress ตอนอ่าน Application ไม่รู้ด้วยซ้ำว่าข้อมูลถูก Compress อยู่ Algorithm ที่แนะนำในปี 2026 คือ zstd ที่ให้ Compression Ratio ดีกว่า LZ4 โดย Performance ไม่ต่างกันมากนักสำหรับ Workload ที่ต้องการ Performance สูงสุดใช้ lz4
# เปิด Compression
sudo zfs set compression=zstd tank/services
# ดู Compression Ratio
zfs get compressratio tank/services
# NAME PROPERTY VALUE SOURCE
# tank/services compressratio 2.15x -
# หมายความว่าข้อมูล 100 GB ใช้พื้นที่จริงแค่ ~47 GB
Deduplication ลบข้อมูลซ้ำที่ระดับ Block แต่ไม่แนะนำสำหรับ Production ส่วนใหญ่เพราะใช้ RAM มหาศาล (5 GB ต่อ 1 TB Storage) และลด Write Performance อย่างมากใช้ Compression แทนจะคุ้มค่ากว่าในแทบทุกกรณี
ZFS กับ Docker — Storage Driver
Docker รองรับ ZFS เป็น Storage Driver ทำให้ Container Layer ถูกเก็บบน ZFS Dataset แยกกันได้ประโยชน์จาก Copy-on-Write, Compression และ Snapshot
# สร้าง Dataset สำหรับ Docker
sudo zfs create tank/docker
sudo zfs set compression=lz4 tank/docker
# กำหนดให้ Docker ใช้ ZFS Storage Driver
# /etc/docker/daemon.json
{
"storage-driver": "zfs",
"storage-opts": [
"zfs.fsname=tank/docker"
]
}
# Restart Docker
sudo systemctl restart docker
# ตรวจสอบ
docker info | grep "Storage Driver"
# Storage Driver: zfs
ZFS กับ Kubernetes — Persistent Volume
สำหรับ Kubernetes ใช้ OpenEBS ZFS CSI Driver เพื่อสร้าง Persistent Volume บน ZFS Pool
# ติดตั้ง OpenEBS ZFS CSI Driver
kubectl apply -f https://openebs.github.io/charts/zfs-operator.yaml
# สร้าง StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: zfs-sc
provisioner: zfs.csi.openebs.io
parameters:
poolname: "tank/k8s"
compression: "zstd"
recordsize: "16k"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
# สร้าง PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-data
spec:
storageClassName: zfs-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
Microservices Storage Design Pattern
การใช้ ZFS กับ Microservices Architecture แนะนำให้ออกแบบ Dataset Hierarchy ดังนี้
tank/
├── services/ # Application Data
│ ├── user-api/ # quota=50G, compression=zstd
│ ├── order-api/ # quota=100G, compression=zstd
│ ├── payment-api/ # quota=30G, compression=zstd
│ └── notification/ # quota=20G, compression=lz4
├── databases/ # Database Data
│ ├── postgres/ # recordsize=8K, logbias=throughput
│ ├── mongodb/ # recordsize=32K
│ └── redis/ # recordsize=4K, sync=always
├── logs/ # Centralized Logs
│ └── elk/ # compression=zstd, quota=500G
├── docker/ # Docker Storage Driver
└── backup/ # Snapshot Receive Target
แต่ละ Service มี Dataset แยกกันกำหนด Quota ป้องกัน Service หนึ่งกิน Disk จนหมดแล้วกระทบ Service อื่น Compression ตั้งตาม Data Type (Log ได้ Ratio สูง, Binary ได้น้อย) Record Size ตั้งตาม Workload (Database ใช้เล็ก, Large File ใช้ใหญ่)
Performance Tuning
- ARC Size — กำหนดขนาด RAM Cache ด้วย
zfs_arc_maxไม่ควรเกิน 75% ของ RAM ทั้งหมดเหลือให้ Application - L2ARC — เพิ่ม SSD/NVMe เป็น Second-level Cache สำหรับ Read-heavy Workload
- SLOG — เพิ่ม SSD/NVMe เป็น Separate Log Device สำหรับ Synchronous Write (Database)
- Record Size — ตั้งให้ตรงกับ Block Size ของ Application เช่น PostgreSQL ใช้ 8K, MongoDB ใช้ 32K
- atime=off — ปิด Access Time Update ลด Write ที่ไม่จำเป็น
- xattr=sa — เก็บ Extended Attribute ใน Inode แทน Block แยกเร็วกว่า
# Performance Tuning Commands
sudo zfs set atime=off tank
sudo zfs set xattr=sa tank
sudo zfs set relatime=on tank
# กำหนด ARC Max (เช่น 8 GB)
echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_max
# ถาวร — /etc/modprobe.d/zfs.conf
options zfs zfs_arc_max=8589934592
Monitoring ZFS
ต้อง Monitor ZFS อย่างสม่ำเสมอ Metrics สำคัญได้แก่
- Pool Health —
zpool statusดูว่ามี Disk เสียหรือ Degraded หรือไม่ - Space Usage —
zfs listดูพื้นที่ใช้งานอย่าให้เกิน 80% (ZFS Performance ลดลงเมื่อเต็ม) - ARC Hit Rate — ดูจาก
/proc/spl/kstat/zfs/arcstatsควรเกิน 90% - Scrub Errors — ตั้ง Scrub อย่างน้อยสัปดาห์ละครั้งตรวจ Checksum Error
- IO Latency — ดูจาก
zpool iostat -v
# ตั้ง Scrub อัตโนมัติทุกสัปดาห์
sudo systemctl enable zfs-scrub-weekly@tank.timer
# Monitor ด้วย Prometheus
# ใช้ zfs_exporter (github.com/pdf/zfs_exporter)
./zfs_exporter --web.listen-address=:9134
Best Practices และสรุป
- ใช้ RAID-Z2 ขั้นต่ำ — สำหรับ Disk ขนาดใหญ่กว่า 8 TB
- Scrub ทุกสัปดาห์ — ตรวจ Data Integrity สม่ำเสมอ
- เปิด Compression เสมอ — zstd หรือ lz4 ให้ประโยชน์มากกว่าเสีย
- แยก Dataset ต่อ Service — กำหนด Quota, Compression, Record Size แยกกัน
- Snapshot ทุกวัน — อย่างน้อยวันละ 1 ครั้งเก็บไว้อย่างน้อย 7 วัน
- Send/Receive ไป Offsite — ส่ง Snapshot ไป Server อื่นสำหรับ Disaster Recovery
- อย่าเปิด Deduplication — ยกเว้นมี RAM เหลือเฟือจริงๆและ Data ซ้ำกันมาก
- อย่าใช้ Hardware RAID กับ ZFS — ใช้ JBOD (Just a Bunch of Disks) ให้ ZFS จัดการเอง
- อย่าให้ Pool เต็มเกิน 80% — Performance จะลดลงอย่างมากเมื่อเกิน
- Monitor ARC Hit Rate — ถ้าต่ำกว่า 85% ควรเพิ่ม RAM หรือ L2ARC
ZFS เป็น Storage Layer ที่เหมาะสมอย่างยิ่งสำหรับ Microservices Architecture ด้วย Dataset ที่แยกต่อ Service, Snapshot สำหรับ Backup ทันที, Send/Receive สำหรับ Replication, Compression ประหยัดพื้นที่และ Data Integrity ที่ปกป้องข้อมูลจาก Corruption ติดตามบทความใหม่ๆได้ที่ SiamCafe.net
Q: ZFS คืออะไร
ระบบไฟล์และ Volume Manager ในตัวเดียวกันมี Data Integrity ด้วย Checksumming, Copy-on-Write, Snapshot, Compression, RAID-Z ครบในตัว