第11期吐槽:关闭FPW来提升性能,你想过后果吗! 本期彩蛋-老板提出变态的要求,你会答应吗?
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
第11期吐槽:关闭FPW,你会很惨!
1、产品的问题点
在每一个检查点开始之后, 当PAGE第一次被修改时, 需要将整个PAGE写入WAL日志. 称之为full page write(fpw).
2、问题点背后涉及的技术原理
数据文件以block_size为单位组织存储, 为了防止数据文件出现block partial write, 例如一半页面是旧的内容, 一半页面是新的内容, 数据库设计了fpw的功能来恢复异常的数据block(例如数据库崩溃恢复, 或 使用在线备份的数据文件和归档日志将数据库恢复到任意时间点.).
3、这个问题将影响哪些行业以及业务场景
更新较为频繁、覆盖的更新数据分布散落在很广泛的PAGE内容的业务. 例如活跃用户较多的2C业务, 需要频繁更新用户状态信息、更新业务核心数据等. 包括金融业务, 电商, 短视频, 游戏, 出行等大家常用的业务.
4、会导致什么问题?
wal日志增多, 耗费更多的归档存储空间, 需要更多钱, 恢复时间也可能变长.
检查点期间的写、更新等操作性能急剧抖动.
5、业务上应该如何避免这个坑
可以拉长checkpoint时间周期, 使得在一天内产生的fpw更少. 但是无法避免完全不写入full page.
使用Copy on write的文件系统, 例如btrfs, zfs, 避免出现data block 出现prital write.
文件系统对齐IO, 同时块设备要支持大于或等于data block size的原子写, 从而可以安全的关闭fpw而不用担心prital write产生坏块. 某些ssd支持, 例如宝存.
6、业务上避免这个坑牺牲了什么, 会引入什么新的问题
拉长checkpoint周期实际上就是让周期内的WAL日志更多, 从而会导致数据库崩溃恢复的时间变长, 发生H A切换、standby重启后、或者发生oom原地恢复、等需要恢复的场景, 影响业务的时间变长.
使用copy on write的文件系统, 本质上是将问题转嫁给文件系统了. 并没有彻底解决问题.
文件系统对齐IO的较少, 特别是云盘的情况, 还需要同时支持大于或等于data block size的原子写, 管理成本增加(例如有些设备不匹配要求, 那就不能开, 使得HA、部署、扩容都需要考虑这些约束, 管理成本增加. ).
7、数据库未来产品迭代如何修复这个坑
数据库内核层支持: DIO, 并且硬件支持IO原子写对齐.
或者使用remote recovery技术(恢复时使用远程正常节点(如standby)的datablock代替当前节点的datablock来合并wal日志.). 例如polardb for pg开源版本. 关闭fpw后, 性能提升了30%. 参考文章: 《PolarDB 为什么要解决FPW的性能问题?》
本期彩蛋-老板提出变态的要求,你会答应吗?!
好变态哦, 居然有要求别人把自己搞破产的老板.
把老板搞破产的题目如下, 兄弟们冲啊:
到底是什么公司的老板这么变态? 原来是:
易景科技(杭州易景数通科技有限公司)是一家专注于数据库产品研发的高新技术企业。旗下拥有自主知识产权的羲和(Halo)数据库产品。羲和(Halo)数据库具有优秀的多数据库平台兼容能力和优异的处理性能。产品已在多家金融机构及大型企事业单位上线运行,均取得了不错的表现。
招聘岗位
数据库内核研发工程师
工作职责:
1、参与公司核心产品Halo数据库产品的研发;
2、负责核心产品的需求分析、模块设计;
3、负责核心产品的功能、性能优化;
4、负责核心产品的缺陷修复;
5、负责核心产品的文档撰写。
任职要求:
1、精通C语言;
2、熟悉数据库原理和技术;
3、熟悉常用的数据结构和算法;
4、熟悉Oracle/PostgreSQL/MySQL/SQL Server/DB2中的一种或几种数据库;
5、熟悉Linux操作系统、有Linux平台开发经验的优先;
6、了解文件系统、多线程、高并发、分布式系统等相关技术;
7、有PostgreSQL或MySQL内核开发经验优先;
8、良好的代码编写习惯和文档编写习惯;
9、责任心强,善于学习,具备良好的团队合作精神和承受压力的能力;
C/C++开发工程师
工作职责:
1、参与公司项目的需求分析、功能模块设计;
2、参与公司核心产品的研发工作;
3、完成任务的代码开发、测试,并按要求撰写相应的技术文档;
4、配合测试人员对进行产品进行调试及缺陷修复。
任职要求:
1、本科以上学历,计算机及相关专业毕业,1年及以上开发经验;
2、熟悉C/C++及常用标准库;
3、熟悉PostgreSQL/MySQL等数据库系统;
4、熟悉Linux操作系统、有Linux平台开发经验的优先;
5、了解文件系统、多线程、高并发、分布式系统等相关技术;
6、有良好的代码编写习惯和文档编写习惯;
7、责任心强,善于学习,具备良好的团队合作精神和承受压力的能力;
文章中的参考文档请点击阅读原文获得.
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: