Tuyệt chiêu ‘bất tử’ cho Server: Cấu hình HA Cluster với Pacemaker và Corosync

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Server lăn quay ra chết lúc 2 giờ sáng và bài toán Uptime

Thử tưởng tượng bạn đang vận hành một sàn TMĐT với doanh thu hàng nghìn đô mỗi giờ. Đùng một cái, phần cứng server sập hoặc Nginx bị crash ngay lúc nửa đêm. Nếu chỉ dùng một server đơn lẻ, hệ thống sẽ “ngỏm” cho đến khi bạn kịp bật máy tính để fix lỗi. Đó là lúc High Availability (HA) Cluster trở thành cứu cánh.

Mình từng nếm trái đắng khi hệ thống thiếu cơ chế HA. Đợt CentOS 8 đột ngột khai tử (EOL), mình phải migrate gấp 5 server production sang Rocky Linux chỉ trong 7 ngày. Áp lực cực lớn vì mỗi phút downtime đều quy đổi ra tiền mặt. Nhờ triển khai Pacemaker và Corosync từ trước, mình đã chuyển các resource qua lại giữa các node mà người dùng chẳng hề hay biết. Dưới đây là quy trình xây dựng một hệ thống “sống dai” mà mình đã đúc kết lại.

Quick Start: Chạy HA Cluster trong 5 phút

Trước khi gõ lệnh, hãy chuẩn bị ít nhất 2 server chạy CentOS, Rocky Linux hoặc AlmaLinux. Giả sử cấu hình như sau:

  • Node 1: 192.168.1.10 (hostname: node1)
  • Node 2: 192.168.1.11 (hostname: node2)
  • Virtual IP (VIP): 192.168.1.100 (Địa chỉ đại diện cho cả cụm cluster)

Bước 1: Cài đặt gói phần mềm

Thực hiện cài đặt các thành phần cốt lõi trên cả 2 node:

# Cài đặt repo và các gói cần thiết
yum install -y pacemaker corosync pcs

# Kích hoạt pcsd chạy cùng hệ thống
systemctl enable --now pcsd

Bước 2: Thiết lập mật khẩu cho user hacluster

Hệ thống sẽ tự tạo user hacluster sau khi cài đặt. Bạn cần đặt mật khẩu đồng nhất trên cả 2 node để chúng có thể bắt tay nhau.

passwd hacluster

Bước 3: Khởi tạo Cluster

Lúc này, bạn chỉ cần đứng ở Node 1 và thực hiện các lệnh sau:

# Xác thực giữa các node
pcs host auth node1 node2 -u hacluster

# Tạo cluster với tên 'my_cluster'
pcs cluster setup my_cluster node1 node2

# Kích hoạt cluster trên toàn bộ các node
pcs cluster start --all
pcs cluster enable --all

Bước 4: Cấu hình Virtual IP (VIP)

VIP là bộ mặt của hệ thống. Nếu Node 1 chết, IP này sẽ tự động nhảy sang Node 2 trong vòng chưa đầy 5 giây.

# Tắt STONITH (chỉ áp dụng cho môi trường Lab/Test)
pcs property set stonith-enabled=false

# Tạo resource IP ảo
pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s

Dùng lệnh pcs status để kiểm tra. Nếu thấy virtual_ip báo Started là bạn đã thành công một nửa.

Giải mã cơ chế: Trái tim và Bộ não của Cluster

Nhiều bạn thường nhầm lẫn giữa Pacemaker và Corosync. Hãy hình dung Cluster như một đội bóng để dễ phân biệt:

Corosync: Lớp truyền tin (Messaging Layer)

Corosync đóng vai trò là nhịp tim (heartbeat). Nó liên tục gửi các gói tin nhỏ giữa các server để xác nhận: “Tôi vẫn ổn!”. Khi Node A ngừng nhận tin nhắn từ Node B, Corosync sẽ lập tức phát tín hiệu báo động rằng Node B đã offline.

