文档目录

问题说明

本文用于排查Redis整体可用,但某个云账号或单个资源同步长期不执行、被跳过或日志提示锁获取超时的问题。该场景属于分布式锁竞争或遗留锁,不等同于Redis连接失败。

现象

  • 只有一个云账号或少量资源不同步,其他账号正常。
  • 手动同步接口返回成功,但目标服务没有进入实际同步流程。
  • 日志出现resource sync get lock timeout!、one resource in cloud sync get lock timeout!或Failed to acquire lock during resource sync。
  • Redis PING正常,登录和其他缓存功能无明显异常。
  • 相同账号被重复提交同步,或上一次同步进程异常退出后问题出现。

适用环境

  • 产品:ZCenter
  • 版本:5.1.0
  • 组件:VM、RDS、OSS、Container、Security资源同步及Redis/Redisson

可能原因

  • 同一账号正在执行同步,新的请求在1秒内未获取账号锁而退出。
  • 同一资源正在被其他同步线程处理,等待约120秒后仍未获得资源锁。
  • 持锁进程异常退出,锁仍处于固定租约期内。
  • 同步运行时间超过锁租约,出现锁过期后并发重入或重复创建。
  • 多实例使用相同Redis数据库,cloudEnvId + originalId相同的资源发生锁竞争。
  • 日志中的“lock timeout”表示获取锁返回false,不代表Redis网络超时。

排查步骤

锁键参考

  • 账号同步锁:account:sync:<serviceName>:<cloudAccountId>:。
  • 单资源锁:RSL:<cloudEnvId>:<originalId>。
  • VM、OSS、Container、Security账号锁租约通常最长约600秒;RDS账号锁最长约1800秒。
  • 单资源锁等待约120秒,固定租约约30秒。实际行为以目标版本和运行日志为准。

1. 停止重复提交并确认范围

  • 记录cloudAccountId、cloudEnvId、originalId、服务名、同步开始时间和所有相关实例。
  • 暂停重复点击同步,避免产生更多竞争。
  • 确认问题是账号级全部资源不执行,还是只有单个资源超时。

2. 确认Redis可用

redis-cli -h <redis-host> -p <redis-port> -n <db> --askpass PING
  • 预期结果:返回PONG。
  • 异常处理:Redis不可用时转到Redis连接故障KB,不要继续按孤儿锁处理。

3. 精确查找锁键和TTL

redis-cli -h <redis-host> -p <redis-port> -n <db> --askpass --scan --pattern 'account:sync:*:<cloudAccountId>:'
redis-cli -h <redis-host> -p <redis-port> -n <db> --askpass --scan --pattern 'RSL:<cloudEnvId>:*'
redis-cli -h <redis-host> -p <redis-port> -n <db> --askpass TYPE '<exact-key>'
redis-cli -h <redis-host> -p <redis-port> -n <db> --askpass PTTL '<exact-key>'
  • 预期结果:活动锁TTL持续减少,并能在服务日志中找到对应同步进度。
  • 判断:PTTL=-2表示键不存在;PTTL=-1表示无过期时间,对这些固定租约锁属于异常情况。
  • 注意:优先使用SCAN,不要在生产Redis执行KEYS *。

4. 关联所有服务实例日志

  • 搜索cloudAccountId、originalId、CloudAccountSyncHandler、resource sync get lock timeout和同步完成日志。
  • 如果TTL减少且日志持续推进,说明锁仍有活动持有者,应等待任务完成。
  • 如果持锁进程已退出且没有任何实例继续处理,等待固定租约自然到期后再测试。
  • 资源锁30秒过期不代表原处理线程已经结束,必须结合线程和日志判断。

5. 排除Redis连接异常和任务未触发

  • 如果多个账号同时失败并伴随Redisson连接异常,按Redis故障处理。
  • 如果没有消息消费日志,检查RabbitMQ和定时任务,不要把“请求未触发”误判为锁竞争。

处理方式

  1. 停止重复同步请求,等待正在运行的同步完成。
  2. 持锁进程已退出时,优先等待租约自然到期:资源锁至少观察30秒,普通账号锁最长约600秒,RDS账号锁最长约1800秒。
  3. 只有在证明没有活动持有者、租约未正常到期且获得运维审批后,才处理单个精确锁键。
  4. 禁止通配符删除、FLUSHDB或批量删除Redisson键。
  5. 锁持续重复创建时,检查重复定时任务、多实例重复触发和同步执行时间超过租约的问题。

验证方法

  • 触发一次受控的单账号同步,不以接口返回成功作为完成标准。
  • 确认目标服务收到CloudAccountSyncHandler消息并开始处理。
  • 观察账号锁创建、TTL减少并在完成后消失。
  • 日志不再出现新的锁获取超时,目标资源数据和同步状态更新。
  • 经过一个完整定时同步周期后,锁竞争不再复现。

风险与回滚

  • 删除活动锁会允许并发同步,可能造成资源状态覆盖、误删除或同步标记不一致。
  • 锁租约可能早于业务处理结束,不能仅凭锁消失判断任务已结束。
  • 如误删锁,应立即停止新的同步请求,保留日志并核对云侧与ZCenter资源状态。

补充信息

单个云账号或资源同步卡住并提示锁超时,如何排查? | 故障排查 · KB | ZStack 资源中心