ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

虚拟化集群集体失联:共享存储故障排查与恢复实战

2026/10/6 6:20:37 拓冰建站 浏览量
虚拟化集群集体失联:共享存储故障排查与恢复实战 1. 事故现场9台虚拟服务器集体失联的那个下午1.1 监控大屏上的一片红那天是周四下午两点多我正坐在工位上处理一个关于虚拟化平台容量规划的需求。突然运维值班群里一连串告警弹出来监控大屏上9个虚拟服务器的状态图标在同一时间变成了红色全部失联。刚开始我还以为是个别虚拟机内存溢出导致的机器假死但点开告警列表一看心里咯噔一下——这9台不是普通虚拟机里面有3台是生产数据库节点2台K8s控制面节点还有4台是业务系统的应用服务器。它们分散在不同的物理宿主机上但业务整体瘫痪了。更让我头皮发麻的是物理宿主机全部正常。CPU占用不高内存还剩一大半宿主机之间互相ping也通透整个机房的物理网络跟没事人一样。可是9台虚拟服务器集体“罢工”了业务接口全部超时。那一刻我真正理解了什么叫“服务器是虚拟的惊魂却是实实在在的”——物理机没倒可运行在上面的业务却全没了。当时脑子里飞速闪过几个可能性虚拟化平台整体故障共享存储挂了还是网络链路出了问题因为按常理9台VM分布在4台宿主机上如果只是某一台宿主机宕机最多挂掉它上面那两三台VM不会全线飘红。能同时影响9台VM的必然是它们共同依赖的某层基础设施出了问题。1.2 应急响应先稳住局面再找答案我一边往机柜方向跑一边在脑子里过了一遍应急流程。第一件事是通知业务方“服务异常正在排查”千万别让他们反复重启前端服务——我见过太多人在虚拟化故障时疯狂重启应用结果存储一恢复一堆重复的锁和脏数据冒出来比原始故障还难收拾。第二件事保存现场证据。把监控告警截图、时间轴记录、宿主机和vCenter的日志时间点全部对了一遍。这个习惯救过我很多次事后复盘如果没有准确的“故障时间线”很多问题根本说不清因果。第三件事确认备份和快照状态。虚拟化平台里快照是重要保命手段但共享存储故障时快照同样可能不可用。当时我让另外一位同事去核对备份系统最近一次成功备份的时间点同时我去查虚拟化平台的管理端看这9台VM到底处于什么状态。走进机房的时候我注意到4台宿主机前面板的电源灯和网卡灯全部正常闪烁磁盘阵列柜的硬盘灯也均匀地跳动着——表面上看一切正常但我直觉认为问题大概率出在共享存储这条线上。回到工位打开vCenter管理界面真实情况让我冒了冷汗9台VM的状态显示“已开机”但控制台完全卡死连鼠标都动不了。这就是虚拟化最“诡异”的地方——VM进程还在宿主机里跑着但所有需要读写磁盘的操作全部卡住因为虚拟机的磁盘文件不在本地而在共享存储上。2. 排查路径一层一层剥开“幽灵宕机”2.1 先查网络链路看起来没毛病排查的第一步永远是从最外层往内层走。我先确认了宿主机与核心交换机的连通性4台宿主机的管理口和业务口都能正常访问物理交换机的端口状态也全部up。再试图ping那9台失联VM的内网IP发现完全不通但这里有个关键细节VM的操作系统如果已经卡死网络栈不响应ping不通太正常了根本说明不了什么。我又登录到其中一台宿主机上用esxcli network ip connection list看了看VM的网络连接状态发现连接还在TCP连接表没有清空。这说明网络层面没有断——问题不在虚拟交换机、不在物理网卡、也不在上联交换机。如果网络有问题宿主机上通向VM的路径早就断了连接表不会这么“完整地留着”。这个排查步骤看起来很简单但在虚拟化平台里特别容易被误导。有人看到VM失联就先去重启网络服务其实应该想清楚VM失联是因为网络断了还是因为VM本身已经假死、根本没法处理网络包我见过很多新手在这个环节走弯路把业务网卡的配置、VLAN、防火墙规则翻来覆去查了个遍结果物理链路的灯从头到尾都在正常闪烁。2.2 再看宿主机资源指标全绿但存储I/O不对劲物理链路没问题的判断让我把目光转向宿主机自身。挨个登录4台宿主机看指标CPU利用率基本都在20%以下内存也没压力负载值正常——宿主机本身显然不是瓶颈。宿主机到物理机的所有硬件告警都没有触发RAID卡、电源、风扇、温度全是绿的。但当我敲下esxcli storage core device stats list这条命令查看存储设备统计时心里那个判断越来越清晰了——存储设备的I/O错误计数在持续增长而且COMMAND TIME OUT命令超时的数字一直在跳。再看VMkernel日志满屏都是SCSI Sense Code、I/O errors的记录大量请求排队卡死。配合vCenter里那9台VM“已开机但无响应”的状态答案几乎呼之欲出共享存储链路出问题了。这里我要特别解释一下很多人以为虚拟化平台里VM的磁盘文件都应该存放在宿主机本地硬盘里其实生产环境恰恰相反。绝大多数正规的虚拟化集群都会把虚拟机磁盘文件比如VMware的VMDK文件存放在共享存储上——SAN存储阵列、NAS存储、或者分布式存储如vSAN/Ceph。这样做的核心目的是支持HA高可用和动态迁移当某台宿主机宕机时集群可以把VM迁移到另一台宿主机上重新拉起因为VM的“硬盘”还在共享存储上换个宿主机照样能跑。但这也带来一个致命弱点如果共享存储挂了所有依赖它的VM会被“一刀切”。2.3 定位根因存储网络故障引发的“集体拔盘”顺着存储I/O异常的线索我登录到存储阵列的管理界面看到存储控制器的日志里记录了一次主备控制器的切换事件切换过程中光纤通道链路发生闪断。之后又检查了两台光纤交换机的端口状态发现其中一台交换机的级联端口报了大量CRC错误端口流量跑飞了。整个事件时间线串联起来是这样的光纤交换机级联链路质量下降→存储控制器感知到链路异常→触发主备控制器切换→切换过程中SCSI命令超时→宿主机端存储设备I/O错误累积→所有VM的磁盘读写请求全部卡死→VM操作系统因无法读写磁盘而集体假死。说白了9台虚拟服务器就像9台插着远程硬盘的电脑硬盘线被人猛地一抽电脑本身没坏但谁也跑不起来。宿主机没挂是因为宿主机的操作系统装在本机硬盘上VM全挂是因为VM的系统盘和数据盘都在那块“被抽走的硬盘”上。这就是虚拟化平台的既有优势也是它的阿喀琉斯之踵——共享存储是太多虚拟机的公共单点。3. 为什么9台能一起挂虚拟化架构里的“公共依赖”3.1 共享存储虚拟化平台的心脏血管聊到这里我需要把共享存储这件事掰开了讲因为很多刚接触虚拟化平台的朋友对“为什么一台存储故障能影响几十台VM”没有直观概念。你可以把虚拟化集群想象成一家快递分拣中心宿主机是各条分拣流水线VM是正在处理的包裹而共享存储是那个中央仓库。每个包裹的内容物都存在仓库里流水线上只有包裹的“影子”。如果仓库进不去了所有流水线都得停摆——哪怕流水线设备本身完好无损。具体到技术层面VM在运行时的每次磁盘读写都会产生SCSI命令这些命令通过存储网络FC光纤通道、iSCSI、NFS等发往共享存储。一旦存储链路或存储阵列本身出问题这些命令就会卡在超时重试的循环里。宿主机端的存储驱动会不断重试失败的命令而VM操作系统的磁盘队列也被堵住。最终结果就是VM还在内存里“活着”但它写不了数据读不了配置日志刷不出来所有业务进程陷入饥饿状态。从用户侧看这些服务就跟宕机没有任何区别。理解了这一点你就知道为什么虚拟化平台的设计者要费尽心思去做存储多路径MPIO、存储集群和跨站点复制了。存储这块的可靠性设计从来不是可选项是刚需。但现实中很多中小企业的虚拟化部署把存储柜当成“坏了再换”的普通硬件监控里根本不看存储延迟和链路错误计数直到这次这种“9台集体失联”的惊魂事件发生才知道疼。3.2 HA和DRS为什么没能救场虚拟化平台也有盲区很多人天然觉得我搭了虚拟化集群开启了HA高可用和DRS动态资源调度主机挂掉虚拟机可以自动漂移那存储出问题是不是也能自动恢复答案是不能反而可能惹出更大的麻烦。HA解决的问题是“宿主机宕机”这一种场景当一台ESXi主机失联时集群会在其他健康主机上重新注册这台主机上的VM并尝试开机。但存储故障时宿主机都活得好好的HA根本不会被触发——因为HA判断的是主机的心跳不是存储健康度。更尴尬的是如果存储故障导致主机短暂失联又被误判HA可能在原VM还占着存储锁的情况下在另一台主机上拉起同一份VM磁盘文件造成“脑裂”——两个进程同时写同一块磁盘这个数据灾难比宕机本身严重得多。我复盘过很多次这类事故虚拟化平台的VM状态监控也有天然盲区管理端能看到“VM已开机”但看不到VM内部的业务是否健康。不管是vCenter还是其他虚拟化管理平台所谓“心跳”很多只是VM工具上报的状态VM内核已经卡死的时候这个心跳可能还是“正常”的。所以生产环境的虚拟化平台里监控必须做到三层物理层、虚拟化层、业务层。业务层的探活才是真正决定“这个服务到底能不能用”的指标。3.3 不同虚拟化技术的“单点”各不相同做虚拟化运维这些年我用过VMware vSphere、开源KVM、也接触过Hyper-V每种平台都有自己特殊的“公共单点”。VMware ESXi加共享存储的架构里共享存储和vCenter数据库是最容易出问题的点KVM加Ceph的方案Ceph集群的MON节点和OSD健康度是核心Hyper-V加故障转移集群仲裁和CSV集群共享卷的状态需要特别上心。我遇到过最狠的一次是KVM环境下Ceph集群有个OSD损坏触发了大规模数据回补结果把整个存储网络的带宽吃光所有VM的I/O延迟飙升到几秒级别看起来就像集体宕机。那次跟这次的光纤链路故障虽然技术细节不同但本质上都是“存储层是命门”这个道理。虚拟化平台的稳定运行七分靠存储三分靠计算这不是一句空话。4. 抢修实录分秒必争的恢复过程4.1 恢复第一原则千万别盲目重启宿主机讲完原理回到当时现场。确认根因是存储链路故障后我做的第一件事是按住旁边同事想重启宿主机的冲动——这个操作千万不能做。宿主机只要一重启它就主动断开了与共享存储的连接所有VM的磁盘锁会被释放但此时存储还在故障状态重启后的宿主机注册不到VM磁盘文件反而可能触发HA把VM在别的宿主机上尝试开机造成一连串新的错误。正确的抢修顺序应该是先恢复存储链路再让宿主机的存储I/O恢复正常最后让VM自己缓过来或者有计划地重启VM。我当时的做法是先把光纤交换机上那条报大量CRC错误的级联链路隔离掉让流量自动切换到备用链路然后检查存储控制器的切换状态是否稳定确认没有持续的重启循环再登录宿主机查看存储设备是否重新处于可用状态。当我在esxcli里看到存储设备的I/O错误计数不再增长命令超时数字停止跳动时长舒了一口气。但这里还有一个容易踩的坑存储链路虽然恢复了之前卡在SCSI队列里的命令可能在恢复瞬间集中释放造成I/O风暴。所以不要立刻把所有VM同时唤醒得一个一个来。4.2 逐个拉起VM按业务依赖顺序开机我把9台VM简单分了个优先级。第一批是数据库节点先把数据库跑起来后面的应用才有数据可读第二批是K8s的控制面节点和中间件第三批才是应用服务器。但启动数据库的时候又遇到一个麻烦事数据库实例究竟处于什么状态是干净关闭还是异常中断完全不确定。如果直接启动数据库一致性检查没过可能起不来或者很久。我们当时的做法是先登录到VM的控制台看系统是否能正常响应。其中6台VM在存储恢复后操作系统逐渐恢复了响应慢慢“缓了过来”进程开始继续跑数据库也在自己的恢复机制下执行了崩溃恢复这种是最好的情况。还有2台VM的系统因为内存数据损坏只能强制重启最后1台VM更棘手系统盘有文件系统损坏的迹象我让同事在VM的启动配置里临时挂载了系统安装ISO准备进救援模式修复。这个过程最考验耐心。有人说“虚拟化重启快全点了等一会儿就行”真这么做很容易出事。同时拉起9台VM存储和网络带宽瞬间打满不说如果数据库和应用之间存在启动顺序依赖先起的应用会因为连不上数据库而报错留下大量需要手动清理的脏数据。按依赖顺序分批启动虽然慢但这个慢是值得的。4.3 时间同步检查被忽略的“第二个雷”在VM恢复正常运行后我要求同事立刻检查所有VM的系统时间。这不是小题大做存储故障期间VM经历假死、强制重启系统时间很容易出现漂移。虚拟化环境里时间不准确的结果非常隐蔽且危险数据库主从之间时间差太大会导致复制错乱应用系统的登录票据可能因为时间戳无效而全部失效K8s集群Node节点的证书如果校验时间失败整个集群会进入异常状态。我们环境里有自己的时间服务器NTP Server所有宿主机和VM都通过它同步时间。但有些VM在重启之后systemd-timesyncd或chrony服务的启动顺序可能晚于核心业务进程导致业务进程带着错误时间先跑起来。我当时的习惯是在业务启动前先强制同步时间。Linux上就手动执行chronyc makestep或者用ntpdate这类命令校准Windows虚拟机则通过w32tm /resync来强制同步同步完再确认一下偏移量在100毫秒内才放行。这里我也要提醒一句时间同步在虚拟化平台里有它特殊的坑。裸金属服务器上NTP同步到硬件时钟就行但虚拟机里如果同时开了VM Tools的时间同步功能和Guest内的NTP服务两者可能打架。正确做法是只保留一条路径要么宿主机统一同步时间并把时间传给VM但要小心暂停恢复时的时间跳变要么在VM内部用NTP服务器直接同步二选一。混合启用是大量时间漂移问题的根源。4.4 恢复后的数据与集群健康校验所有VM恢复正常后并不代表事情结束了。我安排了一次完整的健康校验分四条线并行。第一条线是数据库一致性。数据库服务虽然起来了但存储故障期间的写操作可能丢失或乱序需要逐个连接数据库执行一致性检查或查看错误日志确认没有静默数据损坏。第二条线是K8s集群状态。K8s对故障非常敏感我逐个检查了Node状态、etcd健康、工作负载是否重新调度到位确保控制面没有因为节点失联发生脑裂。第三条线是虚拟化平台本身。登录管理端确认HA配置没有异常DRS规则还在把误报的告警关闭给这段时间里生成的告警事件做好标记。第四条线是备份系统确认当天的备份任务重新跑起来了。整个过程用了大约六个小时。业务中断时间其实已经超过两小时了这在很多公司已经属于重大故障的级别。事后复盘时我们每个人都认同一个观点如果不是共享存储链路故障波及范围这么大大家都不会重新意识到虚拟化平台里“存储依赖”的分量。5. 常见问题与排查技巧速查表5.1 虚拟化集群集体失联的典型原因与排查方向这次事故之后我把虚拟化平台常见的“集体宕机”场景做了一张速查表方便以后值班时迅速定位方向。很多人遇到VM集体失联第一反应是宿主机被入侵了或者网络被攻击了实际在虚拟化运维里90%的情况都是基础设施层面的公共依赖出了问题。现象可能原因快速排查手段多台VM同时失联宿主机正常共享存储链路故障或存储阵列异常查看宿主机存储设备I/O错误计数、存储控制器日志部分VM假死管理端显示“已开机”VM磁盘文件所在datastore不可用检查数据存储的连接状态、存活主机数存储恢复后VM仍无法启动文件系统损坏或磁盘锁残留进救援模式检查文件系统确认无其他宿主机占用锁VM启动后业务仍不正常系统时间漂移、证书过期、数据库复制错乱检查NTP同步状态、数据库日志、证书有效期集群自动迁移导致脑裂存储闪断触发HA误判两边同时开同一VM查看集群任务历史确认是否有重复UUID的VM5.2 现场排查的几个操作纪律我经历过的故障多了逐渐总结出几条现场操作纪律这次也全用上了。第一保存原始证据。清日志之前先做副本告警截图先存到独立目录这个工作在恢复系统之后做。虚拟化平台的日志量很大一旦重启覆盖很多线索就永远丢了。第二不要一个人同时动多台VM。多人协作时要有清晰的口令和操作记录谁负责哪台VM、做了哪些操作都在共享文档里实时更新防止“你重启了我正在修复的那台”。第三不要在没恢复存储链路前动任何VM。存储没恢复VM的任何操作都是在给SCSI队列添堵越急越乱。还有一点很重要排查过程中要关注“时间线”而不是“空间线”。不要同时把注意力放在9台VM上要盯住它们的共同点这些VM都在同一个数据存储上吗它们连的存储网络是同一对交换机吗它们的宿主机是否属于同一个集群找到公共交集就能快速把9个“个案”压缩成1个“根因”。5.3 日常监控里必须盯住的几个指标经历过这次惊魂我重新梳理了虚拟化平台监控指标的优先级。新增的监控项里有几样特别值得推荐给同行一是宿主机存储命令超时的次数这是存储链路故障最早的信号二是共享存储的I/O延迟和队列深度别等业务卡死了才看到三是时间偏差值我会给所有VM配置NTP相关监控一旦时间偏移超过200毫秒就告警四是每个数据存储的连接状态而不是只看VM的运行状态。很多人会问宿主机CPU、内存的监控还不够吗不够。虚拟化平台的三大命门是网络、存储、时间。CPU和内存的抖动一般只影响个别VM的性能不会造成集体故障但存储断链、网络分区、时间漂移这三个问题任意一个都可能让整个集群“集体罢工”。日常巡检时我会定期检查光纤交换机端口的CRC错误、存储控制器的电池和缓存状态、NTP同步的层级和偏移量——这些颗粒度更细的指标才是真正能提前发现隐患的信号。6. 复盘与改进这次惊魂教会我的事6.1 冗余要的是“逻辑单点”不是物理单点事故复盘会上大家讨论最多的是为什么我们明明做了双控制器、双光交换机、双链路最后还是一锅端答案很扎心我们做了物理层的冗余但逻辑上的单点还在。光纤交换机的级联链路质量下降确实触发了主备控制器切换但切换过程中SCSI命令超时太严重所有依赖该存储的VM在同一时间段内集体卡死。冗余链路能挡住“单点硬件的损坏”挡不住“单点逻辑的脆弱”。打个比方你家自来水有两根入户水管一根裂了会自动切到另一根但两根水管都来自同一个水厂水厂停电切哪根都没用。这次我们缺的不是第二根管子而是在切换到第二根管子之前允许业务顶住那几秒钟的能力。比如给关键数据库VM增加本地副本、设置更合理的SCSI超时和重试参数、或者部署跨存储的数据冗余方案这些才是真正的“逻辑冗余”。6.2 虚拟化平台运维“三大件”网络、存储、时间这次故障让我对虚拟化平台运维的核心有了更清醒的认识。日常维护、巡检、告警规则、灾备演练都应该围绕网络、存储、时间这三个维度来设计。网络是VM之间通信的血管存储是VM生存的依托时间是分布式系统协作的基准。这三个维度任何一个出问题都可能演变成“服务器是虚拟的工作量的崩溃却是实打实的”。经过这次事件我给所有虚拟化平台的宿主机加了存储路径告警给所有VM加了时间偏移告警每条告警通知里都附带当前vCenter的时间轴链接。另外推动做了一次双活存储的切换演练确认主控制器掉线时业务能真正无感切换而不是像这次一样切到着火。虽然投入了一些成本但和一次重大故障带来的业务损失相比这些钱花得太值了。6.3 给同行的最后几条经验如果你也在维护虚拟化平台我这几条经验希望能帮你少踩一些坑。第一一定要有独立的“故障日志库”。不要把日志堆在要被重启的那台机器上虚拟化平台故障往往伴随着主机重启日志没了就只剩下猜。第二遇到VM集体失联先找“公共交集”不要一台台VM排队诊断。把VM列出来标注它们的宿主机、数据存储、网络平面画个交集图公共交集就是嫌疑犯。第三恢复VM时按依赖顺序分批执行并同步校准时间。数据库先于应用时间先于业务这两句话记住能省太多事。这次“9台虚拟服务器集体罢工”事件最终以全部业务恢复、没有数据丢失的结局收尾算是不幸中的万幸。但在处理故障的那个多小时里盯着满屏红色告警、听着业务方一遍遍追问恢复时间时我是真的感受到了虚拟化技术带来的特殊压力——服务器本身是虚拟的丢失任何一位用户的信任却是实实在在的。虚拟化给了我们高效和弹性也把运维的兜底责任托付得更重了。唯有多想一层、多练一次、多备一条路才能在下一次“惊魂”来临时比这次做得更快、更稳。