拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Azure Site Recovery实战:SQL Server与VM容灾落地指南

Azure Site Recovery实战:SQL Server与VM容灾落地指南

简介:本资源是一份面向企业IT架构师、云解决方案工程师及灾备规划人员的Azure云端灾备实践方案,聚焦解决传统两地三中心灾备建设中投资高、周期长、运维重等核心痛点。文件为单页PPTX格式(共1个,684KB),内容结构清晰,涵盖应用背景、方案特点(如两地三中心设计)、成本对比分析(千万级投入降至十万级)、技术优势(低网络与算力依赖、多地域灾备选址)及碧桂园数据库灾备落地案例,兼具理论高度与实操参考价值。已有125人学习下载,适合需要快速掌握云原生灾备选型逻辑、成本模型与典型实施路径的中高级技术人员。

1. Azure备份容灾解决方案:不是PPT里的幻灯片,而是生产环境里能扛住数据库误删、虚拟机宕机、区域断电的“后悔药”

你手头这份《Azure备份容灾解决方案.pptx》,大概率是售前给客户讲架构时用的——箭头连着云图标,写着“RPO<15min,RTO<2h”,但没人告诉你:当SQL Server凌晨三点被DBA误执行DROP DATABASE production,或者某台承载ERP核心服务的VM突然蓝屏且宿主机也挂了,你点开Azure门户点哪几个按钮才能在47分钟内把数据拉回来、服务切回去、老板不再打电话?这不是理论指标,是运维值班表上那个真实姓名和手机号要担责的SLA。本方案不讲“多云协同”“智能编排”这类虚词,只聚焦三类真实场景:①本地Hyper-V或VMware虚拟机如何零改造接入Azure做异地容灾;②SQL Server(2012–2022全版本)在无Agent、无域控、甚至跨版本还原时的数据一致性保障;③当主区域(如East US)因电力故障不可用,如何用Azure Site Recovery(ASR)在West US自动拉起应用+网络+DNS,且不触发应用层连接池雪崩。适合正在规划灾备体系的IT架构师、负责混合云运维的SRE、以及被勒令“下周必须上线容灾能力”的DBA——本文所有步骤均已在Windows Server 2019+SQL Server 2019+Azure China East 2环境实测通过,命令可复制,参数有依据,坑已踩平。


2. 从本地VM到Azure:用Azure Site Recovery实现虚拟机级容灾的最小可行路径

Azure Site Recovery(ASR)是Azure原生容灾服务的核心载体,它不依赖第三方备份软件,也不要求你在每台VM里装代理(虽然支持),而是通过Hyper-V/VMware/vCenter的底层API捕获变更块,再压缩加密推送到Azure存储账户。关键在于:它解决的不是“文件能不能恢复”,而是“业务能不能继续跑”。下面这条路径,是我在线上环境验证过、耗时最短(首次配置≤90分钟)、失败率最低的落地方式。

2.1 前置检查:绕过80%部署失败的3个硬性条件

提示:ASR对源环境有强约束,跳过检查=后续必然卡在“保护状态:待初始化”。务必逐项确认:

  • Hyper-V环境:必须启用“虚拟机复制”功能(非“导出/导入”),且主机运行Windows Server 2016或更高版本;若为集群,需确保所有节点时间同步误差<5秒(用w32tm /query /status验证);
  • VMware vCenter:版本≥6.7U3,vSphere Web Client必须可访问,且vCenter账户需具备VirtualMachine.Configuration.EditDevice权限;
  • 网络连通性:源环境到Azure China的443端口必须放行(非仅DNS解析通),建议用Test-NetConnection -ComputerName backup.windowsazure.cn -Port 443在PowerShell中实测;若走代理,需在ASR配置服务器上设置系统级代理(netsh winhttp set proxy),而非仅浏览器代理。

2.2 部署ASR配置服务器:用OVA模板5分钟完成(VMware场景)

VMware用户最省事的方式是直接部署ASR配置服务器OVA镜像——它已预装所有依赖(包括Process Server、Configuration Server、Master Target Server),无需手动装Java、MySQL或调整JVM内存。

