WSFC日志分析进阶篇

在群集日志分析基础篇中,老王为大家介绍了几种群集日志的位置和用途,例如事件管理器系统日志中可以告诉我们,当群集出现故障时,大体是什么原因导致的,给出一个方向,应用程序日志里面的FailoverClustering - Manager -Diagnostic日志可以帮助我们在事件发生后回溯执行过那些操作,FailoverClustering - Operational日志可以帮助我们了解群集资源,网络检测,安全的基本变化情况是否正常,还有群集管理器中的汇总日志,这些日志,通常情况下可以为我们指出一些明确的方向,告诉我们应该去看什么的问题,可以看见一些基本的资源变化信息和操作记录,帮助我们回溯一部分问题。

但是在一些情况下,可能出现的问题,在这些日志中并没有给出明确的解释,或者我们认为可能并不是事件日志里面所说的问题,我们仍需要更加详细的信息,这时候我们就可以去看群集诊断日志,什么是群集诊断日志,简单来说,群集诊断就是记录群集运行过程中的所有内部执行过程,你能想到的,资源上线下线迁移,运行状况检测,等等,几乎所有和群集运行有关的东西都会被记录在这个诊断日志中,2012时代开始默认情况可以在事件管理中看到,群集一边运行着,这个事件日志就会不断的更新增长

诊断日志和其它日志最大的不同就是,其它的群集相关日志也会记录群集的运行状况,资源变化,但是呈现在事件日志中都相对友好一些,基本上不会出现很多底层的语言,让我们看到基本上就可以看懂,而诊断日志则不同,在诊断日志中,会把群集中的一些核心组件也呈现出来,例如RHS,RCM,NetFT等核心组件的运作也会呈现出来,因此诊断日志也最为深入和详细,不论是对于群集做深入的排错,还是希望了解群集内部的运作原理,学会看诊断日志是最佳的选择。

在看诊断日志的时候,您可能会看到里面有很多群集核心组件的缩写,例如下图这些,初学者如果看不懂缩写的意思,可以复制下来,去网上搜索,然后记下来,这里老王挑选三个我认为比较主要的核心组件来和大家解释

RHS:中文 资源主机子系统,实际运作时会呈现成一个个的系统进程,这个组件干嘛的呢,它会根据Resource.dll里面定义的检测规则,以及我们定义的检测策略,去实时监控各种群集对象的运行状况,例如群集磁盘,群集IP地址,群集网络名称,应用程序,RHS实际检测的时候主要是依据当前已经加载的群集资源对象Resource.dll中两个参数来判断群集资源的存活与否状态,分别是looksalive check,is alive check

顾名思义looksalive check就是说,资源看起来是活着的,因此,在looksalive check过程中,通常情况下RHS会执行相对来说简单的检测操作,例如每隔3秒检测群集磁盘是否接受预留请求请求。如果通过looksalive check并不能有效的检测出资源是否存活,RHS还会尝试使用is alive check的方式进行具体的检测,相比较looksalive来说is alive则会从更加深入的角度去检测资源的存活状态,例如,is alive对于群集磁盘的检测会实际要求执行一个Dir命令,针对于SQL的检测,会实际执行一个查询来确认SQL群集资源的存活,因此lookalive的检测通常是基本化的,is alive检测通常是彻底的深入的,如果is alive的检测也失败,则RHS会报告资源的状态为失败,然后反馈给RCM组件进行进一步的资源处理

RHS,不论是对于任何的一个群集资源都会去尝试执行looksalive check,is alive check的检测操作,但是针对于不同的群集资源对象,检测的方法都会不同,针对于一部分群集默认资源,例如群集IP,群集资源,群集网络名称,RHS会通过加载默认的ClusRes.DLL去进行检测,不同的群集对象可能会用到不同的Resource.dll,开发人员可以把自己的程序与WSFC集成,编写自己程序的Resouce.dll融入到群集中

