重构条件模块代码 & 容器中 MongoDB 备份与恢复
重构条件模块
之前的条件模块(ConditionalModule)逻辑嵌套较深,不够清晰。参考 NestJS 官方 ScheduleModule 的写法,我们使用 static register() 静态方法重构:
import { DynamicModule, Module } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
@Module({})
export class ConditionalModule {
static register(configService: ConfigService): DynamicModule {
const imports: DynamicModule['imports'] = []
const providers: any[] = []
const exports: any[] = []
const logOn = configService.get<boolean>('LOG_ON')
const cronOn = configService.get<boolean>('CRON_ON')
if (logOn) {
// 注册日志相关 provider
}
if (cronOn) {
imports.push(ScheduleModule.forRoot())
providers.push(TasksService)
exports.push(TasksService)
}
return {
module: ConditionalModule,
imports,
providers,
exports,
}
}
}
typescript
重构后的优势:
- 逻辑扁平化:顺序执行条件判断,不再有嵌套函数
- 接口统一:与 NestJS 生态中的其他模块注册方式保持一致
- 维护性提升:新增条件只需追加
if块,不影响已有逻辑
定时任务的业务规划
定时任务需要完成两个核心操作:
- 备份数据:连接 MongoDB,导出
log集合的数据到文件 - 清理数据:删除已备份的数据和过期的备份数据
清理操作的具体目标:
- 删除当前
log集合中已备份的数据(避免重复备份导致集合持续膨胀) - 删除超过保留期限的备份集合(如超过 30 天的备份)
MongoDB 备份与恢复命令
MongoDB 官方提供了两个核心命令:
mongodump —— 数据备份
# 在 Docker 容器中执行备份
docker exec -it <container_name> mongodump \
--uri="mongodb://root:rootexample@localhost:27017/nest_logs?authSource=admin" \
--collection=log \
--out=/tmp/2024-01-01-log
bash
参数说明:
--uri:数据库连接字符串--collection:指定要备份的集合名称--out:备份文件的输出目录(容器内部路径)
验证备份结果
# 查看备份目录
docker exec -it <container_name> ls -la /tmp
# 查看备份内容
docker exec -it <container_name> ls -la /tmp/2024-01-01-log/nest_logs
bash
备份完成后,会在指定目录下生成以数据库名命名的子目录,其中包含 .bson 和 .json 格式的数据文件。
mongorestore —— 数据恢复
# 基本恢复(会覆盖同名集合)
docker exec -it <container_name> mongorestore \
--uri="mongodb://root:rootexample@localhost:27017/nest_logs?authSource=admin" \
--nsInclude="nest_logs.log" \
/tmp/2024-01-01-log
bash
重要提示:直接恢复到原集合会覆盖当前正在使用的日志数据。生产环境中应恢复到一个新的集合名称:
# 安全恢复:恢复到新的集合名称
docker exec -it <container_name> mongorestore \
--uri="mongodb://root:rootexample@localhost:27017/nest_logs?authSource=admin" \
--nsFrom="nest_logs.log" \
--nsTo="nest_logs.log-2024-01-01" \
/tmp/2024-01-01-log
bash
参数说明:
--nsFrom:源命名空间(数据库.集合)--nsTo:目标命名空间,如果集合不存在会自动创建
删除容器内文件
# 删除容器内的指定目录
docker exec -it <container_name> rm -rf /tmp/2024-01-01-log
# 验证删除结果
docker exec -it <container_name> ls -la /tmp
bash
集群备份注意事项
MongoDB 官方文档对于集群(Sharded Cluster)的备份有特别说明:
- 在备份前需要执行
db.fsyncLock()锁定集群 - 这是为了保证备份期间数据的一致性
- 对于单实例部署不需要此操作
- 如果涉及分布式数据库存储日志,建议直接使用专业的日志系统(如 ELK)
备份与恢复的完整流程
1. mongodump 导出 log 集合
├── 备份到 /tmp/<date>-log 目录
└── 生成 .bson + .json 数据文件
2. mongorestore 恢复到新集合
├── 使用 --nsFrom 和 --nsTo 指定目标集合
└── 集合命名规则:log-<date>
3. 清理操作
├── 删除原集合中已备份的数据
└── 删除超过保留期限的备份集合和文件
text
小结
- 条件模块重构为
static register()模式,逻辑更清晰,与 NestJS 生态风格统一 - MongoDB 的
mongodump和mongorestore是数据备份与恢复的核心工具 - 恢复数据时务必指定新的集合名称,避免覆盖正在使用的日志集合
- 容器内的文件操作使用
docker exec执行 Linux 命令 - 后续需要通过 SSH 连接远程服务器来执行这些操作,因此需要开发 SSH 模块
↑