Linux

ZFS on Linux Microservices Architecture

ZFS on Linux Microservices Architecture | SiamCafe Blog

โดย อ. บอมกิตติทัศน์เจริญพนาสิทธิ์ | อัปเดต 24 ก. พ. 2026 | อ่าน 15 นาที

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 ทันที
ChecksummingChecksum ทุก Block ตรวจสอบทุกครั้งที่อ่านตรวจจับ Silent Data Corruption (Bit Rot)
Self-healingถ้า Checksum ไม่ตรงจะซ่อมจาก Mirror/Parity อัตโนมัติข้อมูลไม่เสียแม้ Disk มีปัญหา
Snapshotสร้าง Point-in-time Copy ทันทีโดยไม่ใช้พื้นที่เพิ่มBackup เร็ว, Rollback ได้ทันที
CompressionLZ4, ZSTD, GZIP แบบ Transparentประหยัดพื้นที่ 30-60% โดยไม่กระทบ Performance
RAID-ZSoftware RAID ที่แก้ Write Hole Problemไม่ต้องซื้อ Hardware RAID Controller
Send/Receiveส่ง Snapshot ไป Server อื่นแบบ IncrementalBackup/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

ระดับParityDisk ขั้นต่ำเสียได้เทียบเท่าUsable Space
RAID-Z1Single31 DiskRAID 5(N-1) × Disk Size
RAID-Z2Double42 DiskRAID 6(N-2) × Disk Size
RAID-Z3Triple53 Diskไม่มีเทียบ(N-3) × Disk Size
MirrorFull Copy2N-1 DiskRAID 11 × 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

# 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 สำคัญได้แก่

# ตั้ง 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 และสรุป

ZFS เป็น Storage Layer ที่เหมาะสมอย่างยิ่งสำหรับ Microservices Architecture ด้วย Dataset ที่แยกต่อ Service, Snapshot สำหรับ Backup ทันที, Send/Receive สำหรับ Replication, Compression ประหยัดพื้นที่และ Data Integrity ที่ปกป้องข้อมูลจาก Corruption ติดตามบทความใหม่ๆได้ที่ SiamCafe.net

อ. บอมกิตติทัศน์เจริญพนาสิทธิ์
IT Infrastructure Expert | Thaiware Award | ประสบการณ์กว่า 25 ปีด้าน Network, Linux, Cloud & AI — ผู้ก่อตั้ง SiamCafe.net Since 2000-2026

Q: ZFS คืออะไร

ระบบไฟล์และ Volume Manager ในตัวเดียวกันมี Data Integrity ด้วย Checksumming, Copy-on-Write, Snapshot, Compression, RAID-Z ครบในตัว

Q: ZFS on Linux ติดตั้งอย่างไร

Ubuntu/Debian: apt install zfsutils-linux | RHEL/Rocky: ติดตั้งจาก OpenZFS repository แล้ว modprobe zfs

Q: RAID-Z ต่างจาก Hardware RAID อย่างไร

RAID-Z เป็น Software RAID ของ ZFS ที่แก้ Write Hole Problem ด้วย Copy-on-Write ไม่ต้องใช้ Hardware RAID Controller และ BBU ปลอดภัยกว่า

Q: ZFS เหมาะกับ Microservices อย่างไร

สร้าง Dataset แยกต่อ Service กำหนด Quota/Compression แยกกัน Snapshot สำหรับ Backup ทันที Send/Receive สำหรับ Replication ข้าม Server

Q: ZFS ใช้ RAM มากไหม

กฎทั่วไป 1 GB RAM ต่อ 1 TB Storage สำหรับ Basic Use ถ้าเปิด Dedup ต้อง 5 GB ต่อ 1 TB แนะนำ 8-16 GB RAM ขั้นต่ำ

บทความแนะนำ:

อ่านเพิ่มเติม: บทความทั้งหมด | หน้าแรก Blog