查看原文
其他

第11期吐槽:关闭FPW来提升性能,你想过后果吗! 本期彩蛋-老板提出变态的要求,你会答应吗?

digoal PostgreSQL码农集散地 2024-07-08

文中参考文档点击阅读原文打开, 同时推荐2个学习环境: 

1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像

2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库

3、PolarDB开源数据库内核、最佳实践等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

关注公众号, 持续发布PostgreSQL、PolarDB、DuckDB等相关文章. 


第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) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存