一些网上找不到的小总结。

Introduction to HA 介绍HA

在提供服务的时候,可用性是传统意义上最重要的概念。当在一个共享的平台上提供服务时,例如vSphere,随着越来越多的服务在单个物理主机上面运行,宕机的影响将成指数倍增长。因此,VMware的工程师们开发了vSphere HA高可用。以下简称VMware vSphere High Availability为HA。HA提供了一种更简单、更省钱的解决方案,以此增加任何应用程序运行在虚拟机上面的可用性。HA是通过vCenter Server,使用简单的几个步骤来进行设置的。HA让你能够创建一个有多个ESXi主机的集群。它允许你能够保护你的虚拟机们以及它们的工作流。当集群中的一台主机发生错误时,所有受到影响的虚拟机将在集群中的另外一台主机上面重启。

为了防止客户机(Guest OS)级别的出错。HA可以重启失败的客户机。这个功能叫做虚拟机监控(VM Monitoring),也被叫做虚拟机高可用。虽然听起来很复杂,但是同样的,只需要简单的单击就可以实现。

与很多其他的集群解决方案不一样,HA是一个更加简单的解决方案,只需要通过5次鼠标的单击就可以实现部署。除此以外,高可用还广泛的用于其他的解决方案。但是,高可用并不是一比一的还原了微软集群服务,或是Windows Server Failover Clustering。与他们主要的区别在于,WSFC是设计用来保护有状态的集群感知应用程序。而HA则是设计用来保护虚拟机的工作不中断的,同时也可以延伸到虚拟机的监控和应用程序的监控。

在HA中,一个发生错误的宕机时刻就是在集群中的其他主机上面重启虚拟机,而MSCS微软集群服务是当某一个节点发生错误时,将服务迁移至某一个集群节点。WSFC并不能保证在传输过程中不会发生宕机。你的应用程序需要具有集群感知能力和状态,才能够充分的利用这个机制。因此,它限制了可以真正受益于这个类型的集群工作流。

有的人可能会问,HA需要重启虚拟机,并且服务可能短暂的失效,为什么还要用HA。答案非常的简单,不是所有的虚拟机都能有99.999%的开机时间(几乎0宕机)。对于多数的服务来说,HA满足了更多的需求,很多应用程序根本就不是在WSFC集群的基础上设计的,这也说明,如果应用程序在一个非特意设计的集群上面使用WSFC,它根本就无法保证可用性或是数据的连续性。

除此之位,WSFC非常的复杂,并且需要用户有特殊的技能和培训。一个简单的例子就是,在WSFC环境中,管理补丁和升级,如果不能正确的操作和完成复杂的设置,很可能会引发更多的宕机时间。而HA降低了复杂性和花销以及资源使用。大大减少了预期外宕机时间和其他额外成本.非常重要的是,对比WSFC,HA不需要改变客户机,因为HA的实现是在管理程序(Hypervisor)层面的。同时,虚拟机监控也不需要额外的软件或其他的系统修改,只需要安装VMware Tools。

HA的需求

每一个产品或服务都会有一些特殊的需求,HA也不例外。这一部分非常的基础,也是在我们更深入之前必须要知道的。对于HA新手,这里也会告诉大家如何配置HA。

预需求

在开启HA之前,我非常建议使用环境完美适配所有的与需求。我们也从基础设施的角度,提出了一些建议以保证弹性。

需求包括:

  • 最少2台ESXi主机
  • 每台主机最少5GB的内存来安装ESXi并开启HA
  • VMware vCenter Server
  • 虚拟机们有共享存储
  • 网络通畅的网关和可靠的网络地址

建议包括:

  • 冗余管理网络(不强制,但是非常建议)
  • 每个主机8GB的内存
  • 多个共享存储

防火墙需求

下面的这个表格说明了HA交流所需的端口。如果你的环境在主机之外包含防火墙,请确保这些端口对HA是开放的。HA会自己打开在主机上需求的端口。

HA组件

这个图片展示了两个集群和HA的关键组件

你可以清楚的看到,这里有三个重要组件:

  • FDM
  • Hostd
  • vCenter

对于HA来说,第一个要说且最重要的就是FDM – Fault Domain Manager。它也是HA代理。

FDM代理管理着多个任务,例如:主机资源信息交流、虚拟机状态和HA属性。FDM也管理着心跳机制、虚拟机放置、虚拟机重启、日志、和很多其他的东西。我们在这里不会深入的分别讨论前面提到的所有东西。

