可靠写入

来自 PostgreSQL wiki
跳转到导航跳转到搜索

数据库使用许多级别的读写缓存。有数据库自己的专用内存(shared_buffers)、操作系统缓存、可能还有磁盘控制器缓存(典型的 RAID 卡)以及每个硬盘上的缓存。PostgreSQL 预计这些缓存中的一部分能够有效地工作才能获得良好的性能。但数据库会定期发出同步写入请求:要求在数据库继续执行之前,必须将某些内容提交到磁盘。如果这些写入中的任何一个告诉数据库它们成功了,但数据实际上并不安全,如果服务器因任何原因崩溃,就会出现数据库损坏。软件错误、断电、UPS 故障、意外拔掉服务器电源,这些情况都会导致数据库损坏,如果您的系统存在不安全写入,则数据库将无法正常启动。

数据库硬件选择指南 (PDF, Bruce Momjian) 中有一张很好的图表,说明了所有这些缓存级别如何协同工作。

推荐使用 磁盘拔插测试 来测试服务器上所有缓存的可靠性。拔插测试失败总是准确的,但通过此类测试并不能保证不安全写入不可能发生。

参考资料

此页面列出了关于此主题的文章,其中包含有关如何设置可靠系统(在崩溃后不会出现此类问题)的理论和实践建议的混合。

  • 可靠性:来自官方文档。
  • 数据库硬件 (PDF):关于一般硬件选择的章节,介绍了写回与写穿缓存术语以及关于 SSD 写入问题的一些说明。(Greg Smith)
  • 服务器配置调优:列出了在设置 wal_sync_method 时需要注意的事项,以及有关可能使服务器不安全的设置更改的警告——fsync、full_page_writes 和 synchronous_commit(Greg Smith)
  • 调优 PostgreSQL WAL 同步:关于处理不安全写入的驱动程序以及这如何影响 PostgreSQL 写入的背景信息。(Greg Smith)

已知问题硬件

  • 第一代和第二代英特尔 SSD 驱动器(如英特尔 X25-E)会进行不安全写入,这种行为无法修复,除非对驱动器的速度和寿命造成严重影响。请参阅 SSD、XFS、LVM、fsync、写入缓存、屏障和丢失的事务 (Vadim Tkachenko) 以了解更多信息。据报道,他们的消费级驱动器(如 X-25-M G2) 更糟糕 (Evan Jones)。第三代英特尔 320 和 710 系列驱动器没有这些问题,它们增加了一个电容器,在断电时提供电池备份以刷新驱动器缓存。