通常情况下,Resource.dll会起到以下两个主要作用,一个起到应用程序与群集之间的代理作用,当我们在故障群集管理器上面针对于群集对象联机,脱机,启用,禁用等操作时,实际上要求会直接发给资源对应的Resource.dll,再由Resource.dll去通知资源进行状态变化,因此如果要自己编写Resource.dll,首先要确保dll可以对相应的资源对象能够执行管理操作感知

另外Resource.dll还应该明确定义出,针对于特定资源类型的looksalive check和is alive check的检测方法,当is alive检测失败时候应该返回False参数,RHS收到False参数后会把资源标记为ClusterResourceFailed状态

RHS检测系统会根据所有的定义在群集中的Resource.dll里面的looksalive check和is alive check规则去检测群集资源的存活,通常情况下,如果要把自定义开发的应用与群集化,建议还是编写好Resource.dll,这样群集可以进行更加深入的检测,否则只能通过默认ClusRes.DLL去检测应用进程的基本状况

例如微软的SQL和Hyper-V群集化了之后,RHS都会通过它们自身单独的Resource.dll规则去进行检测,SQL Server群集化了之后会在群集中产生特定的SQL服务资源对象,同时也有自身特定的检测方式,RHS可以实际上发出一个真实的查询去is alive检测SQL的存活,Hyper-V群集化了之后也会调用自身特定的Resource.dll,实现可以通过我们定义的高级策略来检测来宾OS是否蓝屏,来宾OS里面的服务是否存活等等,当根据我们定义的检测策略和is alive检测,检测到资源当前不存活,过阵子会在RHS中标记资源为失败状态并报告给RCM,然后RCM看到RHS的标记则会根据资源的故障转移策略对资源尝试执行故障转移,重启启动等操作。

在之前2003时代,群集里面所有资源都在一个RHS进程下面托管着,这样子如果当一个资源对象因为检测失败,也会导致其它群集资源一起出现崩溃或重启的情况,因此在2008时代开始,微软将一部分群集自身的资源对象,例如,群集IP,群集名称,群集磁盘等可以被群集共享的资源放在一个单独的RHS进程中,我们在群集中创建的群集应用可以在单独的RHS进程中工作,这样一旦单个群集应用的RHS检测失败或进程出现问题,并不会影响到群集其它资源的工作,可以通过 cluster . res  /prop命令来查看群集资源的所有属性

其中几个和RHS有关的关键参数

MonitorProcessID: 群集资源关联的RHS进程ID,可以通过查看这个参数来判断分析那些群集资源当前处在同一进程中

SeparateMonitor:  指示资源是否已被放置在单独的监视器中(0:否,1:是)

IsAlivePoleInterval:  默认值如图所示,表示它正在使用该特定资源类型的默认设置。

LooksAlivePollInterval:  默认值如图所示,表示它正在使用该特定资源类型的默认设置。

DeadlockTimeout:  默认设置,表示5分钟。

2008R2时代开始群集资源已经不是都在同一个RHS进程下面运作,针对于关键群集资源和群集应用实际上已经分开了不同的进程,来避免因为单个群集应用崩溃而导致其它群集资源崩溃的情况,但是默认情况下大部分群集资源仍在一个共享配置的监视器中运作,当RHS检测到一个群集资源失败或dll崩溃,则会把它放置在一个独立监视器中进行检测,彻底防止它影响到其它群集资源,在针对群集进行resource.dll的调试时,你也需要把SeparateMonitor值设置为1,否则会因为调试可能时会让共享监视器中其它资源失败。

#设置群集资源在单独的监视器中工作

(Get-ClusterResource “Resource Name”).SeparateMonitor = 1

例如在2008R2时代的虚拟化群集场景,默认情况下所有虚拟机都在同一个共享监视器下运行,一旦发生单个虚拟机发生资源死锁情况,可能会导致上面所有虚拟机都无法使用,因此可以把出现问题的虚拟机单独放在隔离监视器中运行,在实际使用中,对于隔离监视器的使用需要谨慎,因为有时候启用单独的隔离监视器就会出现单独的RHS进程,每个进程都要占用CPU和内存资源,因此需要在考虑服务器资源的情况下启用该高级功能。