在我们的观念里,FDM是当HA开启后,ESXi中最重要的代理服务。FDM使用了单进程代理,然而FDM会自己生成看门狗进程。一旦代理失效,看门狗进程会继续跟进,并重启进程,以确保HA的功能不受影响且不被其他人察觉。这个代理还可以适应网络中断,和APD(所有路径中断)。主机之间的交流会自动使用其他的路径,以避免网络出错。

HA在DNS上没有任何的依赖,它只用IP地址。这是FDM带来的一个主要的功能提升。这不意味着ESXI主机需要在vCenter中注册IP地址。虽然HA不依赖DNS,但是其他服务可能会依赖。因此,有合理的FQDN会使监控和排错将会更容易。HA有一个标准的日志机制。一个单独的日志文件为所有的操作日志信息而创建。

HOSTD代理

主机上一个最主要的代理就是hostd。这个代理管理着一些我们认为很简单的任务,例如启动虚拟机。FDM可以直接和HOSTD交流,也可以直接和vCenter交流。这就说明他们并不依赖VPXA。这是为了避免不必要的依赖条件,让HA更可靠,也能让HA可以更快的相应开机请求,从而增长虚拟机的正常运行时间。

无论由于什么原因,当hostd不可用时,或重启后仍然没有运行时,主机将不会参与和FDM有关的任何进程。FDM依赖hostd获取和注册到主机的虚拟机有关的信息。简单地说,FDM依赖于hostd,如果hostd无法正常运行,fdm会停止所有功能,并等待hostd开始运行。

vCenter

vCenter是每一个集群的核心,这里要讨论的最重要的功能是:

  • 部署和配置HA代理
  • 集群配置变更的交流
  • 虚拟机的保护

vCenter需要能够在需要的时候将FDM代理推给ESXi主机。同时,vCenter也管理在集群中的配置变更的改变,例如选举出Master。

HA利用vCenter来获取虚拟机的信息。vCenter也被用来显示虚拟机的保护状态。

虽然HA是由vCenter来配置的,虽然虚拟机状态信息也有HA来交换,但是vCenter并不会因为HA的错误而被牵连进来。当安装了vCenter Server的主机发生错误的时候,HA会接管这个错误,并且在另一个主机上面重启vCenter Server,包括这个主机上面配置过的所有的虚拟机。

vCenter故障存在一种极端情况:如果ESXi主机被称为“无状态主机”,并且管理网络使用了分布式交换机,则在重新启动vCenter之前,不会尝试重启虚拟机。对于无状态环境,vCenter和Auto Deploy的可用性是关键。因为这种情况下,主机依赖于他们。

当一个VCSA或vCenter Serve被启动以后,我们推荐正确的设置HA重启属性。虽然vCenter Server不要求重启虚拟机,但是在vCenter Server上有很多的组件需要相应。为了成功的重启,建议开启:DNS、MS AD、MS SQL(或其他你正在使用的数据库服务)


了解了HA的组件以后,可以接着说一说HA集群的基本概念:

  • Master/Slave agents
  • Heartbeating
  • Isolated vs Network partitioned
  • Virtual Machine Protection
  • Component Protection

众所周知,一个集群可以包含很多的主机。集群可以被看成是一个资源合集。这些资源能够被DRS瓜分成独立的资源池,并通过HA来增加可用性。

每个集群只有一个Master,其他的机器被称为slave。一个Master需要检测虚拟机的健康情况,如果出现错误,需要将其重启。HA来决定谁来当Master,谁来当slave。

Master代理

Master的主要任务之一是跟踪它所负责的虚拟机的状态,并在适当的时机采取适当的行动。正常情况下,每个集群只有一个Master,后面的章节中会讨论什么时候一个集群可以有多个Master。

Master需要声明拥有虚拟机存储的虚拟机配置文件的所有权。同时,HA Master还会和VC交换状态信息。这也就意味之它不仅仅能够接收信息,在需要的时候也能向VC发送信息。HA Master也能够在集群内某个主机发生错误以后重启该主机的角色。

Election选举

Master是由HA代理选举产生的。当集群上第一次开启了HA时,一个Master选举就开启了。以下这些情况也会重新开启选举:

  1. Master主机发生错误
  2. Master主机网络隔离
  3. Master主机与VC断连
  4. Master主机进入维护模式
  5. HA被重新配置

HA的Master选举使用UDP协议,在15秒内选举完成。虽然HA不会对选举失败做出任何反应,但是一旦选举出了Master,就会处理选举之前或选举过程中探测到的故障。

