mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-16 07:33:06 +08:00
fix(backup): 定时备份加 leader 锁,避免多实例重复备份
仓库里所有周期任务都用 tryAcquireSingletonLeaderLock 选主、只让一个实例跑 (ops:*、dashboard:aggregation、subscription:expiry、payment:order:expiry 等), 唯独定时备份 runScheduledBackup 没接这套锁,每个实例都自己跑一遍。 多实例部署下同一时刻: - 同一个库被 N 次 pg_dump; - 内存峰值 ×N —— 归档整个读进内存再上传,内存吃紧的节点会直接 OOM; - 上传的是同一个带时间戳的 key,N 份互相覆盖,白干一场连多余副本都留不下。 实测 3 节点:每天 backup_records 里三条一模一样的记录(同 key、同大小)。 改动:把 BackupService 接进和其它任务一样的 tryAcquireSingletonLeaderLock (key=backup:scheduled:leader)。只锁定时备份,手动备份(CreateBackup/ StartBackup)不锁;无协调后端(cache/db 均 nil)时不加锁照常跑,单机/单测 行为不变;锁 TTL 35m > 备份自身 30m context 上限,防止大库 dump 中途锁过期。 wire_gen.go 由 wire 重新生成。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
5935e674a8
commit
bba6a55e0f
@@ -208,7 +208,7 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
|
||||
dataManagementHandler := admin.NewDataManagementHandler(dataManagementService)
|
||||
backupObjectStoreFactory := repository.NewS3BackupStoreFactory()
|
||||
dbDumper := repository.NewPgDumper(configConfig)
|
||||
backupService := service.ProvideBackupService(settingRepository, configConfig, secretEncryptor, backupObjectStoreFactory, dbDumper)
|
||||
backupService := service.ProvideBackupService(settingRepository, configConfig, secretEncryptor, backupObjectStoreFactory, dbDumper, leaderLockCache, db)
|
||||
imageStorageFactory := repository.ProvideImageStorageFactory()
|
||||
imageStorageSettingService := service.ProvideImageStorageSettingService(settingRepository, secretEncryptor, backupService, imageStorageFactory, configConfig)
|
||||
backupHandler := admin.NewBackupHandler(backupService, userService, imageStorageSettingService)
|
||||
|
||||
Reference in New Issue
Block a user