简介:面向VMware vSphere平台运维工程师、虚拟化架构师及数据中心管理人员,这份完整存储迁移实战方案以某制造业大厂真实环境为背景,解决在线切换迁移中停机窗口短、业务连续性要求高的痛点。方案从迁移前必读、环境准备到目标存储映射、数据热迁移、源存储移除和业务调测,再到回退预案,形成了全流程闭环。特别是第3章包含基础信息统计、机房布线、ESXi主机光纤卡更换、RAID/LUN规划、SAN交换机规划及数据备份等操作要点,第5章专门设计了回退场景与步骤,可作为同类项目的重要参考模板。资源包内含1个doc格式文档,共1份文件,压缩包大小1.92MB,内容以图文步骤和配置规划为主,便于直接查阅和落地实施。目前已有139人学习下载。总体而言,这份完整版方案兼具操作性和风险控制意识,适合需要独立规划或执行vSphere存储迁移的技术人员学习引用。
1. vSphere存储在线切换迁移解决的是什么问题
一台承载着几百台VM的ESXi主机,底层LUN所在的存储阵列经常需要做设备替换、容量重组、跨机房搬迁或厂商统一替换。传统做法是关机、卸载存储、切换、再挂载,每台VM都要经历一次停机窗口。业务方给的时间通常只有周末凌晨的4小时,但虚拟机数量一多,关机开机加配置变更根本排不过来。
Storage vMotion提供了一条不停机的路径:通过vCenter把虚拟机磁盘从旧存储在线迁移到新存储。数据复制、校验、切换全部在虚拟机运行状态下完成,业务侧只感知到磁盘在迁移完成后的一次极短I/O冻结。这个方案的关键不在于“能不能迁”,而在于“怎么评估、怎么执行、怎么保证迁移失败时能回到原状态”。真正成熟的企业落地,不只是点一个迁移按钮,而是把存储可达性、底层阵列特性、路径策略、回退预案全部提前排好,再动手。
这篇文档按一线操作顺序,讲清楚vSphere存储在线切换迁移怎么落地:迁移前检查什么、迁移怎么执行、出了问题怎么回退、迁移完成后看哪些指标。
2. 迁移前的检查、评估与路径设计
2.1 Storage vMotion的机制决定了哪些前置条件不能省
Storage vMotion不是简单的文件复制。vCenter会在目标数据存储上创建新的虚拟磁盘,然后通过ESXi主机把源磁盘的数据块逐步复制过去,复制完成后短暂暂停虚拟机I/O,完成磁盘切换。整个过程的正确性依赖三点:源存储、目标存储、ESXi主机三者之间的网络和存储路径通畅,目标数据存储足够容纳磁盘快照与增量数据,以及源VM的磁盘拓扑没有妨碍迁移的属性。
目标存储剩余空间需要按“源磁盘实际使用量 + 迁移期间的写入增量 + 目标端建盘开销”来估算。迁移期间源磁盘的写入数据不会立刻复制到目标端,vSphere通过bitmap跟踪脏块,直到最终切换前再做一轮增量同步。如果目标存储空间不足以容纳最终同步时的全部脏数据,迁移会卡住甚至超时失败。
检查项按表格来逐条确认。
| 检查项 | 检查内容 | 不满足时的典型后果 |
|---|---|---|
| vCenter版本与许可证 | 确认vCenter与ESXi版本在同一个受支持矩阵内,且许可证含Storage vMotion | 迁移按钮置灰,或迁移到一半报错 |
| 目标数据存储 | 容量、块大小、多路径策略、是否属于同一存储域 | 迁移慢、目标vmfs满、切换失败 |
| 源VM磁盘类型 | 是否存在独立(Independent)磁盘、RDM物理模式、快照 | RDM物理模式无法在线迁移,需先做处理 |
| 主机存储路径 | 源与目标LUN是否都被ESXi识别,路径状态是否active | 目标LUN不可见时直接失败 |
| 网络连接 | vMotion网络是否配置,管理网络与存储网络是否可达 | 迁移中途连接中断,切换阶段异常 |
| 存储I/O负载 | 源阵列和目标阵列的时延与队列深度 | 迁移拖慢业务I/O,出现磁盘重置 |
2.2 用命令确认源与目标存储的底层状态
UI界面能看到LUN是否在线,但看不到路径状态和底层设备细节。上机操作第一步是用命令行把存储设备信息拉出来看。
esxcli storage core device list esxcli storage core path list esxcli storage nmp device list第一条命令列出主机识别到的所有存储设备,包括设备名、型号、序列号、传输协议(SAS/FC/iSCSI)、是否为本地设备。第二条看每条路径的状态,重点看是否有“dead”路径。第三条看NMP(Native Multipathing Plugin)给每个设备分配的路径策略,是VMW_PSP_FIXED还是VMW_PSP_RR,以及当前活动路径。
我看到不少迁移失败案例,根源在目标LUN虽然已经映射给主机,但路径策略是默认的FIXED,且活动路径指向一条性能很差的链路,数据复制阶段慢得离谱。建议在迁移前把目标存储的路径策略统一确认一遍,尤其是FC环境里多控制器双活的情况。
2.3 网络与存储可达性必须单独验证
很多工程师习惯在vCenter里看两眼就直接迁移,忽略了一个问题:Storage vMotion的数据流走的是ESXi主机到两端存储的链路,不走vCenter的数据通路。vCenter只负责下发任务和收集状态,数据复制是主机自己完成的。如果ESXi主机到目标存储所在阵列的管理地址、存储地址有防火墙规则没放通,迁移会一直卡在建连阶段。
验证手段用vmkping,直接确认主机到存储端口的连通性。
vmkping -I vmk2 10.10.20.1 -c 5 -s 1472-I指定走哪个vmkernel网卡,-c指定发包数,-s指定包大小。1472字节接近以太网MTU上限,可以验证巨型帧配置是否正确。这个命令在迁移前跑一遍,能过滤掉大量“网络明明通但性能极差”的隐性故障。存储网络不通时ping不通,巨型帧不匹配时小包通但大包不通,两种情况在迁移过程中表现完全不同。
带外验证做完,还要看vCenter迁移任务中“目标数据存储可达性”检查是否通过。UI里发起迁移时,vCenter会主动检查主机是否能看到目标存储,这个检查没过时会在任务详情里直接给出原因。
3. 用UI与CLI执行存储在线迁移的完整过程
3.1 vSphere Client里的操作路径与关键选项
UI迁移适用于单台或少量VM。在vSphere Client中选中虚拟机,右键选择“迁移”,计算资源保持当前主机不变,只勾选“存储”,然后选择目标数据存储。
这里有几个选项决定了迁移行为的差异。
VM存储策略:如果环境里配置了SPBM策略,这里会要求选择一个适用于目标存储的策略。没有配置策略的环境选择“保持现有VM存储策略”即可,不要乱选,否则迁移完成后虚拟机被自动应用了不合适的策略,后续做快照或克隆时可能出现兼容性提示。
磁盘格式:默认选择“与源格式相同”。如果源是精简置备,目标继续保持精简;源是厚置备,默认保持厚置备。只有在明确需要转换格式时才改成thin或thick。我的建议是迁移期间不要顺手转换格式,格式转换会让迁移时间明显变长,而且最终切换阶段的耗时也会增加。先迁移,再做格式调整,便于把每一步变数隔离开。
选择完成后,任务会出现在“近期任务”面板。迁移过程分两个大阶段:复制阶段和切换阶段。复制阶段可以看到进度百分比,I/O密集程度取决于源存储负载。切换阶段通常在秒级完成,VM会短暂失去磁盘响应,但不会断电。
3.2 批量迁移用PowerCLI控制节奏
多台VM迁移必须用脚本。PowerCLI里对应的命令是Move-VM,但直接写Move-VM没有节奏控制,几十台VM同时开跑会把存储I/O打满。我一般会分批跑,每批5台,每台之间间隔几十秒,并且指定Datastore参数。
$targetDs = Get-Datastore -Name "ds-new-storage" $vmList = Get-VM | Where-Object { $_.PowerState -eq 'PoweredOn' -and $_.Name -like "web-*" } foreach ($vm in $vmList) { Move-VM -VM $vm -Datastore $targetDs -DiskStorageFormat SameAsSource -Confirm:$false Start-Sleep -Seconds 30 }这段脚本先取目标数据存储对象,再筛选名为web-前缀且开机状态的虚拟机,逐个发起迁移。-DiskStorageFormat指定磁盘格式与源保持一致,这里不要省略,否则PowerCLI默认会按目标存储的默认格式重新格式化磁盘。-Confirm:$false跳过交互确认,脚本才能无人值守。
批量执行时不要让脚本里加“等待迁移完成再迁下一台”的逻辑——任务队列放在vCenter里反而更稳妥,vCenter会自己调度迁移子任务。脚本只负责按批次下发。如果想知道一批任务是否结束,用Wait-Task配合Get-Task轮询:
$tasks = foreach ($vm in $vmList) { Move-VM -VM $vm -Datastore $targetDs -DiskStorageFormat SameAsSource -Confirm:$false -RunAsync } $tasks | Wait-Task-RunAsync让Move-VM立即返回任务对象,之后Wait-Task统一等待所有任务结束。这样脚本的输出是阻塞式的,适合串行执行多批迁移时精确控制节奏。
3.3 无人值守环境用govc执行迁移
没有Windows环境可以跑PowerCLI时,用govc配合vCenter的API也能完成同样的事情,更适合CI流程或跳板机。
govc vm.migrate -vm web-server-01 -ds ds-new-storagegovc的vm.migrate子命令把存储迁移封装成一次调用。-vm指定需要迁移的虚拟机名称或MoID,-ds指定目标数据存储。这条命令只迁移存储,不迁移计算资源。如果也有冷迁移需求,加上-host参数即可一起迁移主机。
批量执行时用shell循环把VM列表吃进来:
for vm in $(govc ls /dc1/vm/web-*) ; do govc vm.migrate -vm "$vm" -ds ds-new-storage done注意govc vm.migrate默认不做磁盘格式转换。两边的存储格式由数据存储自身的格式决定,这一点和PowerCLI的SameAsSource行为略有差异。需要显式指定格式时用-disk.format参数,取值有thin和eagerZeroedThick等。
3.4 监控迁移过程中的具体进度与I/O状态
迁移任务提交后,最常犯的错是只盯着百分比看。百分比只表示数据复制完成度,不表示迁移状态健康。要判断迁移是否有问题,需要看两个指标:复制速率是否稳定,以及切换阶段是否反复重试。
跨存储迁移期间用esxtop看存储延迟:
esxtop # 进入交互界面后按 d 进入磁盘设备视图 # 按 f 添加字段,勾选 CMD/MB/s 与 DAVG/GAVG # 按空格键开始收集esxtop的Disk视图里,DAVG是设备平均延迟,GAVG是guest平均延迟。迁移过程中如果DAVG持续超过50ms,说明存储侧已经饱和,迁移速度会被拖慢;GAVG大涨说明VM业务I/O受到了影响。这两个值结合起来判断是否该暂停迁移。
暂停迁移不是一个UI按钮,而是把对应的迁移任务取消。Storage vMotion取消后不会破坏源磁盘,VM继续在原存储上运行。取消也是一种操作手段,比硬扛着等任务失败更可控。
4. 迁移中的风险控制、回退与常见报错处理
4.1 迁移失败后的回退设计要事先想清楚
Storage vMotion迁移失败的常见结果是任务报错,但源磁盘不会立刻被破坏。vCenter在复制阶段失败时会保留源磁盘,虚拟机继续运行。在最终切换阶段失败时,情况略复杂:vCenter可能已经把VM的内存态和磁盘状态切换一部分到目标端,此时需要重新发起迁移或手动确认磁盘状态。
设计回退方案要遵守一个原则:迁移被取消或失败后,不要马上重试同一个迁移,先检查源磁盘是否还处于正常挂载状态。检查方法用PowerCLI查询:
Get-VM -Name web-server-01 | Select-Object Name, @{N="Datastore";E={$_.DatastoreIdList}} (Get-VM -Name web-server-01).ExtensionData.LayoutEx.File | Where-Object {$_.Type -eq "diskDescriptor"} | ForEach-Object {$_.BackingObject}如果DeskDescriptor文件仍然指向源数据存储,说明源磁盘还在,可以直接重试或继续排查。如果文件指向目标数据存储但状态异常,说明切换阶段不完整,这时候优先联系存储团队确认目标LUN上的文件完整性,而不是直接反复发起迁移。
多数时候“回退”指的是不修复直接回到原点:在vCenter里把VM重新迁移回原存储,或者取消迁移任务。取消迁移后如果有残留的中间文件(目标数据存储上的临时VMDK),这些文件要手动清理。放在回退检查清单里的第一步永远是:确认目标数据存储上不存在“孤儿磁盘”文件。
4.2 迁移期间源端I/O异常导致切换卡住
我经历过一次真实故障:迁移进度到92%,然后卡了40分钟。表面上还卡在复制阶段,实际源存储底层已经在报磁盘延迟。排查时用了两个命令定位:
esxcli storage core device stats get -d naa.6000000000000a esxcli storage core device latency -d naa.6000000000000adevice stats get查看累计读写次数和重置次数,device latency查看分桶延迟分布。如果重置次数(Resets)在短时间内快速增长,基本可判定存储链路存在严重问题。这种状态持续下去,最终切换会出现I/O冻结超时,VM磁盘进入只读状态。
碰到这类情况,正确做法不是等任务自己超时,而是主动取消任务,评估源存储的健康度。源存储有问题时迁移再多次都是同样结果,先解决源端问题再重新执行迁移。
4.3 VAAI能力缺失导致迁移走慢路径
Storage vMotion依赖vSphere Storage APIs for Array Integration(VAAI)。当目标存储或源存储不支持VAAI的“full copy”功能时,ESXi会退化为慢路径,即把所有数据块当作普通读写在主机和存储之间搬运,迁移速度和CPU占用都会明显恶化。
判断VAAI是否生效,在迁移期间查看主机上的VMkernel日志:
tail -f /var/log/vmkernel.log | grep -i "fullcopy\|ExtentMove\|CloneBlock"如果日志里频繁出现CloneBlock失败或回退到普通读写的信息,说明VAAI没有起到硬件加速作用。进一步查硬件支持状态:
esxcli storage core device vaai status get -d naa.6000000000000a输出里的“Status: supported”表示该设备支持VAAI。如果显示unsupported,说明该存储型号或固件版本没有开放相关接口,迁移只能走慢路径。这种情况下不要盲目调大并发,慢路径下并发高了对业务I/O的影响成倍放大。
VAAI缺失不是错误,但迁移耗时会成倍增加。需要提前告知业务方,存储切换期间虚拟机磁盘性能会有一段时间低于正常水平。
4.4 一个隐蔽的坑:目标数据存储与虚拟机配置文件的路径策略不一致
虚拟机配置文件(VMX)在源数据存储,虚拟磁盘如果已经被迁移到目标存储,此时VM处于“配置和磁盘分离”的状态。如果这次迁移的目标是把整套存储切换掉,这种中间态不能算是完成状态。
常见做法是最后再把VMX也迁移到目标存储。PowerCLI里直接对VM执行Move-VM并指定目标数据存储,会把配置文件和磁盘一起迁;但如果之前已经单独迁移过磁盘,建议再执行一次完整的存储迁移收尾,确保所有VM文件落在同一个数据存储。
用如下命令确认所有文件都在目标存储:
$vm = Get-VM -Name web-server-01 $files = $vm.ExtensionData.LayoutEx.File $files | Where-Object { $_.Type -eq "config" -or $_.Type -eq "diskDescriptor" } | Select-Object Type, Name配置文件路径和目标磁盘路径不在同一个数据存储时,后续做快照或vMotion都可能出现“找不到配置文件”类的二次问题。把迁移当作两步走(先磁盘后配置)的方案,就得在流程里加上第二步。
5. 迁移后的验证方法与两个实用技巧
5.1 迁移完成不等于结束,CPU、内存、存储的三个验证动作
迁移任务显示“已完成”后,第一件事是确认VM的磁盘确实落在目标数据存储,而不是看任务状态。其次检查磁盘格式是否和目标存储预期一致,最后用esxtop对比迁移前后的存储延迟基线。
验证磁盘位置与格式:
Get-VM -Name web-server-01 | Get-HardDisk | Select-Object Name, StorageFormat, FilenameFilename输出应指向目标数据存储的路径,StorageFormat应显示thick或thin,与迁移前的设置一致。如果发现格式变掉了,检查是否在迁移过程中选择了格式转换,或者目标存储的默认格式策略把磁盘重写了。
然后看整体硬件资源使用率,确认迁移没有留下“僵尸磁盘”或异常I/O:
esxtop # 按 c 进入CPU视图,按 m 进入内存视图,按 u 进入存储适配器视图 # 重点观察迁移完成后15分钟内的DAVG是否回落esxtop的存储适配器视图里,如果迁移完成后某个HBA的队列深度仍然持续偏高,说明目标存储还在做后台操作,比如存储端的rebalance或快照合并。这类后台操作不会显示在vCenter任务里,但会导致新存储短期性能低于预期。等后台操作结束后再做最终验收更准。
5.2 用生成负载验证新存储在实际压力下的表现
仅靠日常工作负载验证存储切换是否成功,样本太有限。我一般在低峰期用有代表性的VM做一次压力验证,磁盘顺序读、顺序写、随机读、随机写几类场景都覆盖,每次持续5到10分钟,观察延迟是否在预期范围内。
Linux虚拟机里可以用fio做随机读写测试:
fio --filename=/data/testfile --direct=1 --rw=randrw --bs=4k --size=4G \ --numjobs=4 --runtime=60 --group_reporting --name=storage-check-direct=1绕过Page Cache,读到的是真实存储性能。-rw=randrw表示随机混合读写,-bs=4k模拟典型数据库OLTP场景的块大小,-numjobs=4表示并发4个进程。-runtime=60让测试在60秒后自动结束。测试结束后看输出的read IOPS和write IOPS,以及clat百分位数据。avg lat如果超过10ms,说明新存储的性能不满足预期,需要回到路径策略和存储端配置做调整。
压力测试产生的测试文件要清理掉,避免占满目标数据存储空间。测试前确认目标数据存储上有足够空间容纳测试文件,测试完删除后再做一次数据存储空间复核。
5.3 给批量迁移场景留一个环境变量:先迁读多写少的VM
批量迁移不是一个一个验证完再迁下一批。更常见的做法是第一批发少量低风险VM,验证整个链路(路径、VAAI、网络、目标存储)没问题后,再按“读多写少VM优先、核心数据库最后”的顺序推进。这样做的好处是:即使目标存储存在问题,代价也控制在一小部分非核心VM上,不会把核心业务卷进一次失败的迁移。
迁移完成后的一周内保留源存储上的LUN映射不撤销,确认业务稳定后再执行源LUN的回收。这个期间源数据存储可以作为快速回退的目标端,一旦发现新存储有间歇性I/O抖动,随时可以再迁回去。很多线上事故不是迁移造成的,而是源存储回收太快,给线上留了一个无法回退的绝路。
本文还有配套的精品资源,点击获取