选举会从参与选举的主机中选出连接数据存储数量最多的主机。当有两个甚至更多的主机连接着相同数量的数据存储时,有最大的Managed Object ID的主机会被选中。例如99大于100,以为9大于1。对于每台主机来说,每台主机的HA状态会Summary中显示,这包括哪一个主机是Master。

当Master被选举出来,每一个Slave的管理网络会分别与Master通过TCP协议进行加密连接。这个安全连接是基于SSL的。Slave之间不会单独互相通信,除非需要新的Master选举。

正如前文提到的,当Master被选举出来,他会宣布拥有数据存储的权力。对于常规的存储结构来说,这个存储通过一个叫“protectlist”的东西来锁住文件。这个文件的地址是“

Master通过这个文件来存储被HA保护的虚拟机的清单,以及这些虚拟机的CPU和内存的预留信息。

当Master被隔离或是发生错误时,这个锁将会自动过期,并在选举出新的Master之后重新上锁。

隔离的这种情况比较特殊,但是结果是相近的。Master会自动释放这个锁来保证新的Master被选举出来。虚拟机的重启会有一定的延迟,直到新的master被选举出来

现在做一个假设,假设Master刚刚发生了错误,会发生什么?Slave如何能知道Master发生了错误?HA使用的是一个点对点的网络,这个网络有心跳机制。当这个slave接收到这个点对点网络失去心跳了,所有的slave会一起选举出一个新的master,这个新的master会在十秒内读取需要的信息并最终重启虚拟机。重启虚拟机不是master唯一的作用。他还需要监控slave主机的状态并报告给VC。当一个slave主机发生错误或被从管理网络隔离后,master会区分出哪一个虚拟机需要被重启。Master还需要辨别出这些虚拟机的归属地。这个归属地的放置需要用到一个归属地引擎,这个引擎可以尝试在所有可用主机上面重启。

Slave

slave也有些和master相近的功能。例如slave需要监控在这台主机上面运行的虚拟机状态,并将这些信息告知Master。同Slave还需要通过心跳来监控Master的健康状态。如果master无法联系到,slave会开启并参与选举。最后,slave发送心跳非master,从而让master知道自己的状态。

Slave和Master的文件

Remote文件

一组运行中的虚拟机被存储在一个 host-number-poweron 的文件中。这个文件不仅仅追踪虚拟机的开机状态,这个文件也被用于slave告诉Master自己被从管理网络隔离。这个文件最开始的行会包含0或1。0意味着没有被隔离,1意味着已经被隔离了。Master会告诉VC哪个主机被隔离了。

Local文件

HA在主机上被配置,主机会存储关于集群的特定的信息

每一个主机,包括Master,都会在本地存储数据。这些数据包含非常重要的状态信息。包括:虚拟机和主机兼容矩阵、集群配置信息、主机会员清单。这些信息被每一台主机存储在自己的本地。这些信息的更新由VC发送给master。我们建议不要修改这些文件。

心跳

HA心跳机制是一个非常重要的机制,它能够验证主机是否还活着,他有两种不同的心跳机制,这两种心跳机制可以了解到当主机没有响应以后,这期间发生了什么。

网络心跳

网络心跳被用来看主机是否还活着,每一个slave将发送心跳到master,master也会发送心跳到每一个slave,这就是点对点通信,这些心跳默认每一秒都会发送。当slave没有从master收到心跳,他会尝试区分master是否被隔离。

数据存储心跳

数据存储心跳是一个附加的弹性功能,能够预防非必要的重启。

数据存储心跳让主节点能够更多的确定无法通过管理网络访问的主机的状态,这个机制就是为了预防master失去了与slave的网络连接。是数据存储心跳来判断主机是被隔离了还是发生了错误。隔离会像之前提到的一样,在poweron文件中被验证,如果没有poweron文件,master是没有办法验证隔离的。基于对local文件和remote文件的检查,master会认识到自己需要采取怎样的行动。当master发现某一个主机发生了错误(没有了数据存储心跳),master会重启在出错主机上面的虚拟机。当master发现某一台主机是被隔离了,他仅会在他认为合适的时候采取行动。简而言之,只有虚拟机被关机或出错导致无法操作时,master才会重启这个虚拟机。

默认的,HA会选择两个心跳检测数据库,他选择的数据库必须是在所有主机上都可用的或尽可能多的主机上面可用的。尽管,我们可以通过高级设置来设置更多的数据存储来运行心跳检测,我们并不推荐配置这个选项,因为默认的设置能够满足绝大多数的情况。除非这是一个延伸集群环境,我们建议在每个站点手动选择两个数据存储。

