4. Backup Hook 概述
Backup Hook 是灾备系统中用于在备份流程的关键节点插入自定义逻辑的机制。它允许运维人员在镜像创建前后执行脚本或命令,从而保证数据一致性、应用状态正确性以及备份的可恢复性。在生产窗口内进行备份时,Hook 是实现“应用感知”备份的核心手段。
4.1 Hook 的定义
Backup Hook 本质上是一个事件驱动的回调函数。当备份流程执行到特定阶段时,灾备代理会触发预定义的 Hook 脚本。这些脚本通常由用户编写,用于执行诸如:
- 冻结应用:将数据库置于只读模式或静默状态(如 Oracle ALTER SYSTEM QUIESCE)。
- 刷新缓存:将内存中的脏数据写入磁盘(如 sync 命令)。
- 创建快照:协调存储层与应用层的一致性。
- 记录日志:标记备份开始/结束时间点,用于后续回滚验证。
关键概念:Hook 脚本的返回值(exit code)直接影响备份流程的走向。返回 0 表示成功,流程继续;返回非 0 表示失败,流程将进入回滚或终止逻辑。
4.2 Pre-Hook 与 Post-Hook
根据触发时机,Backup Hook 分为两类:Pre-Hook(备份前执行)和 Post-Hook(备份后执行)。下表列出了两者的核心差异:
| 特性 | Pre-Hook | Post-Hook |
|---|---|---|
| 触发时机 | 镜像创建开始之前 | 镜像创建完成之后 |
| 主要目标 | 准备应用一致性环境 | 恢复应用正常运行状态 |
| 典型操作 | 冻结文件系统、静默数据库、暂停服务 | 解冻文件系统、恢复数据库写操作、启动服务 |
| 失败影响 | 备份流程中止,不创建镜像 | 镜像已存在,但应用可能处于异常状态 |
| 超时处理 | 超时则标记 Hook 失败,进入回滚 | 超时则标记警告,但镜像保留 |
生产窗口注意事项:Pre-Hook 的执行时间必须严格控制。如果冻结操作耗时过长,会导致应用停机窗口超出预期。建议在 Pre-Hook 中设置合理的超时阈值(如 30 秒),并配合回滚机制使用。
4.3 Hook 在灾备流程中的位置
在完整的灾备镜像加速流程中,Hook 位于应用层与存储层之间,起到“桥梁”作用。下面的 SVG 图展示了 Hook 在典型备份流程中的位置:
4.4 Hook 脚本执行模型
为了在生产窗口内实现可靠的备份与回滚,Hook 脚本通常遵循以下执行模型:
- 注册:在灾备代理配置中声明 Hook 脚本路径、超时时间、执行用户。
- 触发:备份流程到达 Hook 节点时,代理以子进程方式执行脚本。
- 监控:代理实时监控脚本输出(stdout/stderr)和退出码。
- 决策:根据退出码决定继续、重试或回滚。
最佳实践:在生产环境中,建议将 Hook 脚本设计为幂等的。即多次执行同一 Hook 脚本,结果一致。这可以避免因重试或回滚导致的副作用。
4.5 Hook 与回滚验证的关系
在“生产窗口内 Backup Hook 回滚验证”场景中,Hook 的可靠性直接决定了回滚的成功率。如果 Pre-Hook 未能正确冻结应用,镜像将处于不一致状态,后续回滚验证必然失败。因此,在课程后续章节中,我们将重点讨论:
- 如何编写健壮的 Pre-Hook 脚本,确保应用在冻结期间不产生脏数据。
- 如何设计 Post-Hook 的幂等恢复逻辑,避免重复解冻导致应用异常。
- 如何通过模拟 Pre-Hook 失败,验证回滚路径的完整性。