fsync defaults to on and is the most dangerous setting in postgresql.conf—set it wrong and you risk unrecoverable data corruption, not just bad plans.
fsync() 的使用存在误区,尤其在失败时重试可能导致数据丢失。PostgreSQL 社区发现,fsync() 失败后,脏页被标记为干净,重试返回成功但数据未写入磁盘。应用应在 fsync() 失败时崩溃重启,以确保数据安全。
2018年,PostgreSQL发现fsync()失败可能导致数据静默丢失,称为“fsyncgate”。该问题揭示了Linux内核与数据库在I/O错误处理上的矛盾,尤其在云存储环境中更为突出。PostgreSQL采取了PANIC策略应对fsync失败,但在云环境下可用性风险增加,需改进错误处理机制。
数据丢失主要表现为静默数据损坏,即数据在未被察觉的情况下发生变化。文章分析了数据持久化的语义、fsync()的使用、写缓存的风险及其对数据完整性的影响。强调在应用层、文件系统和存储设备等多个层次实施校验和策略,以确保数据的完整性和安全性。建议采取RAID、UPS和定期扫描等措施防止数据损坏。
Postgres通过fsync和fdatasync系统调用确保数据持久性,但这些调用会增加延迟。测试表明,单个事务通常至少进行一次fsync调用,实际每秒约598个事务,低于理想的1000个。这是由于查询处理、资源竞争和后台进程的影响。优化方法包括合并多个提交以减少IO次数。
在PostgreSQL中,fsync和synchronous_commit设置对性能和数据持久性至关重要。fsync确保事务确认前所有更改写入磁盘,禁用时可提升性能但增加风险。synchronous_commit确保事务在报告提交前写入WAL,禁用时可提高吞吐量但可能导致数据丢失。需根据应用需求权衡性能与安全。
写入文件时,数据可能暂时存储在内存中,导致断电时数据丢失。为减少风险,可使用无缓存写入或调用fsync/fdatasync确保数据写入存储设备。文件系统行为也会影响数据持久性。
本文比较了 Apache Kafka 和 Raft 协议的不同之处。Kafka 通过其复制协议来确保数据安全,不需要 fsyncs。它使用异步日志写入和恢复机制,提供强大的性能和额外的安全性。而 Raft 协议需要 fsyncs 来确保数据正确性,依赖于日志本身来保证协议的正确性。如果一个节点上的日志丢失数据,可能会危及整个集群的正确性。
「macOS 的 fsync 實作其實跟大家想像的完全不同 」
小数据测试, 以便对硬盘 fsync 的速度有一个大概的了解. 结果: rate latency 备注 4044/s 0.247ms Intel SATA SSD 19720/s 0.051ms Intel NVMe SSD 结论: SATA 盘的 QPS 是 4000, NVMe 的 QPS 是 20000. 如果要开发一个分布式 KV 数据库,...
完成下面两步后,将自动完成登录并继续当前操作。