在这个选择的进程中,VMFS优先于NFS,并且会寻找选择有不同LUN的数据存储。当然,你也可以自行选择心跳机制所需的数据存储,然而,我们建议让VC来选择。当然,VC也不能保证他选出的数据存储是所有主机上都可用的。

 vSphere可以显示一些额外的信息,例如集群的状态。主机的监控中也能看到正在使用心跳机制的数据存储。同时,也会显示有多少虚拟机正在连接到Master。在基于块存储的环境中,HA直接利用现有的VMFS文件系统的机制。在VMFS数据存储中,HA会检测心跳机制有没有被更新。为了更新数据存储的心跳机制,主机需要在volume上有至少一个开放的文件。这个开放文件专门用来为数据存储心跳服务。换句话说,一个主机文件在设计好的心跳检测数据存储上生成,即图中的文件:

在NFS数据存储中,每一个主机会间隔5秒向的心跳文件中写入,以此来保证Master能够检测到各个主机的状态。Master会检测文件的时间戳是否有改变。

网卡出错可能即影响到网络心跳检测,也影响到数据存储的心跳检测。如果遇到某些原因导致数据存储或NFS配额无法使用或从集群中被移除。HA会检测到这个事件,并重新选择一个新的数据存储或NFS份额用来保证心跳检测机制的使用。

隔离和分区

首先,考虑用管理员的方式思考。如果两台主机可以运行,但是无法通过管理网络互相访问,那么他们被视为已经被分区。另一方面,如果在管理网络上面没有任何的HA管理流量或隔离地址无法ping到,则主机是被隔离了。同一时间内,有可能多台主机被隔离。如果同一时间多台主机被分区,我们称之为管理网络分区。网络分区可能会分出超过两个分区,但是可能性很小。

现在,我们尝试从HA的角度思考。当HA和master之间失去了网络连接,他们会重新选出一个新的master。所以,当网络分区出现时,master选举就会开始。

如果一个集群被分区成多个碎片,每一个分区都能选举出它自己的Master。也就是说,如果一个集群中有四个分区,则这个集群有4个Master。如果网络分区被纠正,四个Master中的其中一个会重新接管整个集群。值得注意的是,master是能够对再不同分区的虚拟机负责的,如果这个情况发生,虚拟机发生了故障,master会通过数据存储通信机制注意到这件事。

在HA架构中,主机是否分区是由master上报情况决定的,因此,在刚刚图片中的实例中,主机01上的master会上报主机03和04被分区。而主机04会上报主机01和02被分区。当发生分区时,vCenter报告单个master的视角。

当master无法和主机通过管理网络通信时,master会报告一个主机被分去或隔离,这个可以通过主机的数据存储心跳来观察到。master不能区分这两种状态,即隔离还是分区。只有当主机通过隔离的数据存储通知master时,主机才会报告为隔离。

当master没有收到来自slave的网络心跳时,master会检查接下来15秒的主机的生存状态。在主机确认死亡之前,master会验证它是否真的已经发生错误,还是做其他补充的生存状态检查。首先,master会验证主机的数据存储的心跳。第二,master会ping主机的管理网络地址。如果以上两步都无法验证主机还活着,主机会被确认已死亡。这里的主机已死亡,并不意味着主机已经紫屏了,它可能是网络的问题,包括存储网络,使主机从管理员的角度看起来像是被隔离了。其实导致这种现象的原因有很多,这个表格可以解释现象和状态之间的关系。

HA会根据主机的状态出发一些动作。当主机被发现是出错时,将开始重启虚拟机。当主机被发现是被隔离时,主机会被重启。

当一个主机被隔离,仍有两个虚拟机在这个主机上面运行,两个虚拟机分别使用了两个数据存储。这个主机能够验证它是否能够进入这两天虚拟机的数据存储。如果可以,主机会验证这些数据存储是否有Master。如果没有master在管理这些数据存储,隔离响应就不会被触发,重启也不会开始。如果主机不能够访问这些数据存储,例如所有的网络路径都断了,HA会出发隔离响应来保证原虚拟机时关机状态,且能够安全的重启。这可以避免多个master的情况。

虚拟机保护措施

当虚拟机的状态发生改变,vCenter会直接启用master或将虚拟机的HA保护措施关掉。然而,只有当master将状态更改提交到磁盘时才能保证有保护措施。这样做的原因是,master故障会导致仅放置在内存的任何状态更改会丢失。如前文说到的,状态分布在数据存储中,并存储在“protectedist”文件中。

当虚拟机的状态改变信息被提交到磁盘上面后,master会通知VC,因此状态该百年可以被VC和其他监控工具等进程看到。

