Cấu hình DRBD trên Linux: Xây dựng HA Storage cho máy ảo KVM chịu lỗi cao

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Quick Start: Cấu hình DRBD cơ bản trong 5 phút

3 giờ sáng, server production báo disk failure. Cả team nhận alert. May là mình đã setup DRBD trước đó 2 tuần — failover tự động, VM vẫn chạy, không mất data. Bài này mình ghi lại đúng những gì đã làm, không thêm bớt.

Mình chạy homelab với Proxmox VE quản lý 12 VM và container — đây là playground để test mọi thứ trước khi đưa lên production. DRBD là thứ mình test kỹ nhất trước khi dám đụng vào môi trường thật.

Môi trường lab

  • node1: 192.168.1.10 (primary) — Ubuntu 22.04
  • node2: 192.168.1.11 (secondary) — Ubuntu 22.04
  • Mỗi node có thêm 1 disk /dev/sdb 20GB dành riêng cho DRBD

Bước 1: Cài DRBD trên cả 2 node

# Chạy trên CẢ HAI node
sudo apt update
sudo apt install drbd-utils -y

# Load kernel module
sudo modprobe drbd
echo "drbd" | sudo tee -a /etc/modules

Bước 2: Tạo file cấu hình resource

Tạo file /etc/drbd.d/kvm-storage.res trên cả 2 node với nội dung giống nhau:

resource kvm-storage {
  protocol C;

  on node1 {
    device    /dev/drbd0;
    disk      /dev/sdb;
    address   192.168.1.10:7789;
    meta-disk internal;
  }

  on node2 {
    device    /dev/drbd0;
    disk      /dev/sdb;
    address   192.168.1.11:7789;
    meta-disk internal;
  }
}

Bước 3: Khởi tạo và bật DRBD

# Chạy trên CẢ HAI node
sudo drbdadm create-md kvm-storage
sudo drbdadm up kvm-storage

# Chỉ chạy trên NODE1 — bước này quan trọng, sai node là mất data
sudo drbdadm primary --force kvm-storage

# Theo dõi quá trình sync
watch cat /proc/drbd

Sau khi sync xong, /dev/drbd0 trên node1 sẵn sàng làm storage cho KVM. Format và mount như disk thường:

# Chỉ làm trên NODE1
sudo mkfs.ext4 /dev/drbd0
sudo mkdir -p /var/lib/libvirt/images/drbd
sudo mount /dev/drbd0 /var/lib/libvirt/images/drbd

Giải thích chi tiết: DRBD hoạt động như thế nào?

DRBD (Distributed Replicated Block Device) hoạt động ở kernel level — nó tạo một block device ảo (/dev/drbd0) và tự động mirror mọi write operation sang node còn lại qua mạng TCP.

Điểm khác với filesystem-level sync như rsync hay GlusterFS là DRBD mirror ở block level, trước khi data ghi vào filesystem. Nghĩa là dù VM ghi gì, kể cả raw disk I/O, đều được replicate ngay lập tức.

Ba giao thức sync — chọn đúng là quan trọng

  • Protocol A (Asynchronous): Primary xác nhận write ngay sau khi ghi local, không đợi secondary. Nhanh nhất nhưng có thể mất data nếu primary chết đột ngột.
  • Protocol B (Semi-sync): Primary đợi data đến buffer của secondary mới xác nhận. Cân bằng giữa performance và safety.
  • Protocol C (Synchronous): Primary đợi secondary ghi xuống disk xong mới xác nhận. An toàn nhất — mình dùng cái này cho production, chấp nhận latency cao hơn một chút.

Tạo VM trỏ vào DRBD storage

sudo virt-install \
  --name ha-vm01 \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/drbd/ha-vm01.qcow2,size=15 \
  --os-variant ubuntu22.04 \
  --cdrom /tmp/ubuntu-22.04-server.iso \
  --network bridge=virbr0

Nâng cao: Auto failover với Pacemaker

DRBD dùng một mình chỉ là “warm standby” — node1 chết thì phải tay chạy sang node2. Để tự động hoàn toàn, cần kết hợp Pacemaker + Corosync.