Pacemaker: Trình quản lý tài nguyên (Resource Manager)

Pacemaker đóng vai trò bộ não điều khiển. Dựa trên thông tin từ Corosync, nó sẽ đưa ra quyết định. Nếu Node B sập, Pacemaker sẽ kiểm tra danh sách dịch vụ (Web, DB, VIP) và ra lệnh khởi động chúng trên Node A. Mục tiêu tối thượng là luôn giữ dịch vụ ở trạng thái sẵn sàng.

Cơn ác mộng “Split-brain” và giải pháp STONITH

Chuyện gì xảy ra nếu đường mạng giữa 2 node bị đứt nhưng cả hai vẫn sống? Cả hai sẽ cùng tranh giành Virtual IP và ghi dữ liệu đè lên nhau. Đây là lỗi Split-brain cực kỳ nguy hiểm, có thể làm hỏng toàn bộ database.

Để xử lý, chúng ta dùng STONITH (Shoot The Other Node In The Head). Khi có tranh chấp, node khỏe mạnh sẽ gửi lệnh “hạ gục” node lỗi thông qua phần cứng (như iLO, IPMI). Điều này đảm bảo tại một thời điểm chỉ có duy nhất một node nắm quyền điều khiển.

Cấu hình nâng cao cho Web Server

Chỉ có Virtual IP là chưa đủ, chúng ta cần gắn nó với một dịch vụ thực tế như Nginx.

1. Cài đặt Nginx

yum install -y nginx
systemctl enable nginx # Lưu ý: Không start thủ công, hãy để Pacemaker quản lý

2. Tạo Resource cho Nginx

pcs resource create web_server ocf:heartbeat:nginx configfile=/etc/nginx/nginx.conf op monitor timeout=20s interval=10s

3. Thiết lập ràng buộc (Constraints)

Mặc định, Pacemaker có thể chạy VIP ở Node 1 nhưng Web lại ở Node 2. Điều này khiến hệ thống mất tác dụng. Bạn cần ép chúng đi cùng nhau (Colocation) và theo thứ tự (Order).

# Ép VIP và Web Server chạy trên cùng một node
pcs constraint colocation add web_server with virtual_ip INFINITY

# Đảm bảo VIP phải lên trước, sau đó mới đến Web Server
pcs constraint order virtual_ip then web_server

Kinh nghiệm thực chiến: Những lỗi dễ “ăn hành”

Từ đợt migrate hệ thống lớn trước đây, mình rút ra 4 lưu ý sống còn cho anh em sysadmin:

  • Mở port Firewall: Cluster cần nói chuyện qua các port 2224, 3121, 5403/tcp và 5404, 5405/udp. Nếu pcs status báo OFFLINE dù dịch vụ đã chạy, hãy check ngay firewalld.
  • Xử lý Quorum: Với cluster chỉ có 2 node, nếu 1 node chết, node kia sẽ mất đa số phiếu (Quorum) và tự dừng dịch vụ. Hãy gõ pcs property set no-quorum-policy=ignore để node còn lại vẫn hoạt động bình thường.
  • Đồng bộ dữ liệu: Pacemaker chỉ quản lý bật/tắt, nó không giúp bạn đồng bộ code hay file config. Bạn nên kết hợp thêm rsync hoặc dùng Shared Storage như NFS/GlusterFS.
  • Cẩn thận với SELinux: Đừng tắt hẳn SELinux vì sẽ kém bảo mật. Hãy dùng semanage để cấp quyền cho các script của Pacemaker. Bạn có thể xem lại bài hướng dẫn SELinux trên blog của mình để làm đúng chuẩn.

Làm chủ Pacemaker và Corosync giúp bạn tự tin hơn khi vận hành hệ thống lớn. Khi có sự cố, cluster tự xử lý trong vài giây, giúp bạn có những giấc ngủ ngon thay vì phải trực chiến xuyên đêm.

Share: