外观
SQLServer FCI 节点故障处理
FCI 故障概述
Failover Cluster Instance (FCI) 是 SQL Server 的一种高可用解决方案,它将 SQL Server 实例部署在 Windows Server Failover Cluster (WSFC) 上,实现自动故障检测和故障切换。在 FCI 环境中,当活动节点发生故障时,WSFC 会自动将 SQL Server 实例故障切换到被动节点,确保数据库服务的高可用性。
FCI 故障类型
节点故障:
- 活动节点硬件故障
- 活动节点操作系统崩溃
- 活动节点网络连接故障
- 活动节点电源故障
SQL Server 服务故障:
- SQL Server 服务意外停止
- SQL Server 服务崩溃
- SQL Server 服务无响应
集群资源故障:
- 共享存储故障
- 集群网络故障
- 集群资源依赖关系故障
- 集群资源配置错误
应用程序故障:
- 数据库连接故障
- 查询执行超时
- 死锁和阻塞
故障检测与监控
故障检测机制
FCI 的故障检测主要通过 Windows Server Failover Cluster (WSFC) 实现,包括以下机制:
心跳检测:
- 集群节点之间定期发送心跳消息(默认每1秒)
- 如果在指定时间内(默认5秒)没有收到心跳消息,则认为节点不可用
- 可以通过调整集群属性修改心跳检测参数
资源监控:
- WSFC 监控集群资源的状态,如 SQL Server 服务、共享存储、网络等
- 如果资源状态异常,WSFC 会尝试重启资源
- 如果重启失败,WSFC 会将资源故障切换到其他节点
健康检测:
- 监控节点的 CPU、内存、磁盘等资源使用率
- 监控 SQL Server 服务的健康状态
- 监控数据库的状态
故障监控工具
故障转移集群管理器:
- 查看集群的状态和健康情况
- 查看节点的状态
- 查看集群资源的状态
- 查看故障转移历史记录
SQL Server Management Studio (SSMS):
- 查看 SQL Server 实例的状态
- 查看数据库的状态
- 查看 SQL Server 错误日志
动态管理视图 (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;Performance Monitor:
- 监控集群节点的资源使用率
- 监控 SQL Server 性能指标
- 配置告警
Windows 事件日志:
- 查看集群相关事件
- 查看 SQL Server 相关事件
- 查看系统事件
故障切换操作
自动故障切换
当活动节点发生故障时,WSFC 会自动执行故障切换,将 SQL Server 实例从活动节点转移到被动节点。自动故障切换的过程如下:
- WSFC 检测到活动节点故障
- WSFC 释放活动节点上的集群资源
- WSFC 在被动节点上分配集群资源
- WSFC 启动被动节点上的 SQL Server 服务
- SQL Server 实例在被动节点上恢复数据库
- 客户端重新连接到 SQL Server 实例
手动故障切换
在某些情况下,可能需要执行手动故障切换,如:
- 活动节点需要维护或升级
- 自动故障切换失败
- 测试故障切换机制
手动故障切换可以通过以下方式执行:
使用故障转移集群管理器:
- 打开故障转移集群管理器
- 展开集群名称,选择「角色」
- 右键点击 SQL Server 实例角色,选择「移动」→「选择节点」
- 选择目标节点,点击「确定」
- 等待故障切换完成
使用 PowerShell:
powershell# 获取 SQL Server 实例角色名称 $roleName = Get-ClusterGroup | Where-Object {$_.Name -like "SQL Server*"} | Select-Object -ExpandProperty Name # 执行手动故障切换 Move-ClusterGroup -Name $roleName -Node "TargetNodeName"使用 T-SQL:
sql-- 查看当前节点 SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS CurrentNode; -- 手动故障切换需要通过集群管理工具执行,T-SQL 无法直接执行故障切换
故障切换注意事项
共享存储:
- 确保共享存储在故障切换前后都能被访问
- 监控共享存储的状态和性能
- 定期备份共享存储上的数据
客户端连接:
- 使用虚拟网络名称 (VNN) 连接 SQL Server 实例,确保故障切换后客户端能够自动重新连接
- 配置合适的连接超时时间和重试机制
应用程序兼容性:
- 确保应用程序能够处理数据库连接中断和重新连接
- 测试应用程序在故障切换后的行为
故障切换时间:
- 故障切换时间取决于多个因素,如节点数量、数据库大小、系统负载等
- 通常情况下,故障切换时间在几秒到几分钟之间
- 可以通过优化 SQL Server 配置和集群配置减少故障切换时间
故障恢复与修复
节点故障恢复
当活动节点发生故障并完成故障切换后,需要恢复原活动节点并将其重新加入集群:
修复原活动节点:
- 修复硬件故障
- 重建操作系统
- 重新安装 SQL Server
- 恢复数据库(如果需要)
将原活动节点重新加入集群:
- 启动原活动节点
- 验证原活动节点的网络连接
- 验证原活动节点能够访问共享存储
- 将原活动节点重新加入集群
powershell# 将节点重新加入集群 Add-ClusterNode -Name "FailedNodeName" -NoStorage验证集群状态:
- 查看集群的状态和健康情况
- 查看节点的状态
- 查看集群资源的状态
SQL Server 服务故障恢复
当 SQL Server 服务发生故障时,WSFC 会尝试重启服务。如果重启失败,WSFC 会将 SQL Server 实例故障切换到其他节点。恢复 SQL Server 服务的步骤包括:
查看错误日志:
- 查看 SQL Server 错误日志,分析服务故障的原因
- 查看 Windows 事件日志,了解系统级别的错误
修复故障原因:
- 根据错误日志的信息,修复导致服务故障的问题
- 可能的原因包括:内存不足、磁盘空间不足、配置错误、硬件故障等
重启 SQL Server 服务:
- 使用 SQL Server 配置管理器重启服务
- 使用 PowerShell 重启服务
- 使用故障转移集群管理器重启服务
powershell# 重启 SQL Server 服务 Restart-Service -Name "MSSQLSERVER" -Force验证服务状态:
- 确认 SQL Server 服务正常运行
- 确认数据库能够正常访问
- 确认应用程序能够正常连接数据库
集群资源故障恢复
当集群资源发生故障时,需要根据资源类型采取不同的恢复措施:
共享存储故障:
- 检查存储设备的状态
- 检查存储网络的状态
- 检查存储 LUN 的状态
- 联系存储管理员修复存储故障
集群网络故障:
- 检查网络设备的状态
- 检查网络连接
- 检查网络配置
- 联系网络管理员修复网络故障
集群资源依赖关系故障:
- 检查集群资源的依赖关系
- 修复依赖关系配置
- 重启相关资源
powershell# 查看集群资源依赖关系 Get-ClusterResourceDependency -Name "SQL Server" # 设置集群资源依赖关系 Set-ClusterResourceDependency -Name "SQL Server" -Dependency "[SQL Server Agent] [SQL Server Full-Text Search]"
故障处理最佳实践
事前准备
建立完善的监控体系:
- 监控集群的状态和健康情况
- 监控节点的状态和资源使用率
- 监控 SQL Server 实例的状态和性能
- 监控数据库的状态和性能
- 配置告警,及时通知 DBA
制定详细的故障处理流程:
- 明确故障检测、诊断和处理的步骤
- 明确各角色的职责和权限
- 制定故障切换的决策标准
- 制定回滚计划
定期测试故障切换:
- 定期执行手动故障切换测试,验证故障切换机制的有效性
- 测试不同场景下的故障切换,如节点故障、SQL Server 服务故障等
- 记录测试结果,优化故障处理流程
备份和恢复策略:
- 定期备份数据库
- 测试备份的可恢复性
- 制定详细的恢复计划
事中处理
快速定位故障:
- 使用监控工具快速定位故障点
- 分析故障原因,确定故障类型
- 评估故障对业务的影响
执行故障切换:
- 如果是节点故障,等待自动故障切换或执行手动故障切换
- 如果是 SQL Server 服务故障,等待 WSFC 重启服务或手动重启服务
- 如果是集群资源故障,修复资源故障或执行故障切换
验证故障切换结果:
- 确认 SQL Server 实例在新节点上正常运行
- 确认数据库能够正常访问
- 确认应用程序能够正常连接数据库
通知相关人员:
- 及时通知业务部门和管理层
- 提供故障处理的进展情况
- 预计恢复时间
事后总结
故障分析:
- 分析故障的根本原因
- 评估故障处理的效果
- 总结经验教训
优化改进:
- 优化集群配置,提高故障检测的敏感度
- 优化 SQL Server 配置,提高服务的稳定性
- 优化故障处理流程,减少故障处理时间
- 增强监控体系,提高故障检测的及时性
文档更新:
- 更新故障处理文档
- 记录故障处理的详细过程
- 记录故障处理的经验教训
版本差异
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 支持两种类型的故障切换:
- 自动故障切换:当活动节点发生故障时,WSFC 自动将 SQL Server 实例转移到被动节点
- 手动故障切换:DBA 手动将 SQL Server 实例从活动节点转移到被动节点,用于维护或测试
Q: 如何减少 FCI 的故障切换时间?
A: 可以通过以下方式减少故障切换时间:
- 优化 SQL Server 配置,减少数据库恢复时间
- 优化集群配置,提高故障检测的敏感度
- 确保共享存储性能良好,减少资源分配时间
- 减少数据库的大小,加快数据库恢复速度
- 使用加速数据库恢复 (ADR) 功能(SQL Server 2019+)
Q: 如何处理 FCI 故障切换失败的情况?
A: 处理故障切换失败的步骤包括:
- 查看集群日志,分析故障切换失败的原因
- 检查节点的状态和健康情况
- 检查共享存储的状态
- 检查网络连接
- 尝试手动故障切换
- 如果手动故障切换也失败,考虑重启集群或重建集群
Q: FCI 故障切换会影响客户端连接吗?
A: 故障切换期间,客户端连接会暂时中断,但如果使用虚拟网络名称 (VNN) 连接 SQL Server 实例,客户端会自动重新连接到新节点上的 SQL Server 实例。为了减少故障切换对客户端的影响,建议:
- 使用虚拟网络名称 (VNN) 连接 SQL Server 实例
- 配置合适的连接超时时间和重试机制
- 优化应用程序代码,处理连接中断情况
Q: 如何监控 FCI 的故障切换历史?
A: 可以通过以下方式监控故障切换历史:
- 查看故障转移集群管理器中的「故障转移历史记录」
- 查看 Windows 事件日志中的集群相关事件
- 查看 SQL Server 错误日志中的故障切换记录
- 使用 PowerShell 查看故障切换历史
实际生产运维场景
活动节点硬件故障
场景:生产环境中,FCI 的活动节点发生硬件故障,无法正常运行。
处理步骤:
- 确认活动节点硬件故障,无法恢复
- 等待 WSFC 自动执行故障切换,将 SQL Server 实例转移到被动节点
- 验证 SQL Server 实例在被动节点上正常运行
- 确认数据库能够正常访问
- 通知业务部门,恢复业务服务
- 修复或更换故障的活动节点
- 将修复后的节点重新加入集群,作为被动节点
SQL Server 服务崩溃
场景:生产环境中,FCI 的活动节点上的 SQL Server 服务意外崩溃。
处理步骤:
- WSFC 检测到 SQL Server 服务崩溃,尝试重启服务
- 如果重启失败,WSFC 将 SQL Server 实例故障切换到被动节点
- 验证 SQL Server 实例在被动节点上正常运行
- 查看 SQL Server 错误日志,分析服务崩溃的原因
- 修复导致服务崩溃的问题
- 重启原活动节点上的 SQL Server 服务
- 验证原活动节点的状态,将其重新加入集群
共享存储故障
场景:生产环境中,FCI 的共享存储发生故障,导致 SQL Server 实例无法访问数据库文件。
处理步骤:
- WSFC 检测到共享存储故障,尝试重启存储资源
- 如果重启失败,WSFC 将 SQL Server 实例故障切换到其他节点
- 联系存储管理员修复共享存储故障
- 验证共享存储恢复正常后,将其重新加入集群
- 验证 SQL Server 实例能够正常访问数据库文件
- 分析共享存储故障的原因,采取措施防止类似故障再次发生
总结
FCI 是 SQL Server 提供的一种成熟的高可用解决方案,它通过 Windows Server Failover Cluster (WSFC) 实现自动故障检测和故障切换。在实际生产环境中,DBA 需要建立完善的监控体系,制定详细的故障处理流程,定期测试故障切换机制,以便在故障发生时能够快速检测、诊断和处理故障,确保业务连续性。同时,DBA 还需要不断总结经验教训,优化集群配置和故障处理流程,提高系统的可靠性和可用性。