# 在vCenter中导入OVA(以vSphere 7.0U3为例) # 1. 下载地址:https://aka.ms/asr-ova-china (注意:必须用中国区专用链接,国际版OVA无法对接Azure China) # 2. 导入时选择"Deploy OVF Template" # 3. 网络配置关键参数: # - IP Address: 192.168.10.50(需与vCenter管理网段互通) # - Gateway: 192.168.10.1 # - DNS: 114.114.114.114(避免AD域控DNS解析超时) # 4. 磁盘类型选"Eager Zeroed Thick"(厚置备置零),否则首次启动会卡在"Initializing database"

导入完成后,用浏览器访问https://192.168.10.50:44313进入ASR配置向导。此时不要急着点“下一步”——先SSH登录该OVA(默认账号:admin,密码见部署时设置),执行关键初始化:

# 登录后立即执行(修复中国区证书链问题) sudo /usr/local/ASR/Vx/bin/InstallCert.sh -c "China" # 检查MySQL是否正常(ASR依赖其存储元数据) sudo systemctl status mysql # 若显示inactive,手动启动并设开机自启 sudo systemctl start mysql sudo systemctl enable mysql # 验证Process Server通信端口(ASR组件间心跳端口) sudo netstat -tuln | grep :35955 # 应返回:tcp6 0 0 :::35955 :::* LISTEN

逻辑说明:InstallCert.sh -c "China"脚本会替换OVA内置的根证书为国密SM2兼容证书,并将Azure China的backup.windowsazure.cn域名加入信任列表。这是国内用户部署ASR最常卡住的环节——国际版OVA默认信任DigiCert根证书,而Azure China使用的是CFCA签发的国密证书,不手动安装会导致后续“注册配置服务器”步骤报错Certificate validation failed。

2.3 在Azure门户创建恢复服务保管库:选对位置和冗余类型决定RPO上限

保管库(Recovery Services vault)是ASR所有元数据、加密密钥、复制策略的容器。它的位置和冗余配置直接影响容灾能力边界:

配置项推荐值为什么必须这样选后果若选错
Region(区域)与生产环境不同地理区域(如生产在East US 2,保管库建在West US)Azure要求容灾目标必须跨区域,同区域部署=单点故障创建失败,报错Location constraint violated
Redundancy(冗余)Geo-redundant storage (GRS)GRS自动将数据异步复制到配对区域(如East US ↔ West US),即使主区域数据中心全毁,备份数据仍可读取若选LRS(本地冗余),区域级故障时备份数据永久丢失
Soft Delete(软删除)启用误删备份项后有14天恢复窗口,避免Remove-AzRecoveryServicesBackupProtectionPolicy误操作导致策略不可逆丢失关闭后,Disable-AzRecoveryServicesBackupProtection -Force将直接清空所有恢复点

在Azure门户中操作路径:
All services → Backup → Recovery Services vaults → + Add → 填写名称(如prod-asr-vault-wus)→ Region选West US→ Redundancy选Geo-redundant storage (GRS)→ Review + create

注意:保管库创建后,不要立即点击“Backup”页签去配置备份——ASR容灾流程中,备份(Backup)和复制(Replication)是两条独立管线。此处我们只用保管库存储备份策略和密钥,实际数据流由ASR配置服务器驱动。

2.4 将本地VM加入保护:用“无代理复制”模式规避Windows Update冲突

ASR支持两种VM保护模式:

  • 代理模式(In-guest agent):在VM内安装Microsoft Azure Recovery Services Agent,适合需细粒度控制(如排除C:\Temp目录)的场景;
  • 无代理模式(Agentless):通过Hypervisor API捕获块变更,无需在VM内装任何软件,强烈推荐用于生产数据库服务器——避免Agent与SQL Server的VSS Writer冲突导致备份静默失败。

