为保证业务系统的安全和稳定性,定期为操作系统更新补丁是目前系统管理员经常经常要做的一项工作。但是根据运行的业务,并不是所有补丁都是可以进行更新的。比如小编最近遇到的一个问题,就是因为客户更新了一个不该更新的系统补丁导致的。
 
客户是一套Exchange Server 2013的环境,2个前端服务器,3个后端服务器,3台后端服务器同属于一个DAG中,有十多个个数据库,都有3个副本,最近发现有一台邮箱服务器上的数据库主动副本,经常自动的切换到其它邮箱服务器,其它2台服务器不存在这个问题。
 
为了重现这个问题来查找原因,我们手动将几个主副本切换到了这台服务器上,过来大概一天左右的时间,竟然真的自动切换到其他服务器上了。

通过分析最近一次切换的事件日志,我们发现有以下一些日志似乎与这个故障相关:

<font color=#00F00 size=3 >事件 ID:164
来源: ExchangeStoreDB
描述:在 '2017/12/11 11:23:12',此服务器上的 Exchange 存储数据库 'xxxxx' 副本在定期状态检查时超时。有关失败的详细信息,请查询服务器上其他存储和 "ExchangeStoreDb" 事件的事件日志。成功的故障转移已还原了服务。</font>
Exchannge 2013数据库副本频繁自动切换

<font color=#00F00 size=字号 >事件 ID: 1002
来源:MSExchangeIS
描述:Unhandled exception (System.Threading.LockRecursionException: 此模式下不允许以递归方式获取读取锁定。</font>
Exchannge 2013数据库副本频繁自动切换
<font color=#00F00 size=字号 > 事件 ID:1013
来源: MSExchangeIS
描述:The mailbox with mailboxguid "fb9e5930-0ea8-4cca-9a92-406fbc874451" caused crash or resource outage on database (GUID="5d7bf16f-f22c-4615-9ee9-177bc59e1032"). Description: LockRecursionException: </font>
Exchannge 2013数据库副本频繁自动切换

<font color=#00F00 size=字号 > 事件 ID:164 </font>
Exchannge 2013数据库副本频繁自动切换
<font color=#00F00 size=字号 > 事件 ID:1021 </font>
Exchannge 2013数据库副本频繁自动切换
<font color=#00F00 size=字号 > 事件 ID:1007</font>
Exchannge 2013数据库副本频繁自动切换
<font color=#00F00 size=字号 > 事件 ID:2157</font>
Exchannge 2013数据库副本频繁自动切换
根据以上日志分析,我们基本发现了自动切换的过程是由于系统对数据库自动运维期间出现的,比如对副本的定期检查,存储维护助理。随后就会产生索引失败,副本停止,自动切换等日志。
 
因此,我们在排错的最初阶段一直关注的是自动运维期为什么会造成自动切换,是性能的问题呢,还是数据库本身出现了问题。根据对相关日志的分析和资料搜索,很多预想的可能性都被一一的排除掉了,而且,通过上述日志的分析,我们发现有一个KB3095369,如下:
<font color=#00F00 size=字号 > Mailboxes are quarantined and databases fail over unexpectedly in Exchange Server 2013
https://support.microsoft.com/en-us/help/3095369/mailboxes-are-quarantined-and-databases-fail-over-unexpectedly-in-exch?sd=rss&spid=16662</font>;
 
包括了好几个事件的ID,但是仔细阅读这个KB,我们发现它解决的是邮箱被频繁锁定的问题。造成的原因是操作系统安装了 .NET Framework 4.6。
 
为了验证我们的问题是否和此有关,我们分别在四台服务器上利用了KB中提到的一个检查当前系统 .NET Framework版本的Powshell脚本,进行了验证,<font color=#00F00 size=字号 >发现有故障的邮箱服务器的版本为:4.6 or later:</font>
Exchannge 2013数据库副本频繁自动切换
<font color=#00F00 size=字号 >其它三台则为:4.5.1:</font>
Exchannge 2013数据库副本频繁自动切换
<font color=#00F00 size=字号 >这个情况,似乎正好反映了当前环境四台服务器只有一台出问题?</font>

脚本如下:


    $Reg =[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
    $RegKey=$Reg.OpenSubKey("SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full")
    [int]$NetVersionKey=$RegKey.GetValue("Release")

    if($NetVersionKey -ge 381029)
    {
        "4.6 or later"
        return
    }
    switch ($NetVersionKey)
    {
        {($_ -ge 378389) -and ($_ -lt 378675)}{"4.5"}
        {($_ -ge 378675) -and ($_ -lt 379893)}{"4.5.1"}
        {$_ -ge 379893} {"4.5.2"}
        default {"Unable to Determine"}
    }

<font color=#00F7F size=5>确定是否安装 .NET Framework 4.6</font>

  • 检查系统是否已安装以下两个补丁或其一或通过PowerShell脚本查询(脚本详见上面):

    Update forMicrosoft Windows (KB3045562)
    Update forMicrosoft Windows (KB3045563)

  • 确定那一台服务器安装了 .NET Framework 4.6,则尝试卸载已安装的相关补丁并重启服务器:
    Exchannge 2013数据库副本频繁自动切换
  • 再次使用脚本查询.Net的版本:
    Exchannge 2013数据库副本频繁自动切换

  • 将部分数据库的主动副本在该服务器激活,观察是否不在出现自动切换至其它服务器的情况。

<font color=#00F00 size=5 >总结:</font>这个故障原因,可以发现,主要是因为在系统中安装的补丁,使.NET Framework 版本的升级,造成了系统的不稳定。所以,我们在以后打补丁时需要进行必要的审核,测试和验证,以免不适当的补丁被更新。