在用于数据库的单个磁盘上禁用写入缓存的建议很常见,因为否则某些磁盘将确认尚未到达磁盘表面的写入。
这意味着某些磁盘在写入磁盘表面之前不会确认写入(更新:或者当被要求刷新缓存时它们会准确报告。我在哪里可以找到这样的磁盘,或者我在哪里可以找到权威信息在哪里可以找到这样的磁盘?
我正在设置一些可以从使用写入缓存中真正受益的数据库服务器,但是该应用程序对价格很敏感,我不希望为某些缓存 RAID 控制器增加磁盘子系统的成本,因为我没有足够的信息来知道我是否可以信任每个驱动器中的缓存。
在用于数据库的单个磁盘上禁用写入缓存的建议很常见,因为否则某些磁盘将确认尚未到达磁盘表面的写入。
这意味着某些磁盘在写入磁盘表面之前不会确认写入(更新:或者当被要求刷新缓存时它们会准确报告。我在哪里可以找到这样的磁盘,或者我在哪里可以找到权威信息在哪里可以找到这样的磁盘?
我正在设置一些可以从使用写入缓存中真正受益的数据库服务器,但是该应用程序对价格很敏感,我不希望为某些缓存 RAID 控制器增加磁盘子系统的成本,因为我没有足够的信息来知道我是否可以信任每个驱动器中的缓存。
一般来说,直接回答您的问题,我不知道任何主要品牌的 SATA 驱动器本身在启用写入缓存的情况下存在与正确操作相关的错误。也就是说,仅从驱动器的角度来看,驱动器从缓存的角度来看它应该做的事情。我还要注意,即使启用了写入缓存,从 SATA 电缆上的磁盘写入到物理更新的旋转介质的延迟仍然非常短(通常约为 50 到 100 毫秒)。这并不像脏缓存数据一次只会坐在那里几秒钟......驱动器不断尝试从缓存中获取脏数据尽快放到物理媒体上。这不仅仅是一个数据安全问题,而是一个准备好立即接受未来写入的问题(即:写入发布)。
启用缓存时出现的问题是通过 SATA 电缆对驱动器的写入顺序与对旋转介质的写入顺序不同。这永远不会导致问题,除非您在缓存的所有内容进入磁盘之前断电或系统崩溃。为什么?->
这里可能出现的问题与文件系统和/或数据库文件内容的事务稳健性与这些无序丢失的写入有关。实际上,那些可能丢失的乱序写入理论上可能会破坏事务逻辑的完整性,否则这些事务逻辑本来可以通过以非常特定的顺序发生的磁盘写入来保证。
现在,当然,文件系统、数据库、RAID 控制器等的设计者已经意识到(或者当然应该意识到)这种与写入缓存相关的现象。在大多数随机访问类型的 I/O 场景中,从性能的角度来看,写缓存是非常可取的。事实上,拥有可用的写入缓存是能够对更高级的本机命令队列 ( NCQ ) 产生任何真正好处的关键要素) 支持较新的 SATA 和最后几代 PATA 实现。因此,为了在这样的特定关键时刻保证物理介质的顺序,文件系统和/或应用程序等可以专门请求将写入缓存刷新到介质。在此同步请求完成时 - (可能)文件缓冲区、操作系统磁盘缓存、物理磁盘缓存等的所有待处理内容实际上都已在正确的关键操作中根据事务系统设计出现在媒体上。也就是说,如果程序员在顶部进行了正确的调用,并且这个软件和硬件层链的每个元素都正确地完成了他们的工作,那么这种情况就会正确发生。即:在驱动器、RAID 控制器、磁盘驱动程序、操作系统缓存、文件系统、数据库引擎等方面没有这方面的错误。这是很多软件都必须完全正确地工作。此外,在这方面验证正确性非常困难,因为在几乎任何情况下,通常写入顺序根本不重要……而且电源故障和崩溃场景是难以构建的测试。因此,最终在一个或多个不同层和/或该术语的含义中“关闭写入缓存”......具有“修复”某些类型问题的声誉。实际上,关闭 RAID 控制器或 OS 磁盘缓存或驱动器等的写入缓存行为是避免系统中的一个或多个错误......以及这种传说的来源。电源故障和碰撞场景是难以构建的测试。因此,最终在一个或多个不同层和/或该术语的含义中“关闭写入缓存”......具有“修复”某些类型问题的声誉。实际上,关闭 RAID 控制器或 OS 磁盘缓存或驱动器等的写入缓存行为是避免系统中的一个或多个错误......以及这种传说的来源。电源故障和碰撞场景是难以构建的测试。因此,最终在一个或多个不同层和/或该术语的含义中“关闭写入缓存”......具有“修复”某些类型问题的声誉。实际上,关闭 RAID 控制器或 OS 磁盘缓存或驱动器等的写入缓存行为是避免系统中的一个或多个错误......以及这种传说的来源。
无论如何,回到问题的核心:在 SATA 下,所有磁盘读/写命令和刷新缓存命令的具体处理由SATA 规范定义。此外,驱动器制造商应该为每个驱动器型号或驱动器系列提供详细的文档,描述它们的实施和对这些规则的遵守情况,例如希捷梭子鱼驱动器的示例。特别是,请参阅 SATA SET FEATURES的详细信息控制驱动器操作模式的命令,特别是选项 82h 可用于在驱动器级别禁用磁盘缓存,因为默认值肯定是在我知道的所有驱动器上启用写入缓存。如果您真的想禁用缓存,则必须在每次驱动器重置或启动时执行此命令,并且通常受操作系统磁盘驱动程序的控制。您可能可以鼓励您的操作系统驱动程序通过 IOCTL 和/或注册表设置类型的东西设置此模式,但这变化很大。
根据我的经验,电池支持的缓存磁盘控制器将禁用驱动器缓存。我不知道禁用磁盘缓存的方法。即使您可以禁用磁盘缓存,性能也会受到很大影响。
对于低成本的选择,您可以使用廉价的 UPS,它可以向您的系统发出信号以进行有序关机。
磁盘回写缓存的误解之一是它们只会在断电时丢失数据。情况并非总是如此,尤其是在 SATA 设备上。如果 SATA 设备出现错误(例如角落案例 FW 错误或控制器错误)并且它在外部重置或重置,则无法保证回写缓存中的数据在挂起后仍然可用。
这可能会导致设备出现暂时性错误、被重置、在丢失任何脏缓存时发生数据丢失,并且在驱动程序的块级别之上是静默的。
更糟糕的是,通过操作系统工具禁用驱动器缓存也会在设备重置时丢失,因此即使设备在一天开始时禁用了缓存,如果设备被重置,它将重新启用回写缓存。在另一次重置时,设备将丢失数据。
SCSI/SAS 驱动器和一些 SATA 驱动器能够保存回写配置文件的状态,以确保在重置期间不会丢失该属性——但实际上这很少使用。
将块层集成到上层的 RAID 控制器可以注意到驱动器重置并再次禁用回写缓存——但标准 sATA 和 SAS 控制器不会这样做。
此限制也适用于为性能和可靠性配置的其他 SET FEATURE 和类似参数。
我使用带有超级电容器而不是电池的 RAID 系统来维护缓存。电池磨损,必须被监控,必须更换并且在这些方面代表潜在的故障点。电容器在启动时充电,当 UPS 电源出现故障时刷新缓存,几乎永远持续,不需要监控等。但是,除非您在贫困线上开展业务(这些天并不少见),否则您应该拥有 UPS以及在发生故障时彻底关闭系统的软件 - 如果电源恢复正常,我通常会在关机前给它 5-15 分钟(取决于 UPS 负载以及可用的电池)。
在雷暴期间,您可能(或可能已经 - 电力系统正在变得更好)看到灯光闪烁,有时就在它们熄灭之前。这是一种称为重合器的装置。这是一个断路器,当跳闸时会尝试关闭打开的开关,以防过载是瞬态的,大多数情况下都是瞬态的。如果它在尝试三次后仍未保持关闭状态,则它会保持打开状态。那个可怜的家伙不得不冒着雨出去处理它。不要为他感到太难过,而你和我只做两倍,如果加班,那是危险的工作。
正如你所说,一个合适的电池支持的 RAID 控制器会很昂贵,但你可以在 eBay 上以 100 英镑(150 美元)的价格找到戴尔 Perc5/i 控制器,尤其是使用 RAID5,像 Perc5/i 这样的控制器的速度会让你大吃一惊。我有几台带有 Perc5/is 和六个磁盘 RAID5 阵列的服务器,它们是我见过的最快的磁盘之一。特别是对于数据库应用程序,快速磁盘将真正提高性能。
我会硬着头皮买一个 RAID 控制器。
JR
据我了解,fsync() 伪造是电池支持的 RAID 控制器的属性,而不是驱动器。RAID 控制器包含一个电池,该电池可以为其写入缓存供电,直到驱动器恢复供电并且写入可以安全地提交到磁盘。这允许控制器立即返回操作系统,因为它在一定程度上保证写入将写入磁盘。
应该注意的是,如果驱动器写回缓存已满,写入将阻塞,直到缓存被写回驱动器。这意味着缓存在持续写入下通常不那么有效。
您的应用程序需要多少 IOPS?您确定您受到驱动器写入缓存的限制,或者驱动器上的一小部分(与服务器的内存相比)会受益吗?