但如果是没有保护措施呢?当虚拟机关机,它必须从protectedist文件上移除。如下图:


在上一章,我们介绍了一些底层的HA概念,和多个能够提升HA可靠性的机制。而HA的可靠性通常与重启虚拟机有关。

HA会在主机状态改变时做出反应,或者说是一个或多个虚拟机的状态改变时而做出反应。通常HA做出反应的情况是这三种:1. 主机发生错误。2. 主机被隔离。3. 客户机发生错误。

根据不同的情况,同时也根据不同的主机角色,这个过程可能有一些小小的不一样。

重启的优先级和顺序

HA可以在重启虚拟机时,配置虚拟机的优先级。优先级由每个主机来定,而不是从全局来定。已经请求重启的主机将尝试重启所有最高优先级的虚拟机,然后在尝试重启其他低优先级的虚拟机。当尝试重启高优先级虚拟机失败时,将会在等待一定时间后重新尝试。同时,HA会继续启动其他的虚拟机,不要忘了有些虚拟机可能依赖于代理虚拟机。您要记录下来那些须立即是由依赖关系的,同时也要记录下来这些服务启动的正确顺序,一次保证代理虚拟机不会出现重启错误。

下面时建议的重启顺序:

  1. 代理虚拟机
  2. FT辅助虚拟机
  3. 有高优先级的虚拟机
  4. 有中优先级的虚拟机
  5. 有低优先级的虚拟机

你需要知道HA不会放置任何的虚拟机到主机如果他所需的代理虚拟机没有在这台主机上运行。

重试重启

重新尝试重启的次数是由VC高级选项中的das.maxvmrestartcount来设置的。默认的值是5。

HA会尝试在受影响的集群中的某一台主机启动虚拟机,如果在这个主机上面启动失败,则计数器增加1。在我们进入确切的时间线之前,先要明确,T0是master发起的第一次尝试重启的时间点。这本身应该是在虚拟机发生故障的30秒以后。但是,虚拟机出现故障和重启之间经过的时间应该取决于故障的情况。

正如上文说到的,默认的重启次数是5,这有一些时间点可能需要重视,m是分钟的意思:

  1. T0
    1. 开始重启
  2. T2m
    1. 尝试再次重启
  3. T6m
    1. 再次尝试重启2
  4. T14m
    1. 再次尝试重启3
  5. T30m
    1. 再次尝试重启4

就像在上面这个图片中看到的,一个成功的启动可能需要半个小时。当然,时间可能并不完全一样。例如,在重启和再次尝试重启中间需要间隔2分钟。HA会尽快检测到重启动作失败了。但是现实情况可能是T2的时间加上额外的8秒钟。另一个非常重要的事实就是,多个master之间不会互相牵制互相影响。因此,每一个master会根据他们自己的顺序来重启虚拟机,但是只有一个master会成功,这种情况也会影响时间线。

如果没有启用HA会发生什么呢?在vSphere6.0之前,这些虚拟机会被抛弃。在6.0之后,这些虚拟机发生错误之后会被注册到另一个主机。这也就允许我们在发生错误后不需要手动将这些虚拟机重新注册并开机。切记!HA仅仅会帮助你注册这些虚拟机,不会帮助你开机!

使用一个例子来解释一下。假设现在有一个集群,这个集群中有四个主机01、02、03、04。其中master在01主机。02主机上面有一个运行的虚拟机vm01。master想要重启这个虚拟机,但是失败了。他会重启这个虚拟机5次。非常不幸,在第四次尝试的时候,master还是失败了。一个新的选举因此开始。03主机变成了新的master,他开始重启这台虚拟机,如果重启失败,他仍然会再次尝试重启4次,总共重启了5次。

因此,可能存在计数器达到了最大值,但是虚拟机仍然没有成功重启。

当涉及到重启时,需要意识到的一件非常重要的事情是,HA不会在给定的主机上同时发出超过32个并发的开机任务。举个例子,假设一个集群内有两个主机,其中一个主机有33个虚拟机,且这个主机发生了错误。那么这台主机上面的33台虚拟机都需要重启。这种情况下,仅会有32台虚拟机被重启,第33台主机只有在前面的32台虚拟机中其中一个成功或失败重启以后,才会开启重启的动作。

