为什么不能无限增加只读实例?
文章开始前推荐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%.
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) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:
文章中的参考文档请点击阅读原文获得.