Cài Pacemaker và Corosync

# Cả 2 node
sudo apt install pacemaker corosync pcs -y

# Đặt password cho user hacluster
sudo passwd hacluster

# Chỉ trên NODE1
sudo pcs host auth node1 node2 -u hacluster
sudo pcs cluster setup ha-kvm-cluster node1 node2
sudo pcs cluster start --all
sudo pcs cluster enable --all

Cấu hình DRBD resource trong Pacemaker

# Tắt STONITH cho lab (production cần bật và cấu hình hardware fencing)
sudo pcs property set stonith-enabled=false

# Tạo DRBD resource
sudo pcs resource create drbd_res ocf:linbit:drbd \
  drbd_resource=kvm-storage \
  op monitor interval=30s

# Cấu hình promotable (primary/secondary)
sudo pcs resource promotable drbd_res \
  master-max=1 master-node-max=1 \
  clone-max=2 clone-node-max=1 \
  notify=true

# Tạo filesystem resource
sudo pcs resource create fs_res Filesystem \
  device=/dev/drbd0 \
  directory=/var/lib/libvirt/images/drbd \
  fstype=ext4

# Ràng buộc: fs_res chỉ chạy trên node đang là DRBD primary
sudo pcs constraint colocation add fs_res with Master drbd_res-clone
sudo pcs constraint order promote drbd_res-clone then start fs_res

Sau khi xong, khi node1 chết: Pacemaker tự demote DRBD trên node1, promote node2 lên primary, mount filesystem, rồi khởi động lại VM. Toàn bộ quá trình thường dưới 30 giây.

Tips thực tế từ production

1. Xử lý Split-brain — tình huống stress nhất

Split-brain xảy ra khi 2 node mất kết nối với nhau và cả 2 đều nghĩ mình là primary. Lần đầu mình gặp cái này lúc 2 giờ sáng — tim đập nhanh thật sự.

# Kiểm tra trạng thái — "StandAlone" hoặc "SplitBrain" là có vấn đề
cat /proc/drbd

# Quyết định node nào giữ data mới nhất, ví dụ giữ node1
# Trên NODE2 (node bị discard):
sudo drbdadm secondary kvm-storage
sudo drbdadm disconnect kvm-storage
sudo drbdadm -- --discard-my-data connect kvm-storage

# Trên NODE1 (node được giữ):
sudo drbdadm connect kvm-storage

Cảnh báo: --discard-my-data xóa toàn bộ data trên node đó và sync lại từ node kia. Chắc chắn đang discard đúng node trước khi chạy lệnh này.

2. Theo dõi trạng thái realtime

# Xem trạng thái realtime
watch -n2 drbdadm status

# Output khi mọi thứ OK:
# kvm-storage role:Primary
#   disk:UpToDate
#   node2 role:Secondary
#     replication:Established peer-disk:UpToDate

# Nếu thấy "Inconsistent" hoặc "Outdated" — đang sync hoặc có lỗi
cat /proc/drbd

3. Tăng tốc resync sau maintenance

Mặc định DRBD giới hạn bandwidth resync để không ảnh hưởng production I/O. Sau maintenance window, mình thường tăng lên để sync nhanh hơn:

# Tăng resync speed lên 512MB/s tạm thời
sudo drbdadm disk-options --resync-rate=512M kvm-storage

# Hoặc set cố định trong /etc/drbd.d/global_common.conf
# disk {
#   resync-rate 512M;
# }

4. Firewall rules — đừng quên

# Chỉ cho phép 2 node DRBD nói chuyện với nhau
# Trên node1:
sudo ufw allow from 192.168.1.11 to any port 7789

# Trên node2:
sudo ufw allow from 192.168.1.10 to any port 7789

5. Kết hợp với Proxmox Backup Server

DRBD bảo vệ khỏi hardware failure, nhưng không bảo vệ khỏi human error — xóa nhầm file trong VM là cả 2 node đều mất. Mình kết hợp DRBD với PBS (Proxmox Backup Server) để có cả 2 lớp bảo vệ: real-time replication và point-in-time backup. Combo này cho mình ngủ ngon hơn nhiều.

Share: