Skip to content

SQLServer FCI 节点故障处理

FCI 故障概述

Failover Cluster Instance (FCI) 是 SQL Server 的一种高可用解决方案,它将 SQL Server 实例部署在 Windows Server Failover Cluster (WSFC) 上,实现自动故障检测和故障切换。在 FCI 环境中,当活动节点发生故障时,WSFC 会自动将 SQL Server 实例故障切换到被动节点,确保数据库服务的高可用性。

FCI 故障类型

  1. 节点故障

    • 活动节点硬件故障
    • 活动节点操作系统崩溃
    • 活动节点网络连接故障
    • 活动节点电源故障
  2. SQL Server 服务故障

    • SQL Server 服务意外停止
    • SQL Server 服务崩溃
    • SQL Server 服务无响应
  3. 集群资源故障

    • 共享存储故障
    • 集群网络故障
    • 集群资源依赖关系故障
    • 集群资源配置错误
  4. 应用程序故障

    • 数据库连接故障
    • 查询执行超时
    • 死锁和阻塞

故障检测与监控

故障检测机制

FCI 的故障检测主要通过 Windows Server Failover Cluster (WSFC) 实现,包括以下机制:

  1. 心跳检测

    • 集群节点之间定期发送心跳消息(默认每1秒)
    • 如果在指定时间内(默认5秒)没有收到心跳消息,则认为节点不可用
    • 可以通过调整集群属性修改心跳检测参数
  2. 资源监控

    • WSFC 监控集群资源的状态,如 SQL Server 服务、共享存储、网络等
    • 如果资源状态异常,WSFC 会尝试重启资源
    • 如果重启失败,WSFC 会将资源故障切换到其他节点
  3. 健康检测

    • 监控节点的 CPU、内存、磁盘等资源使用率
    • 监控 SQL Server 服务的健康状态
    • 监控数据库的状态

故障监控工具

  1. 故障转移集群管理器

    • 查看集群的状态和健康情况
    • 查看节点的状态
    • 查看集群资源的状态
    • 查看故障转移历史记录
  2. SQL Server Management Studio (SSMS)

    • 查看 SQL Server 实例的状态
    • 查看数据库的状态
    • 查看 SQL Server 错误日志
  3. 动态管理视图 (DMVs)

    sql
    -- 查看 SQL Server 实例状态
    SELECT 
        SERVERPROPERTY('ServerName') AS server_name,
        SERVERPROPERTY('InstanceName') AS instance_name,
        SERVERPROPERTY('IsClustered') AS is_clustered,
        SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS physical_server_name,
        status_desc AS sql_server_status
    FROM sys.dm_server_services;
    
    -- 查看数据库状态
    SELECT 
        name AS database_name,
        state_desc AS database_state,
        recovery_model_desc,
        log_reuse_wait_desc
    FROM sys.databases;
    
    -- 查看集群节点信息
    SELECT 
        node_name,
        status_description,
        is_current_owner
    FROM sys.dm_os_cluster_nodes;
  4. Performance Monitor

    • 监控集群节点的资源使用率
    • 监控 SQL Server 性能指标
    • 配置告警
  5. Windows 事件日志

    • 查看集群相关事件
    • 查看 SQL Server 相关事件
    • 查看系统事件

故障切换操作

自动故障切换

当活动节点发生故障时,WSFC 会自动执行故障切换,将 SQL Server 实例从活动节点转移到被动节点。自动故障切换的过程如下:

  1. WSFC 检测到活动节点故障
  2. WSFC 释放活动节点上的集群资源
  3. WSFC 在被动节点上分配集群资源
  4. WSFC 启动被动节点上的 SQL Server 服务
  5. SQL Server 实例在被动节点上恢复数据库
  6. 客户端重新连接到 SQL Server 实例

手动故障切换

在某些情况下,可能需要执行手动故障切换,如:

  • 活动节点需要维护或升级
  • 自动故障切换失败
  • 测试故障切换机制

手动故障切换可以通过以下方式执行:

  1. 使用故障转移集群管理器

    • 打开故障转移集群管理器
    • 展开集群名称,选择「角色」
    • 右键点击 SQL Server 实例角色,选择「移动」→「选择节点」
    • 选择目标节点,点击「确定」
    • 等待故障切换完成
  2. 使用 PowerShell

    powershell
    # 获取 SQL Server 实例角色名称
    $roleName = Get-ClusterGroup | Where-Object {$_.Name -like "SQL Server*"} | Select-Object -ExpandProperty Name
    
    # 执行手动故障切换
    Move-ClusterGroup -Name $roleName -Node "TargetNodeName"
  3. 使用 T-SQL

    sql
    -- 查看当前节点
    SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS CurrentNode;
    
    -- 手动故障切换需要通过集群管理工具执行,T-SQL 无法直接执行故障切换

故障切换注意事项

  1. 共享存储

    • 确保共享存储在故障切换前后都能被访问
    • 监控共享存储的状态和性能
    • 定期备份共享存储上的数据
  2. 客户端连接

    • 使用虚拟网络名称 (VNN) 连接 SQL Server 实例,确保故障切换后客户端能够自动重新连接
    • 配置合适的连接超时时间和重试机制
  3. 应用程序兼容性

    • 确保应用程序能够处理数据库连接中断和重新连接
    • 测试应用程序在故障切换后的行为
  4. 故障切换时间

    • 故障切换时间取决于多个因素,如节点数量、数据库大小、系统负载等
    • 通常情况下,故障切换时间在几秒到几分钟之间
    • 可以通过优化 SQL Server 配置和集群配置减少故障切换时间

故障恢复与修复

节点故障恢复

当活动节点发生故障并完成故障切换后,需要恢复原活动节点并将其重新加入集群:

  1. 修复原活动节点

    • 修复硬件故障
    • 重建操作系统
    • 重新安装 SQL Server
    • 恢复数据库(如果需要)
  2. 将原活动节点重新加入集群

    • 启动原活动节点
    • 验证原活动节点的网络连接
    • 验证原活动节点能够访问共享存储
    • 将原活动节点重新加入集群
    powershell
    # 将节点重新加入集群
    Add-ClusterNode -Name "FailedNodeName" -NoStorage
  3. 验证集群状态

    • 查看集群的状态和健康情况
    • 查看节点的状态
    • 查看集群资源的状态

SQL Server 服务故障恢复

当 SQL Server 服务发生故障时,WSFC 会尝试重启服务。如果重启失败,WSFC 会将 SQL Server 实例故障切换到其他节点。恢复 SQL Server 服务的步骤包括:

  1. 查看错误日志

    • 查看 SQL Server 错误日志,分析服务故障的原因
    • 查看 Windows 事件日志,了解系统级别的错误
  2. 修复故障原因

    • 根据错误日志的信息,修复导致服务故障的问题
    • 可能的原因包括:内存不足、磁盘空间不足、配置错误、硬件故障等
  3. 重启 SQL Server 服务

    • 使用 SQL Server 配置管理器重启服务
    • 使用 PowerShell 重启服务
    • 使用故障转移集群管理器重启服务
    powershell
    # 重启 SQL Server 服务
    Restart-Service -Name "MSSQLSERVER" -Force
  4. 验证服务状态

    • 确认 SQL Server 服务正常运行
    • 确认数据库能够正常访问
    • 确认应用程序能够正常连接数据库

集群资源故障恢复

当集群资源发生故障时,需要根据资源类型采取不同的恢复措施:

  1. 共享存储故障

    • 检查存储设备的状态
    • 检查存储网络的状态
    • 检查存储 LUN 的状态
    • 联系存储管理员修复存储故障
  2. 集群网络故障

    • 检查网络设备的状态
    • 检查网络连接
    • 检查网络配置
    • 联系网络管理员修复网络故障
  3. 集群资源依赖关系故障

    • 检查集群资源的依赖关系
    • 修复依赖关系配置
    • 重启相关资源
    powershell
    # 查看集群资源依赖关系
    Get-ClusterResourceDependency -Name "SQL Server"
    
    # 设置集群资源依赖关系
    Set-ClusterResourceDependency -Name "SQL Server" -Dependency "[SQL Server Agent] [SQL Server Full-Text Search]"

故障处理最佳实践

事前准备

  1. 建立完善的监控体系

    • 监控集群的状态和健康情况
    • 监控节点的状态和资源使用率
    • 监控 SQL Server 实例的状态和性能
    • 监控数据库的状态和性能
    • 配置告警,及时通知 DBA
  2. 制定详细的故障处理流程

    • 明确故障检测、诊断和处理的步骤
    • 明确各角色的职责和权限
    • 制定故障切换的决策标准
    • 制定回滚计划
  3. 定期测试故障切换

    • 定期执行手动故障切换测试,验证故障切换机制的有效性
    • 测试不同场景下的故障切换,如节点故障、SQL Server 服务故障等
    • 记录测试结果,优化故障处理流程
  4. 备份和恢复策略

    • 定期备份数据库
    • 测试备份的可恢复性
    • 制定详细的恢复计划

事中处理

  1. 快速定位故障

    • 使用监控工具快速定位故障点
    • 分析故障原因,确定故障类型
    • 评估故障对业务的影响
  2. 执行故障切换

    • 如果是节点故障,等待自动故障切换或执行手动故障切换
    • 如果是 SQL Server 服务故障,等待 WSFC 重启服务或手动重启服务
    • 如果是集群资源故障,修复资源故障或执行故障切换
  3. 验证故障切换结果

    • 确认 SQL Server 实例在新节点上正常运行
    • 确认数据库能够正常访问
    • 确认应用程序能够正常连接数据库
  4. 通知相关人员

    • 及时通知业务部门和管理层
    • 提供故障处理的进展情况
    • 预计恢复时间

事后总结

  1. 故障分析

    • 分析故障的根本原因
    • 评估故障处理的效果
    • 总结经验教训
  2. 优化改进

    • 优化集群配置,提高故障检测的敏感度
    • 优化 SQL Server 配置,提高服务的稳定性
    • 优化故障处理流程,减少故障处理时间
    • 增强监控体系,提高故障检测的及时性
  3. 文档更新

    • 更新故障处理文档
    • 记录故障处理的详细过程
    • 记录故障处理的经验教训

版本差异

SQL Server 2012

  • 支持 Windows Server 2008 R2 和 Windows Server 2012 集群
  • 支持最多 16 个节点的集群
  • 支持 AlwaysOn Availability Groups 与 FCI 结合使用

SQL Server 2014

  • 支持 Windows Server 2012 R2 集群
  • 改进了 FCI 的性能和可扩展性
  • 支持 Azure VM 上的 FCI 部署

SQL Server 2016

  • 支持 Windows Server 2016 集群
  • 引入了 Stretch Database 功能,与 FCI 结合使用
  • 改进了集群资源的监控和管理

SQL Server 2017+

  • 支持 Linux 环境下的 FCI 部署(基于 Pacemaker)
  • 支持 Windows Server 2019 集群
  • 增强了与 Azure SQL Database 的集成

SQL Server 2022

  • 支持 Windows Server 2022 集群
  • 进一步优化了 FCI 的性能和可靠性
  • 引入了加速数据库恢复 (ADR) 功能,提高故障恢复速度

常见问题 (FAQ)

Q: FCI 支持哪些类型的故障切换?

A: FCI 支持两种类型的故障切换:

  1. 自动故障切换:当活动节点发生故障时,WSFC 自动将 SQL Server 实例转移到被动节点
  2. 手动故障切换:DBA 手动将 SQL Server 实例从活动节点转移到被动节点,用于维护或测试

Q: 如何减少 FCI 的故障切换时间?

A: 可以通过以下方式减少故障切换时间:

  1. 优化 SQL Server 配置,减少数据库恢复时间
  2. 优化集群配置,提高故障检测的敏感度
  3. 确保共享存储性能良好,减少资源分配时间
  4. 减少数据库的大小,加快数据库恢复速度
  5. 使用加速数据库恢复 (ADR) 功能(SQL Server 2019+)

Q: 如何处理 FCI 故障切换失败的情况?

A: 处理故障切换失败的步骤包括:

  1. 查看集群日志,分析故障切换失败的原因
  2. 检查节点的状态和健康情况
  3. 检查共享存储的状态
  4. 检查网络连接
  5. 尝试手动故障切换
  6. 如果手动故障切换也失败,考虑重启集群或重建集群

Q: FCI 故障切换会影响客户端连接吗?

A: 故障切换期间,客户端连接会暂时中断,但如果使用虚拟网络名称 (VNN) 连接 SQL Server 实例,客户端会自动重新连接到新节点上的 SQL Server 实例。为了减少故障切换对客户端的影响,建议:

  1. 使用虚拟网络名称 (VNN) 连接 SQL Server 实例
  2. 配置合适的连接超时时间和重试机制
  3. 优化应用程序代码,处理连接中断情况

Q: 如何监控 FCI 的故障切换历史?

A: 可以通过以下方式监控故障切换历史:

  1. 查看故障转移集群管理器中的「故障转移历史记录」
  2. 查看 Windows 事件日志中的集群相关事件
  3. 查看 SQL Server 错误日志中的故障切换记录
  4. 使用 PowerShell 查看故障切换历史

实际生产运维场景

活动节点硬件故障

场景:生产环境中,FCI 的活动节点发生硬件故障,无法正常运行。

处理步骤:

  1. 确认活动节点硬件故障,无法恢复
  2. 等待 WSFC 自动执行故障切换,将 SQL Server 实例转移到被动节点
  3. 验证 SQL Server 实例在被动节点上正常运行
  4. 确认数据库能够正常访问
  5. 通知业务部门,恢复业务服务
  6. 修复或更换故障的活动节点
  7. 将修复后的节点重新加入集群,作为被动节点

SQL Server 服务崩溃

场景:生产环境中,FCI 的活动节点上的 SQL Server 服务意外崩溃。

处理步骤:

  1. WSFC 检测到 SQL Server 服务崩溃,尝试重启服务
  2. 如果重启失败,WSFC 将 SQL Server 实例故障切换到被动节点
  3. 验证 SQL Server 实例在被动节点上正常运行
  4. 查看 SQL Server 错误日志,分析服务崩溃的原因
  5. 修复导致服务崩溃的问题
  6. 重启原活动节点上的 SQL Server 服务
  7. 验证原活动节点的状态,将其重新加入集群

共享存储故障

场景:生产环境中,FCI 的共享存储发生故障,导致 SQL Server 实例无法访问数据库文件。

处理步骤:

  1. WSFC 检测到共享存储故障,尝试重启存储资源
  2. 如果重启失败,WSFC 将 SQL Server 实例故障切换到其他节点
  3. 联系存储管理员修复共享存储故障
  4. 验证共享存储恢复正常后,将其重新加入集群
  5. 验证 SQL Server 实例能够正常访问数据库文件
  6. 分析共享存储故障的原因,采取措施防止类似故障再次发生

总结

FCI 是 SQL Server 提供的一种成熟的高可用解决方案,它通过 Windows Server Failover Cluster (WSFC) 实现自动故障检测和故障切换。在实际生产环境中,DBA 需要建立完善的监控体系,制定详细的故障处理流程,定期测试故障切换机制,以便在故障发生时能够快速检测、诊断和处理故障,确保业务连续性。同时,DBA 还需要不断总结经验教训,优化集群配置和故障处理流程,提高系统的可靠性和可用性。