PostgreSQL码农集散地

为什么不能无限增加只读实例?

文章开始前推荐2个学习环境: 

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能:《最好的PostgreSQL学习镜像》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库》

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

为什么不能无限增加只读实例?

https://www.bilibili.com/video/BV1mS4y1M7jc/

社区版本:

增加只读节点会产生什么消耗?
1、读取上游(通常是主节点)的WAL, 产生WAL的读取开销, 如果不是DIO, 还会写page cache(消耗内存)
2、产生网络开销
3、产生CPU开销

资源的有限性:

  • 存储的IOPS有限

  • 内存有限

  • 网络带宽有限

  • CPU资源有限

这就结束了吗? 所以PG有了级联复制:

  • 级联复制解决上游节点的单点压力问题.

但是这就完了吗? 如果你要无限制创建只读节点, 钱会是个大问题:

  • 每个只读实例需要至少与主节点相当的硬件资源配置

    • 如果只读实例的性能太弱, 会导致只读实例延迟很高, 甚至永远追不上主实例.

    • 存储空间必须大于等于主实例, 如果存储空间不够会导致打爆.

PolarDB:
PolarDB 计算存储分离架构版本.

  • 主实例与只读实例共享存储. 所以解决了大量创建只读实例引入的存储成本问题.

  • 主实例与只读实例之间只传输wal meta信息(header, pageid), 不含wal日志的payload内容(即数据部分), 网络传输量减少了98%.

    • Image

  • RO RW的计算资源可以灵活配置, 不强制要求RO 必须大于等于RW配置, 不会导致RO延迟.

由于RO的资源消耗更低, PolarDB可以创建更多RO节点.
同时RO RW共享一份存储, PolarDB相比社区版本成本更低.

本期问题1:
请问为什么PolarDB PG的RW节点不需要传输完整的WAL给RO节点?

  • a. PolarDB RW节点通过WAL归档文件共享给RO节点

  • b. PolarDB RO和RW节点共享一份存储, WAL可以被RO节点直接读取.

  • c. PolarDB RO节点recovery操作不需要用到完整的wal内容

  • d. PolarDB 不需要WAL日志

答案:

  • b

解释:

  • RO和RW节点共享一份存储, WAL的内容RO已经可读, 不需要再传输完整WAL, 只需要传输WAL的meta信息给RO节点.

本期问题2:
请问PolarDB PG的RW节点传输给RO节点的WAL包括什么信息?

  • a. datablock content

  • b. header

  • c. payload

  • d. pageid

答案:

  • bd

解释:

  • wal 的完整信息包括 header, pageid, payload. 由于PolarDB PG采用共享存储架构, RO可以直接从共享存储读到WAL的内容, 所以RW传输给RO的是wal meta信息, 包括header, pageid.

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

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

Image

文章中的参考文档请点击阅读原文获得.