写缓存与断电保护
写缓存把待落盘的数据先暂存在控制器或盘上的易失内存里,主机写请求因此能立刻返回,控制器再合并、排序、批量下刷。代价是这份数据在掉电瞬间只存在于内存。断电保护就是补上这个缺口:用电池、超级电容或非易失缓存把缓存内容撑过一次掉电,使「回写」既快又不丢数据。
基本信息
| 缓存位置 | 操作系统页缓存 / 控制器缓存 / 盘内缓存 / 分布式存储缓存,四层各管一层 |
|---|---|
| 两种策略 | 回写(Write Back):先入缓存即返回;透写(Write Through):落盘后才返回 |
| 保护手段 | BBU 电池、超级电容 + 闪存、NVRAM / 日志盘(journal) |
| 保护窗口 | 只覆盖掉电瞬间的缓存内容,不覆盖误删除与逻辑损坏 |
| 监控对象 | 电池健康与充放电自检、电容容量衰减、缓存写盘完成率 |
| 降级行为 | 保护部件失效时多数阵列自动切透写,性能下降但数据不丢 |
典型使用场景
- 数据库与虚拟化这类小随机写密集负载,需要缓存合并写、压低写延迟时
- 评估采购或上线前,需要确认「回写能不能开」也就是有没有断电保护时
- 电池或电容报错后,判断当前阵列处于何种降级状态、性能为何突然下跌时
- 性能压测对比中,需要区分「有保护的开缓存」与「无保护的裸开缓存」两种口径时
- 做高可用方案时,判断存储缓存与数据库自身 WAL 是否重复承担了同一份持久化责任时
查当前缓存与保护状态
查当前缓存与保护状态
# 看块设备层报告的写缓存模式:write back 还是 write through
cat /sys/block/sda/queue/write_cache
blockdev --getwritecache /dev/sda
# 看盘自身是否启用写缓存(SATA/SAS 通用做法,具体参数以厂商文档为准)
hdparm -W /dev/sda
# RAID 卡侧查看控制器缓存、电池与自检状态
storcli /c0 show all | grep -Ei 'cache|bbu|battery'
perccli /c0 show all | grep -Ei 'cache|bbu'
# 核对阵列级策略与降级原因(各厂商字段名不同,以官方手册为准)
storcli /c0/v0 show all | grep -Ei 'write|cache'三种保护手段对照
| 手段 | 掉电后数据在哪 | 运维要点 |
|---|---|---|
| 电池备份(BBU) | 缓存内存仍供电,恢复后可继续下刷 | 电池有寿命,需监控健康与定期充放电自检 |
| 超级电容 + 闪存 | 掉电瞬间把缓存刷入非易失闪存 | 恢复上电需一段写回时间,期间缓存策略可能降级 |
| 非易失缓存 / 日志盘 | 写入即落在非易失介质上 | 容量有限,需关注日志盘自身故障与磨损 |
无断电保护的盘内或控制器写缓存等于把数据放在一张纸上:掉电即丢,且主机可能已收到「写成功」的应答,导致上层事务与文件系统状态不一致。生产环境要么不开裸回写,要么确保保护部件在监控之内。
保护部件失效后阵列通常自动切透写,业务会感到写延迟上升而不是数据出错;这类「性能变差」的告警往往是最容易被忽略的真实隐患,需要和电池告警一起看。