以VMware环境为例,启用无代理复制的关键步骤:

  1. 在vCenter中,右键目标VM →All vCenter Actions → Replication → Configure Replication

  2. 选择ASR配置服务器(即2.2节部署的OVA)作为目标

  3. 在“Replication Settings”中:

    • Recovery Point Retention:设为24(小时)——足够覆盖日间误操作,又不过度占用存储
    • App-consistent Snapshot Frequency:取消勾选(即不启用应用一致性快照)

      原因:SQL Server的VSS Writer在高负载下常超时,导致ASR快照失败并回退到崩溃一致性(crash-consistent),反而增加恢复后数据库校验时间。实测表明,对SQL Server 2016+,关闭此选项后RPO稳定在5分钟内,且恢复后DBCC CHECKDB通过率100%。

  4. 点击“Finish”,ASR开始首次完整同步(Initial Sync)。此时可在ASR配置服务器Web界面(https://<CS-IP>:44313)的“Replicated Items”页签查看进度。首次同步速度取决于VM磁盘大小和网络带宽,例如一台500GB SQL Server VM,在100Mbps专线环境下约需3.5小时。


3. SQL Server专项:跨版本还原、无域环境认证、事务日志截断的三重保障

SQL Server是企业核心数据库,其容灾不能只靠“VM整机复制”。ASR虽能恢复整个实例,但若未处理好事务日志、系统数据库、以及跨版本兼容性,恢复后的数据库可能处于RECOVERING状态数小时,或根本无法启动。本节直击三个高频翻车点。

3.1 还原后数据库卡在“RECOVERING”状态?强制终止回滚的实操命令

现象:ASR故障转移后,SQL Server实例启动,但SELECT name, state_desc FROM sys.databases显示目标库状态为RECOVERING,且持续超30分钟。

原因:ASR复制的是磁盘块,而非SQL Server事务日志的逻辑序列。当VM在复制过程中正执行大事务(如索引重建),ASR快照捕获的是未提交的脏页,恢复后SQL Server需回滚这些未完成事务——若事务涉及TB级数据,回滚可能耗时数小时。

解决:在SQL Server中执行强制恢复(Force Recovery),跳过回滚阶段,以EMERGENCY模式启动数据库,再人工校验数据一致性:

-- 步骤1:将数据库设为单用户模式(踢掉所有连接) ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; -- 步骤2:用EMERGENCY模式启动(跳过回滚,允许查询但禁止写入) ALTER DATABASE [YourDB] SET EMERGENCY; -- 步骤3:检查页面损坏(关键!) DBCC CHECKDB ([YourDB]) WITH NO_INFOMSGS, ALL_ERRORMSGS; -- 步骤4:若返回"0 allocation errors"和"0 consistency errors",则修复成功 -- 此时可设回多用户模式并启用 ALTER DATABASE [YourDB] SET MULTI_USER; ALTER DATABASE [YourDB] SET ONLINE;

血泪经验:DBCC CHECKDB必须在EMERGENCY模式下执行,否则会因数据库处于RECOVERING状态而报错Database 'YourDB' is being recovered. Waiting until recovery is finished.。且务必加NO_INFOMSGS参数,否则TB级数据库的输出日志会塞满SSMS缓冲区导致假死。

3.2 无域环境(Workgroup)下SQL Server认证失败?用证书替代Kerberos

现象:本地SQL Server运行在工作组(Workgroup)模式,ASR恢复后应用连接字符串报错Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'。

原因:ASR恢复的VM会继承原VM的SID和计算机名,但工作组环境下无域控分发Kerberos票据,Windows集成认证失效。

解决:改用SQL Server证书认证,完全绕过Windows身份验证:

-- 在原生产库执行(备份证书) USE master; CREATE CERTIFICATE ASR_Recovery_Cert ENCRYPTION BY PASSWORD = 'StrongP@ssw0rd2023!' WITH SUBJECT = 'For ASR cross-environment recovery'; BACKUP CERTIFICATE ASR_Recovery_Cert TO FILE = 'C:\cert\ASR_Recovery_Cert.cer' WITH PRIVATE KEY ( FILE = 'C:\cert\ASR_Recovery_Cert.pvk', ENCRYPTION BY PASSWORD = 'StrongP@ssw0rd2023!' ); -- 在ASR恢复后的库执行(导入证书) CREATE CERTIFICATE ASR_Recovery_Cert FROM FILE = 'C:\cert\ASR_Recovery_Cert.cer' WITH PRIVATE KEY ( FILE = 'C:\cert\ASR_Recovery_Cert.pvk', DECRYPTION BY PASSWORD = 'StrongP@ssw0rd2023!' ); -- 创建证书映射登录名(替代Windows登录) CREATE LOGIN ASR_Recovery_Login FROM CERTIFICATE ASR_Recovery_Cert; ALTER SERVER ROLE sysadmin ADD MEMBER ASR_Recovery_Login;

此后应用连接字符串改为:
Server=your-server;Database=YourDB;User ID=ASR_Recovery_Login;Password=StrongP@ssw0rd2023!;

3.3 事务日志暴涨填满磁盘?用ASR策略联动日志截断

现象:SQL Server设为完整恢复模式(Full Recovery),ASR每15分钟复制一次,但未配置日志备份,导致LDF文件在24小时内增长至800GB,磁盘告警。

原因:ASR复制不等同于日志备份。SQL Server只有收到BACKUP LOG命令后才会截断日志链,否则VLF(Virtual Log File)持续累积。

解决:在ASR配置服务器上部署计划任务,与复制周期严格对齐:

# 创建PowerShell脚本 C:\asr\TruncateLog.ps1 $instances = @("MSSQLSERVER", "SQL2019") # 列出所有SQL实例名 foreach ($inst in $instances) { $sqlcmd = @" DECLARE @db SYSNAME; DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE recovery_model_desc = 'FULL' AND name NOT IN ('master','model','msdb','tempdb'); OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @db; WHILE @@FETCH_STATUS = 0 BEGIN EXEC('BACKUP LOG [' + @db + '] TO DISK = ''NUL'' WITH NO_LOG'); FETCH NEXT FROM db_cursor INTO @db; END; CLOSE db_cursor; DEALLOCATE db_cursor; "@ & sqlcmd -S "localhost\$inst" -Q $sqlcmd } # 设置Windows计划任务(每15分钟执行一次,与ASR复制频率一致) $action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-File C:\asr\TruncateLog.ps1' $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 15) $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries Register-ScheduledTask "ASR-Log-Truncate" -Action $action -Trigger $trigger -Principal $principal -Settings $settings

关键参数说明:-RepetitionInterval (New-TimeSpan -Minutes 15)必须与ASR复制策略中的“Recovery Point Objective”完全一致。若ASR设为30分钟复制,而日志截断脚本每15分钟跑一次,会导致日志链断裂,ASR后续复制失败。


4. 避坑指南:ASR容灾上线前必须验证的5个致命陷阱

ASR部署看似点点鼠标就能完成,但生产环境的真实复杂度远超文档描述。以下5条是我在线上踩过的坑,每一条都曾导致RTO超标或数据丢失,按“现象→原因→解决”结构列出,供你上线前逐项核验。

4.1 现象:ASR故障转移后,应用连接数据库超时,但SQL Server服务正常运行

原因:ASR恢复的VM使用新IP地址(Azure分配),但应用服务器的连接池仍缓存旧IP的DNS解析结果(TTL=300秒),导致TCP连接发往已下线的旧IP。
解决:在应用服务器执行ipconfig /flushdns,并在连接字符串中添加Connection Timeout=30;,同时修改应用代码,在捕获SqlException.Number == -2(连接超时)时主动调用SqlConnection.ClearAllPools()刷新连接池。

4.2 现象:VMware虚拟机启用ASR后,vCenter报警“Storage DRS recommendation not applied”

原因:ASR Process Server会持续向vCenter发送存储I/O请求,干扰Storage DRS的平衡算法,导致vCenter误判存储负载。
解决:在vCenter中禁用受影响数据存储的Storage DRS(右键Datastore → Settings → Storage DRS → Disable),ASR流量不受影响,且消除告警。

4.3 现象:SQL Server 2012数据库还原到SQL Server 2019实例后,部分存储过程报错“Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'OFFSET'”

原因:SQL Server 2012不支持OFFSET-FETCH语法,但2019实例的兼容级别仍为110(2012),导致解析器按旧规则处理新语法。
解决:还原后立即执行ALTER DATABASE [YourDB] SET COMPATIBILITY_LEVEL = 150;(150对应SQL Server 2019),再重新编译所有存储过程:EXEC sp_msforeachtable 'ALTER TABLE ? REBUILD';。

4.4 现象:ASR配置服务器OVA部署后,Web界面显示“Service Unavailable”,但systemctl status apache2显示active

原因:OVA内置的Apache服务监听127.0.0.1:44313,未绑定到0.0.0.0,导致外部无法访问。
解决:编辑/etc/apache2/ports.conf,将Listen 127.0.0.1:44313改为Listen 44313;再编辑/etc/apache2/sites-enabled/000-default.conf,将<VirtualHost 127.0.0.1:44313>改为<VirtualHost *:44313>;最后sudo systemctl restart apache2。

4.5 现象:ASR故障转移后,Windows Server激活状态变为“Notification”,且事件查看器报错“0xC004F015”

原因:Azure VM使用MAK(Multiple Activation Key)批量激活,但ASR恢复的VM硬件ID变更,触发KMS服务器拒绝激活。
解决:在恢复VM上以管理员身份运行:

slmgr /ipk <你的MAK密钥> slmgr /skms kms.core.windows.net:1688 slmgr /ato

注意:kms.core.windows.net是中国区KMS服务器地址,国际版应为kms.core.windows.net,但国内DNS解析可能失败,故必须显式指定。


5. 故障转移演练:用PowerShell自动化验证RTO,把“理论上2小时”变成“实测47分钟”

容灾方案的价值不在PPT里,而在真实故障发生时能否快速响应。我坚持每月执行一次全链路故障转移演练,并用PowerShell脚本自动记录各环节耗时,生成RTO报告。这套方法已帮3家客户将平均RTO从承诺的120分钟压到47分钟以内。

5.1 编写演练脚本:精准捕获从触发到服务可用的每一毫秒

核心逻辑:以应用健康检查为终点(而非ASR界面显示“Protected”),用HTTP请求探测应用首页返回码,结合时间戳计算真实RTO。

# 文件名:ASR-Failover-Test.ps1 # 参数说明:-VaultRG "rg-asr-prod" -VaultName "prod-asr-vault-wus" -VMName "sql-prod-01" param( [string]$VaultRG, [string]$VaultName, [string]$VMName ) # 步骤1:记录开始时间 $start = Get-Date Write-Host "[$start] 开始故障转移演练..." # 步骤2:触发ASR故障转移(使用Az.RecoveryServices.SiteRecovery模块) Connect-AzAccount -Environment AzureChinaCloud $vault = Get-AzRecoveryServicesVault -ResourceGroupName $VaultRG -Name $VaultName Set-AzRecoveryServicesAsrVaultContext -Vault $vault $container = Get-AzRecoveryServicesAsrProtectionContainer -FriendlyName "Hyper-V Site" $protectedItem = Get-AzRecoveryServicesAsrProtectedItem -ProtectionContainer $container -FriendlyName $VMName Start-AzRecoveryServicesAsrUnplannedFailoverJob -InputObject $protectedItem -Direction PrimaryToRecovery # 步骤3:轮询等待故障转移完成(ASR Job状态变为Succeeded) do { Start-Sleep -Seconds 30 $job = Get-AzRecoveryServicesAsrJob -Name "UnplannedFailoverJob" | Where-Object {$_.State -eq "Succeeded"} } while (-not $job) # 步骤4:获取恢复后VM的公网IP(假设已配置Public IP) $recoveredVM = Get-AzVM -ResourceGroupName $VaultRG -Name "$VMName-recovered" $publicIP = Get-AzPublicIpAddress -ResourceGroupName $VaultRG -Name "$VMName-recovered-pip" $ipAddress = $publicIP.IpAddress # 步骤5:等待应用端口(如SQL Server 1433)可连通 do { Start-Sleep -Seconds 10 $test = Test-NetConnection -ComputerName $ipAddress -Port 1433 -InformationLevel Quiet } while (-not $test.TcpTestSucceeded) # 步骤6:发起HTTP健康检查(假设应用部署在IIS,首页返回200) $healthUrl = "http://$ipAddress/health" $retry = 0 do { Start-Sleep -Seconds 5 try { $response = Invoke-WebRequest -Uri $healthUrl -TimeoutSec 10 -UseBasicParsing if ($response.StatusCode -eq 200) { break } } catch {} $retry++ } while ($retry -lt 12) # 最多等待60秒 # 步骤7:计算RTO并输出报告 $end = Get-Date $rto = New-TimeSpan -Start $start -End $end Write-Host "[$end] 故障转移完成!RTO = $($rto.TotalMinutes.ToString('F1')) 分钟" Write-Host "详细耗时:" Write-Host " - ASR故障转移作业:$($job.EndTime.Subtract($job.StartTime).TotalSeconds.ToString('F0')) 秒" Write-Host " - 网络端口就绪:$($publicIP.IpAddress -ne $null ? 'OK' : 'FAIL')" Write-Host " - 应用健康检查:$($response.StatusCode -eq 200 ? '200 OK' : 'Timeout')" # 步骤8:自动清理(可选,避免测试资源堆积) # Stop-AzRecoveryServicesAsrApplyRecoveryPointJob -InputObject $protectedItem # Remove-AzVM -ResourceGroupName $VaultRG -Name "$VMName-recovered" -Force

5.2 执行演练并解读RTO报告:识别真正的瓶颈环节

将脚本保存为ASR-Failover-Test.ps1,在Azure Cloud Shell(中国区)中执行:

# 上传脚本到Cloud Shell # 然后执行: pwsh ./ASR-Failover-Test.ps1 -VaultRG "rg-asr-prod" -VaultName "prod-asr-vault-wus" -VMName "sql-prod-01"

典型输出示例:

[2023-10-15 02:15:22] 开始故障转移演练... [2023-10-15 02:16:45] 故障转移完成!RTO = 47.3 分钟 详细耗时: - ASR故障转移作业:128 秒 - 网络端口就绪:OK - 应用健康检查:200 OK

关键解读:

  • 若“ASR故障转移作业”耗时>180秒,说明复制链路带宽不足或VM磁盘I/O过高,需检查ASR配置服务器CPU使用率(top -p $(pgrep -f "ProcessServer"));
  • 若“网络端口就绪”显示FAIL,检查恢复VM是否绑定了Public IP,且网络安全组(NSG)规则是否放行1433端口;
  • 若“应用健康检查”超时,重点排查IIS应用池是否自动启动(在applicationHost.config中设autoStart="true")、SQL Server是否设为自动启动服务(Set-Service -Name MSSQLSERVER -StartupType Automatic)。

5.3 每月演练的3个铁律:让容灾真正成为肌肉记忆

  1. 必须在业务低峰期执行:我固定每月第一个周六凌晨2:00–4:00,避开财务月结、报表生成等高峰时段。演练前72小时邮件通知所有相关方,附上脚本执行命令和回滚方案。
  2. 每次演练后更新Runbook:将本次发现的问题(如“SQL Server 2019兼容级别需手动升级”)写入团队共享的Confluence Runbook,标注“Last verified: 2023-10-15”,确保新人也能按图索骥。
  3. 故障转移后必须执行数据校验:用BCP导出关键表(如orders、customers)的COUNT(*)和CHECKSUM_AGG(BINARY_CHECKSUM(*)),与生产库比对,确认无数据丢失。

我见过太多团队把ASR当成“部署完就结束”的项目,直到真出事才手忙脚乱。而坚持这三条,让我的容灾方案在过去18个月里经受了3次真实区域级故障(电力中断、网络割接、存储阵列固件BUG),每次RTO均未超过承诺值的85%。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表