在开启DRS的集群中修复VMware虚拟主机启动问题
通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态。因为有过上一次(VMware-存储断网之后无法添加vmx到清单)的经验,所有操作等待存储恢复与ESXi连接之后再进行操作,这样可以尽量避免虚拟主机意外“消失”。
前奏
最终,存储网络恢复正常,期间经历了大约1个小时,有绝大多数的Windows虚拟主机在存储网络恢复正常之后继续正常工作;有少部分的Linux虚拟主机内部EXT文件系统出现了只读,这个需要重启后对文件系统修复才能解决;而有一小部分大概占总虚拟主机30%的量的关机虚拟主机,此时需要对他们进行启动操作,而真正的问题恰巧也来了。
环境介绍
所在集群中开启了vSphere DRS功能,但未开启HA功能,这样会在启动虚拟主机的时候,根据DRS自动策略会将虚拟主机分配到算法认为最轻松的一台ESXi主机上,最终完成启动。
可是现在启动过程中出现了一些问题,有些虚拟主机可以很顺利的启动起来,而有些虚拟主机在等待5~10分钟之后开始报错,报错信息五花八门,
Ø 有在95%启动过程中报错的,
Ø 有在久等之后抛出“打开配置文件------.vmx”文件失败的,还有的干脆启动之后迅速报错“打开虚拟机电源:未能启动虚拟机 (错误 -18)”的,
Ø 有报错通信相关异常的,
Ø 以及注册虚拟机时候抛出的错误“The system returned an error. Communication with the virtual machine might have been interrupted.正在目标主机上注册虚拟机”。
通过寻找日志线索,找到两处我认为和启动有关准确都较高的日志记录:

Figure 1日志信息一,有详细的vmx文件无法打开的记录,此处对应的启动环境是在vCenter中,通过高级管理员账号启动的报错

Figure 2日志信息二,在登陆到ESXi上看到的错误信息,其中绿色圈的是vCenter向ESXi发送指令用来实际操作的用户,红色圈的是虚拟主机无响应后VMware内部为用户记录错误信息的用户。
问题解决
通过上面对日志的分析与查看,我按照《VMware-存储断网之后无法添加vmx到清单》文章中的指导建议,使用vmkfstools 查看了对应无法启动的虚拟主机的vmx文件占有情况。

Figure 3利用vmkfstools(绿色横线为命令)了解到该vmx文件并无被占有(红色横线全零表示该文件未被任何ESXi主机锁定)
既然和日志提到的文件对不到一起,而虚拟主机目录下也就那些文件,索性一个个的去遍历一遍,看看有没有其他的思路和线索。