RCM:Resource Control Manager ,资源控制管理器,顾名思义,这个组件是帮助我们去管理群集资源的,小到群集磁盘,大到一个群集组,都是通过RCM来帮助我们进行操作管理,可以说,RHS的功能主要是进行检测,发生问题,然后报告问题,而RCM则是实际做处理的,它会根据我们对于群集的操作指令,或者RHS检测到的结果,来进行资源的上线,离线,挂起尝试,故障切换等操作

RCM在执行操作的时候会考虑两点,一点是依赖关系,例如我们要联机上线一个群集组,群集组依赖于群集网络名称,网络名称又依赖于网络IP,因此RCM在处理我们这个联机请求的时候,会先去尝试构建出依赖关系,然后按照依赖关系逻辑逐步完成资源的联机,例如会先去尝试联机网络IP,网络IP联机之后尝试联机网络名称,最终依赖的资源都已经联机成果,才联机整个群集组。

另外一点,当RCM执行操作的时候,默认情况会使用资源定义的故障策略,以及高级策略来进行评估,最终做出合适的操作,例如,当RHS报告群集资源失败,RCM会按照故障转移策略每隔一段时间尝试联机挂起,经过一段时间无法挂起,会把资源置为失败状态,一段时间依然尝试重启启动该资源,如果始终无法重现启动成功,还会尝试把资源移动至其它节点进行尝试,如果都无法成功,会把资源置为失败状态。

由此可以看出,RCM组件主要的作用就是用于执行群集资源的管理操作,以及当群集资源,群集组出现故障时,评估依赖关系,故障策略,高级策略来对资源进行尝试,故障转移,状态确认。

NetFT:NetFT通常指的是Failover Cluster Virtual Adapter,当我们安装群集之后,在设备管理器里面显示隐藏设备可以看到有这样一个虚拟网络适配器,用ipconfig /all也可以看到这块网卡,但是并没有配置IP地址,这个群集虚拟网络适配器的主要作用是帮助我们构建一个群集中网络通信的高可用拓扑,例如,我们群集节点与节点之间要进行心跳检测,每隔一段时间,NetFT就会去帮我们重新构建这个拓扑,例如节点1和节点2,分别有两块网卡,一块专用于群集网络,一块用于群集网络+管理网络,那么当NetFT检测到如果专用的群集网络不能执行心跳检测,就会动态切换至另外一块网卡帮助我们进行心跳检测,NetFT的功能主要就是帮助管理员自动构建群集先有的通信拓扑,在最大程度的帮我们确保群集网络都可以正常的通信。

介绍了几个重要的理论后,我们来实际看下群集的诊断日志,到底长什么样子呢,默认情况下在2012时代诊断日志可以在事件管理器中看到,但是由于是实时增长的,看起来不太直观,我们很难在里面快速找到自己想要的信息,所以除了事件管理器,我们也可以通过Powershell命令Get-ClusterLog来生成群集的诊断日志,和事件管理器中的诊断日志不同,当我们使用Get-Clusterlog获取诊断群集日志时,不论是2008还是2012,都会把事件管理器,或ETL文件里面的诊断日志合并,然后筛检一部分,去掉无用的信息,只保留下来真正有用的诊断信息,形成一个log文件,便于管理员分析。

默认情况下如果我们直接在powershell中执行 Get-CluserLog就可以输出群集的诊断日志,打开之后就可以看到,但是,默认情况下2012R2里面诊断日志最大是300MB,一旦超过这个大小,则当日志再出现时,会覆盖掉之前日志,2008时代是100MB的限制

如果直接执行Get-ClusterLog,将会输出从群集开始到现在所有的Log,假设你的群集日志没有达到过300MB,没有发生过覆盖,会生成出所有的log,但是有时候生成这么大的日志会花费一些时间,而且Get-ClusterLog这条命令一旦执行下去,不单单是生成当前节点的诊断日志,也会去让其它节点也生成cluster.log到report目录,因此,使用Get-ClusterLog时有一些参数可以配合使用

