Umbraco 13分布式缓存未更新致内容丢失问题排查求助
排查Umbraco 13.3.2 Azure负载均衡下内容丢失及锁相关错误
问题背景
在Azure环境部署Umbraco 13.3.2负载均衡集群,配置严格遵循官方负载均衡指南:
管理实例配置
MainDomLock = FileSystemMainDomLockLocalTempStorageLocation = EnvironmentTempLuceneDirectoryFactory = SyncedTempFileSystemDirectoryFactory
公共实例配置
MainDomLock = FileSystemMainDomLockLocalTempStorageLocation = EnvironmentTempLuceneDirectoryFactory = TempFileSystemDirectoryFactory
出现核心问题:内容突然消失、标签缺失、字段值清空,重启Azure App Service可临时恢复,但问题反复出现。日志关联错误包括:
Microsoft.Data.SqlClient.SqlException (0x80131904): Lock request time out period exceeded.
Umbraco.Cms.Core.DistributedLocking.Exceptions.DistributedWriteLockTimeoutException: Failed to acquire write lock for id: -331.
DISTRIBUTED CACHE IS NOT UPDATED
Microsoft.Data.SqlClient.SqlException (0x80131904): Transaction (Process ID 83) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.
System.InvalidOperationException: This SqlTransaction has completed; it is no longer usable.
排查方向及解决方案
1. 分布式锁与数据库死锁排查
- 调整数据库锁超时参数:Umbraco默认锁超时可能不匹配Azure SQL性能,在
appsettings.json中修改配置:"Umbraco": { "CMS": { "DistributedLocking": { "SqlServer": { "LockTimeout": 30000, // 调整为30秒,可根据实际情况增减 "RetryCount": 5 } } } } - 捕获并分析死锁日志:在Azure Portal开启数据库诊断设置,启用SQL死锁事件捕获,定位死锁关联的资源和进程:
- 检查是否有自定义代码频繁读写Umbraco核心表(如
umbracoNode、cmsPropertyData) - 避免在内容发布时段执行批量数据操作
- 检查是否有自定义代码频繁读写Umbraco核心表(如
2. 分布式缓存一致性验证
- 确认共享存储配置:
FileSystemMainDomLock必须指向所有实例可读写的同一Azure Blob容器,检查配置准确性:"Umbraco": { "CMS": { "Global": { "MainDomLock": "FileSystemMainDomLock", "FileSystemMainDomLock": { "ContainerName": "umbraco-maindom", "ConnectionString": "your-azure-blob-connection-string" } } } } - 启用缓存自动同步:在管理实例配置中开启定时缓存同步,避免公共实例缓存过期不一致:
"Umbraco": { "CMS": { "Runtime": { "Caching": { "DistributedCache": { "Enabled": true, "SyncInterval": 60 // 每60秒同步一次缓存 } } } } }
3. 实例角色分离检查
- 强制公共实例只读:公共实例必须设置为只读模式,禁止执行内容编辑、发布操作,检查
appsettings.json:"Umbraco": { "CMS": { "Hosting": { "Slots": { "ReadOnly": true // 公共实例必须开启此配置 } } } } - 验证Lucene索引同步:管理实例的
SyncedTempFileSystemDirectoryFactory需确保索引文件同步至所有公共实例,检查Azure Blob中lucene-indexes容器的访问权限及文件同步状态。
4. 版本补丁升级
- 升级至13.x最新LTS补丁:Umbraco 13.3.2可能存在分布式锁或缓存同步的已知Bug,升级至同系列最新补丁版本(如13.4.x),官方可能已修复类似问题。
5. Azure资源优化
- 升级应用服务计划层级:若使用共享/基础层计划,资源瓶颈可能导致锁超时,升级至标准层及以上,确保实例有足够CPU、内存资源。
- 调整自动缩放策略:避免快速扩容导致多实例同时竞争锁资源,设置至少5分钟的缩放冷却时间。
临时应急方案
问题紧急时可快速恢复:
- 暂停公共实例的流量路由
- 重启管理实例,等待缓存同步完成
- 逐步恢复公共实例流量
内容的提问来源于stack exchange,提问作者Ben D
相关产品推荐
相关产品推荐