Figure 4当我遍历到vswp文件的时候我可以看到锁定这个文件的ESXi主机MAC地址了(VMware-存储断网之后无法添加vmx到清单文中有介绍如何通过MAC反查到对应ESXi主机)
由于vSphere DRS的会对虚拟主机启动自动分配ESXi主机,所以此时我把DRS临时关闭,将这个不能够开启的虚拟主机迁移到反查到的原ESXi物理主机上,再次启动,非常顺利的进行了下去。随后的那些无法进行启动的虚拟主机也如法炮制的都启动好了。
经验总结
1、等待存储恢复之后,启动vCenter,切记第一时间关闭DRS,如果有HA最好也一起关闭,避免批量启动的时候自动资源分配导致前一次这个vswp文件还未处理掉与原始ESXi主机的关联关系,这样如果自动给了一个不是原始ESXi主机的环境,就会导致vmx文件和vswp文件的所有权脑裂。
2、通过判断Figure 2中的那条user用户错误信息,其实我们已经可以找到这个虚拟主机故障前与那个ESXi主机有做关联。
3、由于vCenter自身也是安装在外挂存储中的,因此在外挂存储故障了之后vCenter已经无法记录日志,因此来自于ESXi的信息相当珍贵。
4、实际上通过分析启动不能的虚拟主机log文件(在外挂存储的虚拟主机目录下)也是可以分析到那些文件被什么样的ESXi主机锁住了。
5、VMware的知识库里面告诉我们,在一台虚拟主机启动之后,这些类型的文件(如下所示)都会被所在ESXi主机通过vmfs这个集群式文件系统给锁定。
a) VMNAME.vswp
b) DISKNAME-flat.vmdk
c) DISKNAME-ITERATION-delta.vmdk
d) VMNAME.vmx
e) VMNAME.vmxf
f) vmware.log
6、文中日志Figure 1所提到的vmx文件无法读取,我的理解是vmx可以看作是虚拟主机的机箱,而这个机箱里面有硬盘文件VMDK,虚拟机交换文件vswp,日志文件log等等,因为涉及到的被锁文件是在众多,所以系统就会用vmx文件作为统一输出告知管理员一个大致的错误方位。
7、等待所有虚拟主机启动完毕之后,再将vSphere DRS和HA开启。
8、充分利用VMware-存储断网之后无法添加vmx到清单提及的RVTools,可以让维护和运行更加顺利。
-=EOB=-
在开启DRS的集群中修复VMware虚拟主机启动问题的更多相关文章
- 向CDH5集群中添加新的主机节点
向CDH5集群中添加新的主机节点 步骤一:首先得在新的主机环境中安装JDK,关闭防火墙.修改selinux.NTP时钟与主机同步.修改hosts.与主机配置ssh免密码登录.保证安装好了perl和py ...
- Kubernetes集群中修复状态为NotReady的节点
度个假回来发现自己集群中的节点都挂了,全部是NotReady状态 但是除了.10节点外,其他主机并没有挂,可以远程连接上, 那就考虑是kubernetes系统的问题 解决的方法是重启kube-prox ...
- hbase集群中其中某个regionserver 没有启动
第一步: date命令查看各个机器的时间 发现linux02机器时间差了2个多小时 第二步:ntpdate pool.ntp.org 修改错误时间的机器 第三步: 重启 hbase
- CentOS7 使用chrony搭建集群中的时间同步服务
一.集群环境: 系统:CentOS7-minimal 集群中的两台主机ip:10.132.226.103/24 10.132.226.104/24 二.CentOS7中时间相关命令timedatec ...
- 在k8s集群中安装rook-ceph 1.8版本步骤
官方文档地址:https://rook.io/docs/rook/v1.8/quickstart.html Kubernetes 最小版本号 Kubernetes 最小版本号:Kubernetes v ...
- k8s集群中安装rook-ceph
容器的持久化存储 容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保 ...
- redis集群中的主从复制架构(3主3从)
架构图如下 首先开启6个实例,这里为了演示方便,只是在一个linux上开启了6个redis实例 6380 (主) 6480 (从) 6381(主) 6481(从) 6382(主) 6482 ...
- 深入理解 ZK集群中通过Processor保证数据一致性
入口 书接上篇博客中的ZK集群启动后完成数据的统一性恢复后,来到启动ZkServer的逻辑,接下来的重点工作就是启动不同角色的对应的不同的处理器Processor 如上图查看ZooKeeperServ ...
- 集群中Session共享解决方案分析
一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...
随机推荐
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...
- [C#] 走进异步编程的世界 - 开始接触 async/await
走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...
- 普通程序员如何转向AI方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
- Java 经典入门(一)
一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- nodejs操作arduino入门(javascript操作底层硬件)
用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主 ...
- c#比较两个数组的差异
将DataTable中某一列数据直接转换成数组进行比较,使用的Linq,要引用命名空间using System.Linq; string[] arrRate = dtRate.AsEnumerable ...
- 用Kotlin实现Android定制视图(KAD 06)
作者:Antonio Leiva 时间:Dec 27, 2016 原文链接:https://antonioleiva.com/custom-views-android-kotlin/ 在我们阅读有关c ...
- git init和git init -bare区别
1 Git init 和 git init –bare 的区别 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作.但别的用户在将更新push上来的 ...
- SqlServer简单数据分页
手边开发的后端项目一直以来都用的.NET MVC框架,访问数据库使用其自带的EF CodeFirst模式,写存储过程的能力都快退化了 闲来无事,自己写了条分页存储过程,网上类似的文章多的是,这里只列了 ...