vMotion cho phép di chuyển máy ảo VMware đang chạy từ một máy chủ ESXi vật lý sang máy chủ khác mà không gián đoạn hoạt động và dừng bất kỳ dịch vụ nào. Trong bài viết này chúng ta sẽ thảo luận các tính năng VMware vMotion: cách vMotion hoạt động, các loại vMotion nào tồn tại và cách di chuyển máy ảo giữa các ESXi host hoặc storage thủ công. Chúng ta cũng sẽ xem xét các phương pháp điển hình để tối ưu hóa và khắc phục sự cố vMotion.
Như chúng ta đã nói, vMotion cho phép bạn thực hiện di chuyển trực tiếp máy ảo mà không có downtime hay gián đoạn công việc của người dùng. vMotion không được định vị là cách cung cấp high availability cho VM. Trước hết, nó là công cụ đơn giản và tiện lợi để di chuyển VM sản xuất, khi bạn phải bảo trì/cập nhật/thay thế máy chủ vật lý với ESXi hypervisor đã cài đặt hoặc mảng lưu trữ. Ngoài ra, DRS (Dynamic Resource Scheduler), công nghệ cho phép phân phối (cân bằng) tải của máy chủ vật lý, dựa trên vMotion.
Công nghệ tương tự của Microsoft để di chuyển VM giữa các Hyper-V host được gọi là Hyper-V Live Migration.

VMware vMotion hoạt động như thế nào?
Để di chuyển VM giữa các máy chủ vật lý bằng vMotion, các thành phần VMware sau được sử dụng:
- Máy chủ quản lý VMware vCenter;
- Shared storage (kết nối bằng Fibre Channel, iSCSI hoặc NAS), lưu trữ file máy ảo. Shared storage cho phép nhiều ESXi host vật lý truy cập file của cùng một VM trong SAN;
- Mạng nhanh chung (ít nhất 1GB Ethernet) giữa ESXi host nguồn và đích. Khi di chuyển VM, nó giữ nguyên địa chỉ MAC gốc, và vMotion thông báo cho network switch rằng vị trí địa chỉ MAC của máy ảo đã thay đổi. Điều này cho phép giữ kết nối mạng hoạt động;
- Tương thích CPU trên các host hoặc bật tùy chọn Enhanced vMotion Compatibility (EVC).
vMotion thực hiện live migration như thế nào? Trước tiên, một bản sao bóng (shadow clone) của VM nguồn với cùng cấu hình (từ file VMX) được tạo trên host đích. VM clone này thấy tất cả file VM trên shared storage. Nội dung RAM và trạng thái VM đang chạy được chuyển qua mạng từ host nguồn sang host đích ESXi. vMotion tạo snapshot bộ nhớ VM và sao chép nó sang máy chủ đích qua mạng. Đồng thời, vMotion theo dõi thay đổi trên các trang bộ nhớ và chỉ sao chép các đoạn bộ nhớ đã sửa đổi (có thể xảy ra trong vài giai đoạn, mỗi lần ít dữ liệu hơn và mất ít thời gian hơn).
Ở một thời điểm nào đó, trạng thái VM nguồn bị đóng băng, các đoạn bộ nhớ đã thay đổi và lệnh CPU được sao chép và VM được khởi động trên ESXi host đích. Toàn bộ quá trình mất vài giây cho VM cỡ trung bình trên mạng Ethernet 1/10 GB.
Các loại VMware vMotion
VMware hiểu vMotion như một toàn bộ các công nghệ khác nhau cho phép di chuyển VM đang chạy on-the-fly giữa các host, mảng lưu trữ, thành phố hoặc hạ tầng on-premises và cloud.
Các loại vMotion:
- Standard vMotion – di chuyển VM đang chạy giữa các ESXi host;
- Storage vMotion – di chuyển online file máy ảo giữa các datastore (mảng lưu trữ SAN, NAS, vVol, NFS, v.v.);
- Shared-Nothing vMotion – di chuyển VM giữa các máy chủ ESXi trong mạng mà không dùng shared storage (yêu cầu mạng L2);
- Long Distance vMotion – di chuyển VM giữa các site từ xa (Round Trip Time tối đa lên đến 150 ms, bao gồm cả mạng L3). Được giới thiệu trong vSphere 6.0;
- Encrypted vSphere vMotion – cho phép mã hóa VM khi truyền qua mạng (có sẵn trong vSphere 6.5);
- Cross-Cloud Cold and Hot Migration – di chuyển online hoặc offline giữa on-prem và cloud infrastructure.
Tính năng VMware Storage vMotion
Như chúng ta đã nói, Storage vMotion cho phép bạn di chuyển file của máy ảo đang chạy (ổ cứng ảo vmdk và file cấu hình) sang datastore VMFS/NFS/vVol khác (LUN, mảng lưu trữ) mà không dừng VM.
Yêu cầu để chạy Storage vMotion thành công:
- Loại ổ đĩa VM phải là persistent hoặc RDM;
- Không hỗ trợ di chuyển VM trong lúc cài đặt VMware Tools;
- Phiên bản VMFS của datastore quan trọng cho việc di chuyển. Ví dụ: không thể di chuyển file vmdk lớn hơn 2 TB từ VMFS5 sang VMFS3;
- Giấy phép trên ESXi host;
- Host chạy VM phải có quyền truy cập cả datastore nguồn và đích;
- Công nghệ Changed Block Tracking (CBT) được dùng khi sao chép ổ cứng ảo máy ảo. Nó cho phép theo dõi các block dữ liệu đã thay đổi và sao chép chúng.
Enhanced vMotion Compatibility (EVC) trong VMware
Enhanced vMotion Compatibility (EVC) cho cụm VMware HA/DRS được dùng nếu cụm dựa trên các host có CPU các thế hệ khác nhau (nhưng KHÔNG phải nhà sản xuất khác nhau!!!). Nếu bạn bật EVC cho cụm, hypervisor bắt đầu che mặt (mask) các lệnh CPU không được hỗ trợ bởi tất cả host. Khi EVC được bật, tất cả tính năng CPU của ESXi host trong cụm trở nên tương thích với một tập hợp tối thiểu các tập lệnh bộ vi xử lý cơ bản do quản trị viên vSphere đặt trong cài đặt cụm.
Như vậy, nhờ EVC, bạn có thể di chuyển VM giữa các host với các tập hợp lệnh bộ vi xử lý được hỗ trợ khác nhau.
Không trộn lẫn host với các nhà cung cấp bộ vi xử lý khác nhau, như Intel hoặc AMD, trong cùng một cụm vSphere. EVC chỉ cho phép đạt được tương thích giữa các bộ vi xử lý của cùng một nhà cung cấp.
Bạn có thể bật VMware EVC ở cấp độ cụm. Đi đến Configure → Configuration → VMware EVC và nhấp Edit.