但是假设,现在有32台虚拟机是低优先级的,还有另外1台高优先级的虚拟机。这32台虚拟机必须要等到那一台高优先级的虚拟机完成重启动作(可以是成功,也可以是失败)之后才能开始。也就是说,可能存在这种情况,高优先级确实优先重启了,但是重启失败了,那么,其他低优先级的仍然会在此刻开启重启动作。虽然重启可能是低优先级的虚拟机抢先,但是一旦放置虚拟机全部完成,高优先级的虚拟机还是有权利拿到所有他需要的资源。

出错的主机

当我们讨论出错的主机的时候,我们需要区分master主机和slave主机。因为重启动作在这两种主机上有一点点的不一样。

Slave主机出错

Slave主机出错是一个较为复杂的情况。这种复杂与前面提到的心跳机制有关。

可以将Slave主机出错分为两种情况,一种是有数据存储的心跳检测,一种是没有。

时间线如下:

  1. T0
    1. slave主机出错
  2. T3s
    1. master在接下来的15秒开始检测数据存储心跳
  3. T10s
    1. 主机被证明无法连接,master会ping这个主机的管理网络,这个ping持续5秒。
  4. T15s
    1. slave主机并没有配置数据存储心跳检测,主机会被确认已经死亡
  5. T18s
    1. 主机配置了数据存储的心跳检测,主机被确认已经死亡。

master会监控slave的网络心跳。当slave出错,master就无法收到slave的心跳检测了。我们指的T0就是这个时间点。在三秒以后,master会开始检测数据存储的心跳检测,这个检测持续15秒。在第10秒的时候,没有检测到任何网络心跳和数据存储心跳,这台主机就会被认为已经失联了。master会开始ping这个slave主机的管理网络,这个过程持续5秒。如果数据存储心跳没有配置,那么这个主机直接在第15秒宣告死亡。虚拟机会在master的引导下重启。如果配置了数据存储的心跳检测,主机会在第18秒的时候宣告死亡,并在此时开始重启虚拟机。下图可以更好帮助理解。

在虚拟机开始重启之前,master会筛选出那些虚拟机他认为已经出错了。master使用protectelist来确定这件事。这个文件在磁盘上的这个状态,同一时间内只能由一个master看到。因为,这个master会打开这个文件,并且不与其他人分享。如果有一个网络分区,那么多个master可以重启同一台虚拟机,因为VC也提供了重启所需要的全部信息。例如这种情况:一个master锁定了虚拟机的主数据存储并有权力访问protectelist。而另一个主服务器和VC联系,从而知道了当前所需的受保护状态。在这时,master没有虚拟机的主数据存储,master根据VC提供的信息重启虚拟机。

Master主机出错

master出错的这种情况,进程和时间线就有些不一样了。因为在任何重启动作之前,集群都需要现有一个master。这就意味着和slave相比,需要多进行一步选举。因此时间线如下:

  1. T0
    1. master出错了
  2. T10s
    1. master选举活动开始
  3. T25s
    1. 一个新的master被选举出来,并读取了protectedlist
  4. T35s
    1. 新的master开始为所有在清单上的没有运行的虚拟机重启。

之前说到过,slave也会从master的网络读取到master的网络心跳。如果master发生了错误,那这个时间点就是T0。因为每一个集群都需要一个master,slave需要在第10秒开始选举。这个选举会耗时15秒来完成。也就是到25秒时,一个新的master被选举出来,并开始读取protectdlist。这个清单包括所有的被HA保护的虚拟机。在第35秒时,master会帮助被保护但是没有运行的虚拟机重启。

隔离反应和隔离检测

在我们刚开始配置HA的时候,我们就需要决定隔离反应。

隔离反应

隔离反应,就是当HA发现虚拟机所在的主机与网络以及其他节点失去连接时,所做出的动作。这并不一定说明网络就已经坏掉了,他可能是因为这个主机的管理网络的端口问题。今天,我们来讲三种隔离反应。隔离反应就是回答了一下这个问题:当主机检测到他自己从网络上被隔离了,这个主机应该为他管理的虚拟机做些什么?

  1. 断电
    1. 当隔离发生时,所有的虚拟机都要断电,直白一点说就是所有虚拟机的电源直接被拔掉了。
  2. 关机
    1. 当隔离发生时,所有的虚拟机会通过vmware tool来进行关机,如果五分钟后还没有正常关机,则直接断电。这个五分钟的时间也可以通过高级选项的das.isolationShutdownTimeout来设置。当vmware tool根本没有安装时,会立即断电。
  3. 让它继续开机
    1. 当隔离发生时,虚拟机的状态不会有任何改变。

请记住,这个选项只能在新建的集群里面修改。当新建了一个新的集群,他可能会根据已有的集群设置默认的隔离反应。因为每一个版本的默认设置都不大一样,因此当系统升级以后,集群的设置可能会改为最新的默认值。根据客户的反馈,客户们更喜欢选择“让他继续开机”。

