数据库已提交的事务为何会丢失?从fsync到异步提交的持久性权衡
数据库教科书告诉开发者一个简单的承诺:事务一旦提交,数据就是持久的。ACID中的"D"代表Durability——持久性。但生产环境中的实际情况远比教科书复杂:同样配置了主从复制、同样使用了SSD存储、同样收到了COMMIT成功的返回码,断电重启后,有些数据确实完好无损,有些却凭空消失了。 ...
数据库教科书告诉开发者一个简单的承诺:事务一旦提交,数据就是持久的。ACID中的"D"代表Durability——持久性。但生产环境中的实际情况远比教科书复杂:同样配置了主从复制、同样使用了SSD存储、同样收到了COMMIT成功的返回码,断电重启后,有些数据确实完好无损,有些却凭空消失了。 ...
2016年,一个初创团队决定采用事件溯源架构来构建他们的电商系统。两年后,当被问及这个决策时,技术负责人的回答让人深思:“如果你问我是否后悔选择事件溯源,我的回答是:不后悔。但如果让我重新选择,我会先用CRUD。” ...
2017年8月,Stripe 发布了一篇博客文章,详细阐述了他们如何通过「日期滚动版本」策略,在六年时间里完成了近百次向后不兼容的升级,同时保持与每个版本的完全兼容。这篇名为《APIs as infrastructure: future-proofing Stripe with versioning》的文章,至今仍被视为 API 版本控制的标杆实践。 ...
2015年,一家电商平台在促销活动中遭遇了一场诡异的生产事故。订单服务正常运行,CPU占用率不到30%,内存却以每秒数百兆的速度增长,最终触发了OOM Killer。运维团队排查了三天,才在日志里发现一条不起眼的错误信息:MissingBackpressureException。 ...
2015年,Facebook的监控团队面临一个看似无解的问题:每秒产生700万个数据点,如果按照传统方式存储,仅内存就需要16TB。这个数字意味着任何规模的集群都无法在经济上承受。但他们最终找到了答案——通过一种称为Gorilla的压缩算法,将每个数据点从16字节压缩到平均1.37字节,压缩比达到12倍。 ...
医院值班系统中,两位医生同时尝试放弃自己的值班班次。每个医生在操作前都会检查:是否至少还有另一位医生在值班?检查结果都显示"是",于是两人都放心地提交了更新。最终结果:当晚没有任何医生值班。 ...
2025年11月,某电商平台在“双十一”与“黑色星期五”促销期间遭遇了一场灾难:API响应时间从200ms飙升到45秒,每小时的营收损失达到89万美元。事后复盘发现,罪魁祸首是一个配置错误的数据库连接池——最大连接数被设置为10,而数据库服务器完全可以处理500个并发连接。 ...