Nếu bạn bật EVC cho cụm, bạn phải chọn chế độ EVC (cho host AMD hoặc Intel) và chọn từ danh sách thả xuống thế hệ CPU tối thiểu của nhà cung cấp này bạn có trong cụm VMware của mình.

VMware khuyến nghị luôn bật EVC bất kể bạn có host nào trong cụm. Nếu bạn muốn mở rộng cụm, sẽ dễ dàng hơn. Thậm chí có một bài KB riêng chứng minh rằng ngay cả khi VM của bạn không dùng đầy đủ tập lệnh CPU, nó cũng không ảnh hưởng đến hiệu suất host.
VMware vSphere 6.7 giới thiệu công nghệ di chuyển giữa cloud và on-premises (Cross-Cloud Cold and Hot Migration). Để di chuyển VM lên cloud, bạn có thể bật Per-VM EVC trong cài đặt VM (có sẵn trong vSphere 6.7 với Hardware Version 14).
Bạn có thể lấy mức EVC cơ sở được đặt cho VM trong cụm bằng PowerCLI:
Get-VM | Select Name,HardwareVersion,
@{Name='VM_EVC_Mode';Expression={$_.ExtensionData.Runtime.MinRequiredEVCModeKey}},
@{Name='Cluster_Name';Expression={$_.VMHost.Parent}},
@{Name='Cluster_EVC_Mode';Expression={$_.VMHost.Parent.EVCMode}} | ft
Để lấy chế độ EVC tối đa được hỗ trợ:
Get-VMHost | Select-Object Name,ProcessorType,MaxEVCMode
Cách bật vMotion trong VMware vSphere?
Hãy xem cách bật và cấu hình vMotion trong VMware vSphere 6.7. Để dùng vMotion, chỉ cần có giấy phép VMware Essentials Plus.
vMotion được bật ở cấp độ VMkernel của virtual switch ESXi host. Chọn host và đi đến Configure → Networking → VMkernel adapters.
Chọn VMkernel adapter của bạn và nhấp Edit.

Trong thuộc tính cổng vmk, bật vMotion trong phần Enabled Services.

Trong ví dụ của tôi, cụm VMware HA đã được tạo và vSphere Distributed Switch (VDS) được sử dụng.
Cách di chuyển VM giữa các host bằng vMotion?
Để di chuyển VM đang chạy giữa hai ESXi host, mở vSphere Client, chuột phải vào VM bạn muốn di chuyển và chọn Migrate.

