ZFS 在池设备上启用写高速缓存,并在系统断电时安全地处理高速缓存刷新。但是,当数据尚未提交到稳定的存储时,可能会发生开机重置的情况。
在没有单点故障的环境中,这种情况会被自动检测到,并由 ZFS 在下一次读取数据时更正。池的例程池清理可能会增加对任何丢失的写入的检测和修复。
在有单点故障的环境中,此问题可能会导致数据丢失。
在访问从群集配置导出的的 LUN 时,此问题还可能会发生得更加频繁。在群集故障转移期间,发生故障的机头缓存的数据可能会由于存活机头上的 SCSI 目标显式发送的开机重置事件而丢失。在这种情况下,即使是没有单点故障的池也可能会受影响。
此问题的症状为持久性校验和错误群集。可以使用 fmdump –eV 的输出来确定是否已将校验和错误诊断为持久性错误。fmdump –eV 输出中的 zio_txg 条目表示写入数据块的时间。请注意,持久性校验和错误的某个模式也可能是故障设备、软件或硬件的症状。
解决方法:对于依赖从具有单点故障的群集或系统导出的 LUN 的系统,可考虑禁用系统上设备的写高速缓存。
执行以下步骤可禁用写高速缓存并禁止 SCSI (sd) 或 FC (ssd) 设备的高速缓存刷新。
将 /kernel/drv/sd.conf 文件或 /kernel/drv/ssd.conf 文件复制到 /etc/driver/drv 目录中(具体取决于您的存储设备)。
编辑 /etc/driver/drv/sd.conf 文件或 /etc/driver/drv/ssd.conf 文件以禁用写高速缓存并禁止高速缓存刷新。
添加行以将 VID、PID 或 SUN COMSTAR 值替换为 sd (7D) 手册页上描述的相应值。
SPARC 系统:
sd-config-list="SUN COMSTAR","disable-cache-suppress-flush"; disable-cache-suppress-flush=1,0x40010,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1;
x64 系统:
sd-config-list="SUN COMSTAR","disable-cache-suppress-flush"; disable-cache-suppress-flush=1,0x40008,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1;
重新引导系统并覆盖快速重新引导选项。
# reboot -p