基本上,让每一台虚拟机都关机,并且没有重启,这个问题就已经得到了缓解。HA会验证是否可以重启虚拟机。除非绝对必要,否则没有理由让虚拟机停机。例如,在一个拥有iSCSI存储的融合网络环境中,如果有一个完全隔离,则master不可能能够验证虚拟机状态,因为数据存储完全无法进入了。

当管理网络出现问题,且与虚拟机网络故障相关,则我们认为,改变一个隔离反应是最有用的办法。当管理网络出现问题,且与虚拟机网络故障无关,隔离反应会导致不必要的宕机时间,因为虚拟机是可以在没有管理网络连接的情况下继续运行的。

另一个关机的作用是,当虚拟机还有虚拟机网络,但是无法进入存储了,如果让虚拟机继续开机,则两个虚拟机会有完全一样的IP地址。

下面这个图标可以帮助你选择合适的隔离反应:

另一个问题是,HA是怎么知道虚拟机触发了隔离反应需要关机断电的。在隔离反应被触发之前,被隔离的主机会验证master是否能对虚拟机负责。

如前面所说的,当隔离反应被触发,被隔离的主机会移除在poweron文件上面的但是没有开机的虚拟机。Master会发现哪些虚拟机消失了,并开始重启。在此之上,当隔离反应被触发,master会创建一个“per-virtual machine”的文件在poweredoff文件夹下面。这样,master就可以将这些虚拟机关机断电。这个信息只能从master节点读取。HA关机的虚拟机需要HA来重启。

隔离检测

这一小段,我们会讲解隔离是如何被检测的。这个机制非常的直接,他应用到了心跳检测,然而,从时间线上,也分为slave的隔离和master的隔离。

在此之前,我们需要知道,当有一个ping是成功的,或主机发现了选举的动作并选出了master和slave时,隔离反应不会被触发,这正是我们需要的,因为这样可以避免宕机时间。如果一个主机声明自己被隔离了,但是观察到了选举的动作,则他会再次声明他已经不再处于隔离状态。

slave的隔离

HA会在他声明有主机被隔离之前触发开始master选举,以下是slave主机隔离的时间线

  1. T0
    1. slave主机隔离
  2. T10s
    1. slave进入到“选举状态”
  3. T25s
    1. slave选他自己为master
  4. T25s
    1. slave会ping隔离地址
  5. T30s
    1. slave声明自己被隔离了
  6. T60s
    1. slave触发隔离反应

当隔离反应被触发,HA会创建一个“power-off”文件,每一个HA让关机的虚拟机且主数据存储可访问的虚拟机都会被记录在这个文件中。当下一次,HA关掉某虚拟机,主机的poweron文件会被更新。当虚拟机恢复开启或HA被关掉了,则poweroff文件会被删掉。

在上面所说的步骤完成以后,master会知道slave是通过poweron文件被隔离的。重启虚拟机是基于slave提供的信息。

Master的隔离

在master的隔离情况中,时间线有一点不一样。因为这里不需要进行选举过程。

  1. T0
    1. master被隔离
  2. T0
    1. master尝试ping隔离地址
  3. T5s
    1. master确定自己被隔离了
  4. T35s
    1. master触发隔离反应

更进一步的检查

在主机确定自己被隔离之前,他会ping默认的隔离地址,也就是管理网络的网关。并且会持续ping,直到解除隔离。HA中,用户可以在高级设置中选择自己定义的一个或多个隔离地址。使用“das.isolationaddress”。我们建议除了默认的隔离地址外,设置另外一个附加的隔离地址。如果配置有额外的管理网络,这个附加的隔离地址可以是这个额外的管理网络。最多可以设置10个隔离地址。额外的管理网络很有可能在其他的子网上面,建议附加的隔离地址在原来的子网。

额外的隔离地址

我们通常建议,主机的隔离地址选择在一个靠近主机们的地方,这样可以避免太多的网络跳跃和虚拟机网络的活跃度。从逻辑上,物理交换机直接连接主机。基本上,使用管理网络的任意子网网关。当你使用IP为基础的存储,例如NFS或ISCSI,存储设备的IP地址也是一个很不错的选择。

隔离政策延迟

对于那些想要在HA执行之前增加时间的人,他可以设置隔离反应的高级设置。这个设置叫”das.config.fdm.isolationPolicyDelaySec”。在这里可以更改隔离政策被执行之前等待的时间。最小值为30。即使设置了小于30的值,仍会延迟30秒。我们不推荐修改这个选项,除非你真的有很特别的需求,多数情况下,30秒的延迟已经足够多了。