Chọn loại di chuyển bạn muốn dùng:
- Change compute resource only — di chuyển VM sang ESXi host khác;
- Change storage only — đây là Storage vMotion (thay đổi datastore chứa file VM);
- Change both compute resource and storage — chế độ di chuyển không shared storage (vMotion without shared storage/Shared-Nothing), file VM được sao chép giữa các host qua mạng
Tôi đã chọn tùy chọn đầu tiên.
Wizard di chuyển sẽ đề nghị bạn chọn host, cụm, resource pool hoặc vApp để di chuyển máy ảo đến. Chọn host. Nếu vMotion được cấu hình đúng và không tìm thấy xung đột, bạn sẽ thấy thông báo Compatibility checks succeeded trong phần Compatibility.
Nếu bạn thấy bất kỳ lỗi nào trong tab compatibility, hãy nghiên cứu kỹ và khắc phục chúng.
Nhấp Next.

Wizard di chuyển VM sẽ nhắc bạn chọn mạng để đặt vNIC của VM trên host đích. Nếu bạn muốn VM có sẵn sau di chuyển, hãy đặt nó trong cùng phân đoạn mạng (VLAN) như trên host nguồn. Nếu bạn dùng standard vSphere Switch, hãy tạo cùng Port Group trên tất cả ESXi host. Khi dùng VDS, các port group trên tất cả host cụm là giống nhau.

Ở bước cuối, chọn độ ưu tiên của tác vụ vMotion. Mặc định, độ ưu tiên cao nhất được dùng (Schedule vMotion with high priority). Tôi luôn dùng nó.

Sau đó nhấp Next → Finish và việc di chuyển VM sang host khác sẽ bắt đầu. Bạn có thể theo dõi trạng thái di chuyển trong panel Recent Tasks (tác vụ Relocate virtual machine). Trong trường hợp của tôi, di chuyển VM bằng vMotion qua Ethernet 10 GB mất khoảng 3 giây.
Đảm bảo VM của bạn hiện đang chạy trên ESXi host khác.

Bạn có thể di chuyển VM đang chạy sang host khác trong PowerCLI bằng cmdlet PowerShell Move-VM. Ví dụ, chúng ta muốn di chuyển tất cả VM từ mun-esxi01 sang mun-esxi02:
Get-VMHost mun-esxi01|Get-Vm| Move-VM –Destination (Get-VMHost mun-esxi02)
Tại sao VMware vMotion không hoạt động?
Dưới đây là danh sách lý do điển hình khiến vMotion thất bại hoặc di chuyển VM rất chậm:
- Không tương thích CPU (bật chế độ EVC/Enhanced vMotion Compatibility);
- vMotion không được bật trong giao diện VMkernel;
- Cài đặt mạng không đúng của ESXi host hoặc virtual switch, port group (Jumbo Frames cấu hình sai, xung đột IP trong mạng vMotion, cài đặt vSwitch không đúng, mạng chậm, mất gói tin);
- Không có shared storage (cho vSphere 5.1 trở về trước). Trong vSphere 5.1 trở lên Shared-Nothing vMotion có sẵn;
- Ổ CD/DVD hoặc image ISO không có sẵn trên host đích;
- Bật quy tắc Anti-Affinity;
- VMware Tools đang được cài đặt trong guest OS;
- Nếu guest OS đang chủ động thay đổi nội dung RAM, vMotion có thể kịp di chuyển dữ liệu đã sửa đổi sang bản sao VM trên host khác qua mạng;
- Nếu host đích không có đủ tài nguyên CPU hoặc RAM để tạo VM bóng, vMotion sẽ thất bại với lỗi.
Nếu xảy ra lỗi di chuyển vMotion, VM của bạn không tắt và vẫn chạy trên host nguồn.
Cách cải thiện/tối ưu tốc độ vMotion để di chuyển VM nhanh hơn?
Bạn có thể tăng tốc di chuyển máy ảo theo một số cách.
- Trước hết, tốt hơn là dùng mạng hiệu suất cao nhất giữa hai ESXi host. Dùng ít nhất mạng 10 GB, 25 GB thậm chí tốt hơn (card mạng ESXi server và switch vật lý phải hỗ trợ chế độ này);
- Sử dụng các giao diện vật lý khác nhau cho lưu lượng vMotion;
- Di chuyển vMotion sử dụng thread (còn gọi là streams). Một thread được tạo cho mỗi VMkernel với vMotion được bật. Tuy nhiên, thread này chỉ có thể dùng một nhân bộ vi xử lý.
Để cung cấp nhiều hơn một nhân CPU cho quy trình vMotion, hãy tạo nhiều giao diện VMkernel, bật vMotion cho chúng và liên kết chúng với một giao diện NIC. Một thread vMotion có thông lượng trung bình khoảng 15 GbE, nên để tải 100 GbE, bạn cần 6 thread.
Cũng có thể tăng số thread vMotion cho một giao diện VMkernel bằng tùy chọn Migrate.VMotionStreamHelpers trong Advanced System Settings.