#日志不多,可以直接运行Get-ClusterLog,会输出从集群建立到现在所有的

Get-ClusterLog

#只希望输出最后五分钟的日志

Get-Clusterlog -TimeSpan 5

#只希望指定的节点生成日志

Get-Clusterlog -Node Nodename

#如果在不指定路径的情况下,每次生成都会覆盖Report目录下已有的log,希望把各个节点的日志统一生成到一个目录下,可用利用Destination参数,在目录中会看到带有节点名字的各个log

Get-Clusterlog -Destination path

默认情况下cluster log的日志级别为3,通常情况下Level 3已经足够详细,如果在进行一些诊断的时候,你也可以通过 Set-ClusterLog -Level 5 设置级别为5进行高级诊断,需要注意如果设置Level 5 会导致短时间内日志持续飞速增长,建议诊断完成后及时恢复3

下面我们实际生成一下来看

生成完成的clusterlog默认会存在各节点的Report路径下

打开之后界面如下

这时候你可能需要一个自己用的习惯的日志分析用具

可以看到clusterlog似乎与我们其他地方看到的log不太一样,到底应该如何去理解呢,我们以一个例子来看

进程ID:资源所在的16位RHS进程ID

线程ID:资源16位RHS线程ID

GMT时间:事件发生时的GMT时间,精确至毫秒级别,最初考虑到群集节点可能会是分布在不同的时区,所以使用了GMT,实际看的时候,东半球需要加上8小时,在2016群集中新增了UseLocalTime 参数,生成clusterlog的时候,如果我们确认节点都在同一时区可以使用UseLocalTime生成本地时间戳记

日志级别:通常有INFO,ERR , WARN,DBG等状态,其中可以在日志分析中跟踪ERR关键字

资源类别:是有那个类别的资源类型和群集组件产生的日志

资源名称:具体的资源名称

说明:对于日志的详细说明

在Cluster.Log中有一些关键的属性,大家在使用Cluster.Log的时候可以主要关注下,并且设置在分析工具中追踪

OnlinePending:资源联机挂起

OfflinePending:资源正在进行离线

Offline:资源离线

ProcessingFailure:资源失败

通过直接在日志分析工具中搜索相应的关键字,就可以看到附近发生的上下文过程

下面我们以几个实际的案例来看

NetFT组件尝试帮助我们构建群集网络通信拓扑,可以看到这里详细的运作过程,发现只会在18网段,10,20网段之间进行尝试建立3343连接,因为我们设置了30 40网段为存储网络,不参与群集通信,因此构建拓扑时NetFT不会考虑这两个网络

08R2群集由于当前只有一个节点在运行,群集存储之前一直是失败状态,17:10这个时间节点,我将群集存储恢复联机上线,17:11时间节点,禁用ISCSI目标

生成clusterlog可以看到,10分的时候,RHS继续尝试检测群集磁盘1,发现群集资源1的RES资源已经正常挂载,检测也正常通过,因此RHS将把群集磁盘1状态变成联机的情况报告给RCM,RCM变更群集磁盘状态为联机

11分的时候RHS针对于群集磁盘1的Is Alive检测失败,判定该资源失败,并将失败的状态报告给RCM,RCM变更群集磁盘状态为失败,紧接着RCM会按照故障策略对群集磁盘尝试进行挂起重试操作,在一段时间内一直得到失败的结果,会标记群集磁盘为失败状态,然后隔一段时间后再尝试联机

第三个实例我们查看当我们执行LowerQuorumPriorityNodeID时群集内部发生的动作

时间节点1,群集四个节点,见证磁盘失效,当前群集随机调整去掉一个节点投票

时间节点2 ,使用LowerQuorumPriorityNodeID设置去掉HV04节点的投票

#使用命令输出所有群集节点最后五分钟的目录至统一文件夹

Get-ClusterLog -Destination \\iscsi\clusterlog -TimeSpan 5

打开HV03的日志可以看到,时间节点1,当检测到群集磁盘离线时,仲裁首先挑选去掉节点1的投票,时间节点2我们手动设置LowerQuorumPriorityNodeID为HV04,群集重新调整动态仲裁,去掉HV04的投票