重启虚拟机

由于前文提到了,从时间上讲,slave和master的情况不大一样。因此我们先说一说slave主机失败的情况。当master主机确定了slave已经被分区或被隔离了以后,master会通过poweron文件来区分哪一个虚拟机之前是运行状态的。这些文件是每隔30秒来异步读取一次。如果主机在失败之前不是被分区的或被隔离的,则master使用缓存数据来辨别那些虚拟机是在主机失败之前开机的。

在master开始重启虚拟机之前,master会先验证虚拟机应该被重启。这里的验证,使用到了在protectedlist文件中VC给每一个master提供的保护信息。当文件被锁住,或master失去了与VC的连接,虚拟机会被过滤除去。在这时,所有的禁用了重启优先级的虚拟机也会被过滤掉。

现在,HA知道哪些虚拟机需要被重启。接下来就是决定这些虚拟机重启后应该被放置在什么地方。HA需要以下信息:

  • CPU预订和内存预定,包括虚拟机的内存开销
  • 集群上主机没有被预定的资源
  • 虚拟机重启的优先级
  • 虚拟机主机兼容组合
  • 虚拟机需求的dvPort数量,和候选主机上的数量
  • 在规定的主机上面最多多少个vCPU和虚拟机。
  • 重启延迟
  • 需求的代理虚拟机数量

重启延迟是指启动虚拟机重启所需的时间。这意味着虚拟机重启需要由master分布在多个主机上,从而避免在单个主机上发生很多个引导的拥挤。

如果虚拟机的放置地点找到了,master会告诉其对应的目标主机“某虚拟机需要重启”。重启主机最多32个,重启之后要在重启列表上移除。

如果虚拟机的放置地点没有找到,master需要讲虚拟机放在一个pending placement list等待安置清单。并会在以下条件发生时,再次尝试放置:

  1. VC提供了一个新的虚拟机主机兼容列表
  2. 有主机报告有预定的资源被释放
  3. 有主机加入到集群
  4. 有新的错误被检测到,并且虚拟机故障转移failover
  5. 当虚拟机故障转移时,一个错误发生

master会报告,由于资源不足,有一些虚拟机没有被放置。如果DRS开启了,这些信息会告知DRS,DRS会找到所需的资源。

组件保护

从vSphere6.0开始,在设置HA的时候有一个新功能,叫做组件保护VM Component Protection(VMCP)。这个功能让你有能力对抗存储系统的出错。有两种组件保护,分别为PDL,即Permanent Device Loss和APD, 即All Paths Down。长期设备丢失和全路径下线。

PDL条件,即阵列控制器通过SCSI检测代码和ESXi通信的条件。这种情况说明LUN已经不可用,并且很有可能是永久损坏。举个例子当LUN已经下线,并且通过阵列控制器保持通信。这种情况下,为了保证ESXi在LUN失效的情况下正常工作时,使用PDL。要注意的是,当一个满了的存储发生错误的时候,不可能产生PDL情况,因为哪里没有阵列和ESXi主机之间的通信了。这时,主机会进入APD状态。

管理和开启这个功能还是有一些难点的,它要求必须手动设置一个选项“disk.terminateVMOnPDLDefault”。

APD的情况下,vSphere是无法做出反应的。存储设备无法访问。在大多数情况下,都是因为存储的网络出现问题。当APD发生,有一个计时器就启动了。在APD确认发生的140秒后,设备会被标记为APD超时。当过去140秒后,HA会开始计时。HA超时是默认设置的3分钟。当三分钟过去了,HA会采取行动。有两个选择,一个是记录事件”Issue Events“,一个是关机和重启虚拟机。

你还可以指定HA需要以怎样积极(激进)程度的尝试重启受到APD影响的VM。注意,激进或保守指的是能够重启虚拟机的可能性。当设置为“conservative”保守时,HA只会重启收到APD影响的虚拟机。当设置为“aggressive”积极时,即使不知道其他主机的状态,HA也会尝试重启虚拟机。这可能导致虚拟机没有重启的情况。因为在这种情况下,可能存在主机无法访问虚拟机所在的数据存储。

Ref.

vSphere HA Deepdive by Duncan Epping is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. This means you can fork, contribute, and (re)distribute the material. As long as appropriate credits are given and it is not used for commercial purposes.

http://www.vmgu.ru/ext/books/vsphere-ha-deepdive.pdf

Categories:

Tags: