Bẫy High Availability: Khi 2 VM dự phòng cùng nằm trên một máy chủ vật lý
Hệ thống có 2 máy ảo Web chạy song song sau Load Balancer. Về lý thuyết, một node chết thì node kia vẫn gánh tải bình thường. Mọi thứ tưởng như đã đạt chuẩn High Availability (HA).
Thế rồi sự cố ập đến. Một máy chủ ESXi sập nguồn do hỏng card nguồn (PSU). Toàn bộ dịch vụ web lập tức lăn ra chết. Mở vCenter ra kiểm tra, bạn phát hiện cả 2 máy ảo dự phòng bấy lâu nay đều nằm chung trên đúng một máy chủ vật lý vừa sập. Thủ phạm chính là tính năng tự động cân bằng tải (DRS). Khi thấy host này còn dư nhiều RAM, DRS đã gom cả hai VM về một chỗ để tối ưu tài nguyên.
Trong cụm cluster từ 4 đến 16 host ESXi, DRS chỉ tính toán dựa trên mức tiêu thụ CPU và RAM theo chu kỳ 5 phút/lần. Hệ thống hoàn toàn không tự hiểu được hai máy ảo nào đang làm nhiệm vụ dự phòng cho nhau. Để giải quyết triệt để rủi ro này, bạn bắt buộc phải dùng DRS Affinity Rules và Anti-Affinity Rules.
Hiểu đúng: Affinity Rules và Anti-Affinity Rules là gì?
Nguyên lý vận hành rất trực quan:
- Affinity (Hút nhau): Ép buộc hoặc ưu tiên gom các đối tượng về chạy cạnh nhau.
- Anti-Affinity (Đẩy nhau): Bắt buộc tách các đối tượng ra các host khác nhau, tuyệt đối không cho ở chung.
1. VM-VM Rules (Luật điều phối giữa các máy ảo)
- Keep Virtual Machines Together (Affinity): Nhóm VM chỉ định luôn chạy trên cùng 1 host ESXi. Điển hình là cặp máy ảo App và Database có lưu lượng nội bộ lên tới hàng nghìn request/giây. Chạy chung host giúp gói tin đi thẳng qua vSwitch trên RAM, đạt tốc độ hàng chục Gbps mà không tốn băng thông switch vật lý.
- Separate Virtual Machines (Anti-Affinity): Nhóm VM bắt buộc phải nằm trên các host khác nhau. Đây là quy tắc sống còn cho cụm 2 Domain Controller (Active Directory), cặp SQL Server AlwaysOn hoặc 2 proxy NGINX gánh tải.
2. VM-Host Rules (Luật gán nhóm máy ảo vào nhóm máy chủ vật lý)
Cơ chế này liên kết một nhóm máy ảo (VM DRS Group) với một nhóm máy chủ (Host DRS Group). Có hai cấp độ ràng buộc:
- Must run on / Must NOT run on (Hard rule – Bắt buộc 100%): DRS và vSphere HA phải tuân thủ tuyệt đối. Nếu toàn bộ host trong nhóm bị sập, VM sẽ tắt ngúm chứ HA nhất quyết không bật nó trên host ngoài danh sách. Cấp độ này chủ yếu dùng khi dính bản quyền phần mềm tính theo CPU core (như Oracle DB hay MS SQL Enterprise) hoặc máy chủ có gắn card phần cứng chuyên dụng (PCIe Passthrough, GPU).
- Should run on / Should NOT run on (Soft rule – Ưu tiên linh hoạt): Bình thường DRS sẽ giữ VM trên nhóm host chỉ định. Nhưng nếu xảy ra sự cố sập host hoặc thiếu hụt tài nguyên, vSphere HA vẫn được phép bật VM sang host khác để giữ uptime dịch vụ.
Hướng dẫn thực hành: Cấu hình Rules trên vSphere
Cách 1: Thiết lập VM-VM Anti-Affinity Rule qua vSphere Client
Ví dụ: Tách 2 máy ảo VM-Web-01 và VM-Web-02 sang 2 host ESXi khác nhau.
- Đăng nhập vào vSphere Client (giao diện HTML5).
- Chọn Cluster tương ứng ở cây thư mục bên trái.
- Vào tab Configure > chọn VM/Host Rules.
- Nhấn Add để tạo rule mới.
- Đặt tên rule:
Rule-AntiAffinity-WebTier. - Đánh dấu tích vào ô Enable rule.
- Tại mục Type, chọn
Separate Virtual Machines. - Bấm Add ở danh sách bên dưới, tick chọn
VM-Web-01vàVM-Web-02. - Bấm OK. Nếu 2 VM này đang ở chung một máy chủ vật lý, DRS sẽ tự động kích hoạt vMotion chuyển 1 VM sang host khác ngay lập tức.
Cách 2: Cấu hình VM-Host Rule cho nhóm Database (Tối ưu License)
Kịch bản: Cụm có 8 host, nhưng bạn chỉ mua license Oracle cho 2 host esxi-01 và esxi-02. Ta cần gom 3 máy ảo DB vào 2 host này.
- Vào tab Configure của Cluster > chọn VM/Host Groups.
- Tạo VM Group: Đặt tên
VMG-Oracle-DBs, chọn 3 máy ảo DB. - Tạo Host Group: Đặt tên
HG-Oracle-Licensed-Hosts, chọnesxi-01vàesxi-02. - Chuyển sang mục VM/Host Rules, nhấn Add.
- Tại ô Type, chọn
Virtual Machines to Hosts. - Chọn VM Group:
VMG-Oracle-DBs. - Chọn quan hệ:
Should run on hosts in group(dùng Should để dự phòng khi host chết máy ảo vẫn bật lại được) hoặcMust run on hosts in group(nếu kiểm toán license phạt nặng). - Chọn Host Group:
HG-Oracle-Licensed-Hostsrồi nhấn OK.
Cách 3: Tự động hóa bằng VMware PowerCLI
Dùng PowerShell script nếu bạn quản lý hàng chục cụm cluster hoặc cần tích hợp vào pipeline CI/CD cấp phát máy ảo:
# 1. Kết nối tới vCenter
Connect-VIServer -Server vcenter.company.local -User "[email protected]" -Password "MatKhau@123"
# 2. Khai báo thông số
$clusterName = "Production-Cluster"
$ruleName = "AntiAffinity-DomainControllers"
$vmList = Get-VM -Name "DC-01", "DC-02"
# 3. Tạo VM-VM Anti-Affinity Rule
$cluster = Get-Cluster -Name $clusterName
New-DrsRule -Cluster $cluster -Name $ruleName -KeepTogether $false -VM $vmList -Enabled $true
# 4. Kiểm tra danh sách rule đang kích hoạt
Get-DrsRule -Cluster $cluster | Format-Table Name, Enabled, KeepTogether
Đoạn script tạo VM-Host Rule (Soft Rule):
# Tạo nhóm VM và nhóm Host
$vmGroup = New-DrsClusterGroup -Cluster $cluster -Name "VMG-AppServers" -VM (Get-VM -Name "App-01", "App-02")
$hostGroup = New-DrsClusterGroup -Cluster $cluster -Name "HG-Rack01" -VMHost (Get-VMHost -Name "esxi-01.local", "esxi-02.local")
# Tạo Soft Rule (ShouldRunOn)
New-DrsRule -Cluster $cluster -Name "Rule-App-To-Rack01" -Type VmHostRule `
-VMGroup $vmGroup -HostGroup $hostGroup -RuleType "ShouldRunOn" -Enabled $true
3 lỗi kinh điển khiến hệ thống tê liệt khi dùng DRS Rules
- Treo tiến trình bảo trì ở mức 66%: Khi bạn đưa một host ESXi vào Maintenance Mode, DRS sẽ di tản toàn bộ máy ảo sang host khác. Nếu trên host có máy ảo dính luật Must run on mà các host còn lại trong nhóm không đủ RAM/CPU, task bảo trì sẽ dừng vô thời hạn ở mốc 66%.
- Xung đột chéo giữa các luật (Conflicting Rules): Tạo rule A bắt
VM-01đi chung vớiVM-02, nhưng rule B lại cấmVM-01chạy cùng subnet host vớiVM-02. Khi xảy ra xung đột, vCenter sẽ báo cảnh báo vàng (Yellow Alert) và tắt luôn khả năng cân bằng tải tự động của DRS cho các VM liên quan. - Lạm dụng luật “Must” thay vì “Should”: Nếu không bị ràng buộc pháp lý gắt gao về bản quyền CPU, hãy luôn ưu tiên Should run on. Chọn Must đồng nghĩa bạn đang tước đi quyền cứu hộ tự động của vSphere HA khi thảm họa phần cứng xảy ra.
Tổng kết
Phần cứng mạnh chưa đủ để tạo nên một hệ thống hạ tầng ổn định. Điểm mấu chốt nằm ở chiến lược phân bổ máy ảo. Dành 5 phút rà soát và thiết lập Anti-Affinity Rules cho các cặp VM trọng yếu sẽ giúp bạn loại bỏ hoàn toàn rủi ro “mất trắng cụm dịch vụ chỉ vì một thanh nguồn hỏng”.