第四个实例,我们可以看到,当NetFT构建群集内网络通信拓扑时,会考虑到网络会子网内还是跨子网,可以根据情况设计不同网络环境下的运行状况检测频率,NetFT会按照我们的定义来构建不同网络环境运作状况检测的拓扑。

最后一个实例,我们来模拟下当群集四个节点,坏掉三个节点,且最后两个节点时,投票节点忽然被断电,强制启动群集后的阻止仲裁情况

现在群集只剩下HV01节点被强制启动,我们这时启动下HV04节点

获取群集诊断日志,我们就看最近20分钟左右的,看看从群集关闭,强制仲裁,再到阻止仲裁到底发生了什么

Get-ClusterLog -Node HV01,HV04 -Destination \\iscsi\clusterlog -TimeSpan 20

我们先看HV01的日志

可以看到,时间节点一,HV01强制启动了群集服务

紧接着初始化各个群集组件,仲裁组件判定HV01已经初始化完毕,提升HV01的paxos标记为权威,这时应标记为FixQuorum状态,可以看到,虽然不在UI显示了,但是在后台运作的时候仍然会指出当前节点正在强制模式下运行

这时HV04试图上线,但会被阻止,HV01会收到群集环境内有新的加入请求,并告诉我它我是权威的节点,我的paxos标记最高,你应该以我的为准,加入我的分区,同步我的群集数据库

这时我们再来看看HV04的日志,因为HV04的ID为3,因此在日志中会看到Node 3 也就是HV04

时间节点1,Node3 尝试启动群集服务,但是启动之后被终止,

时间节点2 Node3指出,我的仲裁状态属于阻止状态,我试图加入,我应该先去和那个权威节点同步

时间节点3 Node3收到HV01的响应,以HV01为群集的权威方,按照HV01的paxos标记更新数据库

时间节点4  Node 3已经将群集数据库和HV01保持一致,再次加入群集,正常加入,关闭阻止仲裁模式,并且去掉了NeedsPrevent标记!

以上老王通过几个简单的实例,来为大家讲解了下应该如何去看cluster log,希望能够引起朋友们的兴趣,可以看到cluster log里面会真正涉及到很多群集底层组件的详细运作过程,如果你能够把这些底层组件的工作原理都搞清楚,老王相信不论是对于你进行排错,或者学习都会有一个不一样的境界。

在实际的群集排错中呢,老王认为主要还是通过不断的学习,实验,实战来巩固自己的知识经验,排错时手段占一部分,但是自身的知识和经验积累也要占很大一部分,例如老王遇到群集的问题,我的思路通常是先获取下群集节点投票,见证投票,看看见证资格当前是怎么样的,接着我会去看系统事件中筛选群集部分,看看网络和存储是否有报错,然后跟着自己的经验去分析判断问题

其实老王感觉对于一般的排错,事件管理器系统,应用程序日志中旳群集日志已经可以提供足够明确的信息,事实上微软在2008时代改变群集事件的时候就曾经有个愿景,希望可以让更多的管理员通过看事件管理器就能了解解决一部分问题,到了2012时代事件管理器中的日志确实也达到了微软的愿景,确实很多问题,日志已经提示的很明确

但是一旦遇到一些问题,事件管理器中给出的提示无法解决,这时我们仍需要直接看cluster log,来从群集的最底层去了解故障的彻底原因。

如果是需要进行一个综合性的排错,例如综合排查三个节点的群集错误和虚拟化错误,这时候你可以选择查看群集管理器中的群集事件,来进行一个综合性的排错

如果是需要进行群集的健康检查,看看还有那些最佳实践没有执行,可以执行群集验证报告,群集验证报告也会提供很多有用,底层的信息。

时间: 2024-11-05 12:24:18

WSFC日志分析进阶篇的相关文章

《Mycat学习笔记》 第二篇. MySql 读写分离与日志分析——主从多结点

1    环境说明 接上篇环境   <Mycat学习笔记> 第一篇. MySql 读写分离与日志分析——主从单结点 http://www.cnblogs.com/kaye0110/p/5134588.html 增加一套 mysql 实例,端口为3308 ,通过Binlog方式同步主机情况 localhost : 3306 主机,    在mycat 中配置为 writehost 1 localhost : 3307 从机 a ,在mycat 中配置为 readhost localhost :

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒),获得表锁定的时间不算作执行时间.慢日志默认写入到参数datadir(数据目录)指定的路径下.默认文件名是[hostname]_slow.log,默认超时是10秒,默认不开启慢查询日志.下面查看慢日志的几个参数: -- 是否开启慢日志 SHOW VARIABLES LIKE 'slow_query_log'; -- 慢日志文件记录位置 SHOW VARIABLES LIKE 'slow_query_

Visual Studio调试之断点进阶篇

Visual Studio调试之断点进阶篇 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常.程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler).IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样 初始化IDT,可以去网上搜索一些资料. 总之,这里我们只要知

GSON使用的学习笔记,进阶篇(三)

本篇笔记内容比较杂乱,没有专门去整理. TypeAdapter 现在轮到TypeAdapter类上场,但考虑到gson默认行为已足够强大,加上项目实践中应用json时场景不会太复杂,所以一般不需要自定义TypeAdapter.TypeAdapter优点是集成了JsonWriter和JsonReader两个类,定义了一套与gson框架交互的良好接口,同时便于管理编码和解码的实现代码,不至于太零碎.因而在了解JsonReader和JsonWriter的使用方法之后,自定义TypeAdapter类来完

idea 插件的使用 进阶篇(个人收集使用中的)

idea 插件的使用 进阶篇(个人收集使用中的) 恭喜你,如果你已经看到这篇文章,证明在idear使用上已经初有小成!那么就要向着大神进发了! 下边就是大神之路! 插件的设置 在 IntelliJ IDEA 的安装讲解中我们其实已经知道,IntelliJ IDEA 本身很多功能也都是通过插件的方式来实现的,只是 IntelliJ IDEA 本身就是它自己的插件平台最大的开发者而已,开发了很多优秀的插件. ? 官网插件库:https://plugins.jetbrains.com/ ? 如上图标注

ToughRADIUS 安装进阶篇

在进阶篇里,我们将会提供本地化的安装参考,但相比起快速指南,进阶篇需要更强的专业知识和动手能力,为了节约您宝贵的时间,我们并不鼓励所有人都来尝试. 在安装成功之前,你可能会遇到关于 linux,git,python,mysql等一些列问题,如果你对这些都不熟悉,那么你只会遇到越来越多的问题,尽管这些问题在具备相关专业知识的人眼前不值一提.如果你觉得linux,git,python,mysql 这些都不是个事,那就继续吧. 不适合这篇教程的人 从来没有成功安装过 linux 的 装完 linux

mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间后回滚.系统默认值是50秒.用户可以根据业务自行设置.生产环境不推荐使用过大的 innodb_lock_wait_timeout 参数值. -- 查看事务超时时间 SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; 也可以对当前会话进行超时设置如: set

Elasticsearch顶尖高手系列-高手进阶篇(最新第二版)

第1节结构化搜索_IT技术论坛案例背景介绍第2节结构化搜索_在案例中实战使用termfilter来搜索数据第3节结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)第4节结构化搜索_在案例中实战基于bool组合多个filter条件来搜索数据第5节结构化搜索_在案例中实战使用terms搜索多个值以及多值搜索结果优化第6节结构化搜索_在案例中实战基于rangefilter来进行范围过滤第7节深度探秘搜索技术_在案例中体验如何手动控制全文检索结果的精准度第8节深度探秘搜索技

SQL Server调优系列进阶篇(深入剖析统计信息)

前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQL Server2008R2,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks 相信了解SQL Server的朋友,对这两个库都不会太陌生. 概念理解 关于SQL Server中的统计信息,在联机丛书中是这样解释的 查询优化的统计信