2、数据库可靠性基础:ACID原则、数据持久化机制、事务日志与WAL、主从复制与故障转移
2.1 ACID原则:事务可靠性的四大基石
ACID是数据库事务正确执行的四个基本特性,是衡量数据库可靠性的核心标准。任何违反ACID原则的操作都可能导致数据不一致或丢失。
| 特性 | 全称 | 核心含义 | 违反后果 |
|---|---|---|---|
| A | 原子性 (Atomicity) | 事务要么全部执行成功,要么全部回滚,不存在中间状态 | 部分更新导致数据残缺 |
| C | 一致性 (Consistency) | 事务执行前后,数据库必须满足所有预定义的约束规则 | 数据违反业务逻辑约束 |
| I | 隔离性 (Isolation) | 并发执行的事务之间互不干扰,结果与串行执行一致 | 脏读、不可重复读、幻读 |
| D | 持久性 (Durability) | 已提交的事务结果必须永久保存,即使系统崩溃也不丢失 | 提交后数据因故障丢失 |
变更窗口关键提示: 在变更窗口期间,建议将事务隔离级别临时提升至 可重复读 (Repeatable Read) 或 可串行化 (Serializable),以规避DDL操作与DML操作之间的隔离性冲突。
2.2 数据持久化机制:从内存到磁盘的可靠落盘
数据持久化机制决定了数据库在系统崩溃后能否恢复已提交的事务。核心路径包括:
- Buffer Pool (缓冲池):数据库在内存中缓存数据页,减少磁盘I/O。
- Dirty Page (脏页):被修改但尚未写回磁盘的数据页。
- Checkpoint (检查点):将脏页强制刷盘,并记录日志序列号,缩短崩溃恢复时间。
- Doublewrite Buffer (双写缓冲):InnoDB特有机制,防止页写入一半时发生崩溃导致页损坏。
最佳实践: 在变更窗口前,手动执行
CHECKPOINT 或 FLUSH TABLES 命令,强制刷脏页,可显著降低窗口期间的I/O抖动风险。
2.3 事务日志与WAL (Write-Ahead Logging)
WAL是保证原子性和持久性的核心机制,其核心原则是:日志先于数据写入磁盘。
WAL工作流程
- 事务修改数据页时,先将修改记录写入 Redo Log (重做日志)。
- Redo Log 写入磁盘后,事务才能提交。
- 数据页的修改可以延迟写入磁盘(通过Buffer Pool异步刷脏)。
- 系统崩溃后,通过 Redo Log 重放未刷盘的事务,保证持久性。
- 通过 Undo Log (回滚日志) 回滚未提交的事务,保证原子性。
变更窗口风险: 如果 Redo Log 文件配置过小或日志组数量不足,在高并发变更期间可能导致日志切换频繁,引发 “Checkpoint too frequent” 告警,严重时阻塞写入。
2.4 主从复制与故障转移
主从复制是数据库高可用架构的基础,通过将主库的数据变更实时同步到从库,实现读写分离和故障转移。
复制模式对比
| 复制模式 | 同步方式 | 数据一致性 | 性能影响 | 适用场景 |
|---|---|---|---|---|
| 异步复制 | 主库提交后立即返回,不等待从库确认 | 最终一致,可能丢失数据 | 低 | 高并发、可容忍少量数据丢失 |
| 半同步复制 | 至少一个从库确认收到日志后,主库才提交 | 强一致(至少一个从库) | 中 | 金融、交易系统 |
| 全同步复制 | 所有从库确认后,主库才提交 | 强一致(所有节点) | 高 | 对一致性要求极高的场景 |
故障转移流程
- 故障检测:通过心跳或超时机制检测主库是否存活。
- 日志补齐:候选从库应用完所有未完成的relay log,确保数据最新。
- 角色切换:将从库提升为新主库,并修改VIP或DNS指向。
- 从库重连:其余从库重新指向新主库,开始新的复制链路。
变更窗口建议: 在执行DDL变更前,建议先检查主从复制延迟。若延迟超过阈值,应暂停变更,等待延迟恢复后再执行,避免因复制积压导致从库数据不一致。
2.5 可靠性配置清单(变更窗口检查项)
| 检查项 | 配置要求 | 验证命令 |
|---|---|---|
| Redo Log大小 | 建议 ≥ 4GB,日志组 ≥ 2 | SHOW VARIABLES LIKE 'innodb_log_file_size'; |
| 双写缓冲 | 必须开启 | SHOW VARIABLES LIKE 'innodb_doublewrite'; |
| 复制模式 | 生产环境建议半同步 | SHOW STATUS LIKE 'Rpl_semi_sync%'; |
| 检查点间隔 | 脏页比例 ≤ 75% | SHOW STATUS LIKE 'Innodb_buffer_pool_pages_dirty'; |
| 自动恢复 | 开启崩溃恢复自动重放 | SHOW VARIABLES LIKE 'innodb_force_recovery'; (应为0) |
变更窗口操作建议: 在变更开始前,执行
SHOW SLAVE STATUS\G 确认 Seconds_Behind_Master 为0;变更结束后,再次确认复制延迟恢复为0,方可视为变更成功。