问题描述
在磁盘中,通常内置缓存模块,用于提高磁盘性能。写入磁盘的数据,可能并没有直接写入磁盘,而是写入该缓存中,以提高性能。
但是在电源故障时,缓存数据将会丢失。如果该缓存中包含为写入文件系统的元数据,在意外断电后,可能会导致文件系统的损坏。
本文将介绍如何配置磁盘缓存,以防止出现在电源故障时出现数据损坏的问题。
影响数据访问的缓存
在计算机中,有以下几种类型的缓存。
操作系统缓存
在现代操作系统中,使用“页缓存”。数据将首先写入该缓存,然后定期写入底层内存系统(可能是RAID控制器,或者直接写入磁盘)。
使用free命令,可以查看页缓存的内存大小(查看“buff/cache”列)。
如果出现电源故障,在页缓存中的数据将会丢失。
控制器(RAID Controller)缓存
这里“控制器”指“RAID控制器”。控制器缓存同样用于提高性能,但是在电源故障时,依旧会导致缓存数据丢失。除非在控制器中具有BBU或ZMCP特性。
BBU(BARTTERY BACKUP UNIT,备用电池单元),用于保护控制器缓存。在电源故障时,电池会持续供电,大约72小时,以防止缓存数据丢失。如果服务器在这期间启动,便可恢复缓存数据。另外,由于电池寿命有限,要注意电池的更换。
ZMCP(ZERO MAINTENANCE CACHE PROTECTION,零维护缓存保护),也用于保护缓存。它会将缓存数据写入闪存,以保护缓存数据。
磁盘缓存
磁盘通常也内置缓存,但是该缓存没有任何保护(某些磁盘可能有保护)。在电源故障时,将会出现数据丢失的情况。
在电源故障时,由缓存数据丢失带来的风险
最坏的情况:控制器电源保护模块故障,在电源故障时,数据将会丢失。
另外,我们组建软件磁盘阵列,没有缓存保护模块,在电源故障时,数据将会丢失。对于我们来说,没有太多选择,只能禁用磁盘缓存,但是这会降低磁盘性能。
下面我们将讨论避免风险的方法。
降低由缓存丢失带来的风险
在使用RAID Controller缓存时
如果使用BBU进行缓存保护,要注意电池的寿命,根据官方建议及时更换电池。并且要留意电池供电时长,如果超过该时长,数据依旧会丢失。
如果使用ZMCP进行缓存保护,缓存会被“永久”存储,通常不需要过度担心。
在使用磁盘缓存时
如果使用磁盘缓存(像我们的软件磁盘阵列),只能禁用磁盘缓存(毕竟缓存没有任何保)。虽然会带来性能损失,但是为了数据安全,这是值得的。
关于磁盘缓存设置,这里不再展开,可以参考 磁盘缓存 相关的内容。
参考文献
RAID Controller and Hard Disk Cache Settings