问题说明
本文用于排查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和定时任务,不要把“请求未触发”误判为锁竞争。
处理方式
- 停止重复同步请求,等待正在运行的同步完成。
- 持锁进程已退出时,优先等待租约自然到期:资源锁至少观察30秒,普通账号锁最长约600秒,RDS账号锁最长约1800秒。
- 只有在证明没有活动持有者、租约未正常到期且获得运维审批后,才处理单个精确锁键。
- 禁止通配符删除、
FLUSHDB或批量删除Redisson键。 - 锁持续重复创建时,检查重复定时任务、多实例重复触发和同步执行时间超过租约的问题。
验证方法
- 触发一次受控的单账号同步,不以接口返回成功作为完成标准。
- 确认目标服务收到
CloudAccountSyncHandler消息并开始处理。 - 观察账号锁创建、TTL减少并在完成后消失。
- 日志不再出现新的锁获取超时,目标资源数据和同步状态更新。
- 经过一个完整定时同步周期后,锁竞争不再复现。
风险与回滚
- 删除活动锁会允许并发同步,可能造成资源状态覆盖、误删除或同步标记不一致。
- 锁租约可能早于业务处理结束,不能仅凭锁消失判断任务已结束。
- 如误删锁,应立即停止新的同步请求,保留日志并核对云侧与ZCenter资源状态。
补充信息
- Redis整体故障参见:ZCenter 登录或资源同步失败,如何确认并恢复 Redis?。
