Multi-Writer Disks & Giới Hạn Concurrent Access
Tại sao multi-writer phức tạp hơn tưởng
"Gắn một disk vào nhiều VM đồng thời" nghe có vẻ đơn giản — nhưng thực tế đây là vấn đề khó trong distributed systems. Block storage cung cấp abstraction rất thô: "đọc/ghi sector X". Không có khái niệm "lock", "transaction", hay "cache coherence" ở tầng block. Khi hai VMs cùng đọc và ghi vào cùng một disk, mỗi VM có page cache riêng trong kernel của mình. VM A ghi vào sector 100 — VM B không biết, page cache của VM B vẫn chứa giá trị cũ từ sector 100.
Đây là lý do file systems thông thường (ext4, xfs, NTFS, APFS) không thể hoạt động đúng trong multi-writer mode — chúng không được thiết kế để xử lý tình huống này. Dùng ext4 trên shared disk với multi-writer là công thức để mất data.
Persistent Disk đã dừng hỗ trợ multi-writer
Theo Google Cloud documentation hiện tại, chỉ Hyperdisk volumes hỗ trợ multi-writer mode. Persistent Disk không còn hỗ trợ multi-writer.
Đây là sự thay đổi quan trọng — tài liệu cũ có nhắc đến multi-writer cho pd-ssd với giới hạn 2 VMs và chỉ N2 machine type. Tuy nhiên, phiên bản hiện tại của documentation không còn liệt kê PD trong supported types. Workloads cần multi-writer phải chuyển sang Hyperdisk.
Hyperdisk types hỗ trợ multi-writer
| Loại | Max instances | Machine types hỗ trợ |
|---|---|---|
| Hyperdisk Balanced | 8 instances | C3, C3D, M3, N4, Z3 |
| Hyperdisk Balanced HA | 8 instances | (subset của Balanced) |
| Hyperdisk Extreme | 16 instances | C3, M3, N2 (≥min vCPUs) |
Tại sao Hyperdisk ML không có multi-writer? Hyperdisk ML được thiết kế cho read-only shared access của ML workloads. Nó hỗ trợ 2,500 concurrent readers nhưng không hỗ trợ concurrent writers vì inference pods không cần write vào model weights.
SCSI Persistent Reservations: cơ chế I/O fencing
Để shared block storage hoạt động đúng với concurrent writers, cần I/O fencing — cơ chế đảm bảo khi một node fail, các nodes khác không tiếp tục ghi vào disk trước khi failover an toàn. Nếu không có I/O fencing, node fail có thể đang giữa quá trình ghi, và node mới nhảy vào ghi đè → data corruption.
Hyperdisk hỗ trợ NVMe Persistent Reservations (PRs) theo spec NVMe 1.2.1. Có hai reservation mode:
Write Exclusive (WE): Một node được phép ghi, tất cả nodes đều được phép đọc. Nếu node giữ write reservation fail, reservation bị clear và node khác có thể acquire.
Exclusive Access (EA): Chỉ một node được phép đọc VÀ ghi tại một thời điểm.
Clustering software sử dụng PRs để implement STONITH (Shoot The Other Node In The Head) — khi một node fail hoặc bị partition, các nodes còn lại can thiệp để đảm bảo failed node không còn có I/O access trước khi failover. Đây là điều kiện bắt buộc cho high-availability database clustering.
Clustered file systems: đây mới là thứ bạn thực sự cần
Nếu cần multi-writer block storage theo nghĩa "nhiều VMs cùng đọc/ghi file", bạn không chỉ cần multi-writer disk — bạn cần clustered file system chạy trên disk đó. Clustered file system cung cấp coordination layer phía trên block storage:
OCFS2 (Oracle Cluster File System 2)
OCFS2 là clustered file system mã nguồn mở do Oracle phát triển, được tích hợp vào Linux kernel. Nó sử dụng distributed locking manager (DLM) để coordinate metadata và data access giữa các nodes.
Use case điển hình: Oracle RAC (Real Application Clusters) — nhiều Oracle database instances cùng truy cập shared storage.
GFS2 (Global File System 2)
GFS2 là clustered file system của Red Hat/CentOS, tương tự OCFS2 nhưng với cơ chế locking khác. Dùng trong Red Hat Cluster Suite.
VMFS (VMware Virtual Machine File System)
VMFS là clustered file system của VMware, cho phép nhiều ESXi hosts mount cùng một datastore. Đây là cơ chế phía sau vMotion — VM có thể migrate giữa hosts vì datastore là shared.
Performance characteristics của multi-writer mode
Một quan sát quan trọng từ documentation: attach multi-writer disk vào nhiều VMs không tăng aggregate performance. Mỗi VM nhận một phần của per-disk performance budget.
Ví dụ với Hyperdisk Balanced 160,000 IOPS trong multi-writer mode với 8 VMs:
- Không phải mỗi VM có 160,000 IOPS
- 160,000 IOPS là shared budget giữa 8 VMs
- Average per-VM = 20,000 IOPS (nhưng phân phối thực tế phụ thuộc workload)
Điều này có implications quan trọng cho capacity planning: nếu clustering software cần minimum IOPS per node để hoạt động đúng, tổng IOPS của disk phải đủ lớn để cover tất cả nodes.
Use cases thực tế và cân nhắc kỹ thuật
Oracle RAC
Oracle RAC là use case phổ biến nhất cho multi-writer block storage trên GCP. Deployment pattern điển hình:
Oracle RAC Node 1 ──┐
Oracle RAC Node 2 ──┼── Hyperdisk Extreme (multi-writer) ── Oracle Database
Oracle RAC Node 3 ──┘Cần: OCFS2 hoặc ASM (Oracle Automatic Storage Management) làm clustered storage layer, SCAN listener cho load balancing, và đủ IOPS cho tất cả nodes.
SQL Server Failover Cluster Instance (FCI)
SQL Server FCI dùng Windows Server Failover Clustering (WSFC) để manage shared storage. Chỉ một node active tại một thời điểm (active-passive), node còn lại là standby. Multi-writer disk cần thiết vì khi failover, standby node cần access disk ngay lập tức.
Clustering software (WSFC) sử dụng SCSI PRs để đảm bảo chỉ active node có write access.
Sai lầm phổ biến: mount shared disk với ext4
Scenario này xảy ra thường xuyên khi team không hiểu cơ chế:
- Tạo Hyperdisk Balanced với multi-writer mode
- Format bằng ext4 trên Node A:
mkfs.ext4 /dev/sdb - Mount trên Node A:
mount /dev/sdb /data - Mount trên Node B:
mount /dev/sdb /data - Cả hai nodes đọc/ghi vào
/data
Kết quả: Data corruption. Đây là race condition ở cấp filesystem metadata. ext4 journal không được thiết kế để coordinate giữa hai kernel instances độc lập đọc/ghi vào cùng filesystem metadata. Block groups, inode tables, journal — tất cả đều corrupt khi hai kernels cùng update.
Rule của thumb: Nếu không dùng clustered file system hoặc database clustering software, không nên dùng multi-writer mode. ReadWriteMany (RWX) trong Kubernetes context thường được implement tốt hơn bằng Filestore (NFS) hơn là shared block storage với multi-writer.
Khi nào nên dùng multi-writer, khi nào không
Nên dùng:
- Oracle RAC yêu cầu shared block storage
- SQL Server FCI cần shared storage cho failover
- Workloads đặc thù yêu cầu clustered file system với clustering software quản lý
Không nên dùng (dùng alternatives khác):
- "Tôi muốn nhiều pods đọc cùng một file" → Dùng Filestore (NFS) hoặc Cloud Storage FUSE
- "Tôi muốn share dataset cho ML training" → Dùng Hyperdisk ML (read-only multi-attach) hoặc Cloud Storage FUSE
- "Tôi muốn HA cho database" → Dùng Regional PD hoặc Hyperdisk Balanced HA với active-passive setup, không cần multi-writer
Multi-writer chỉ thực sự cần thiết khi clustering software explicit yêu cầu shared block storage và có I/O fencing built-in.