PostgreSQL码农集散地

为什么增加RO节点动则数小时?

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

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

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

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

为什么增加RO节点动则数小时?

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

社区版本:
如何创建只读(RO)实例?

  • 准备好RO节点所需的硬件(主要包括存储、主机, 存储必须大于或等于主节点的存储空间.)

  • 配置主实例: 确保wal_level不是minimal级别, 配置pg_hba.conf, 创建流复制的数据库角色, 配置足够多的wal sender process. 确保主、只读实例的网络可达.

  • 拷贝数据文件: 通过pg_basebackup, 或者使用操作系统的拷贝命令(start backup, copy, stop backup).

  • 配置只读实例: recovery.conf (高版本这个文件被放到了postgresql.conf里, 配合 standby.signal 文件使用).

  • 启动只读实例: 启动后, 自动从主实例接收wal, 在只读实例回放wal.

耗时公式可以简化为:

  • 主实例数据文件/网络传输速度

问题:
如果数据文件很多, 拷贝过程可能持续很久, 由于wal日志不断产生, 主实例在checkpoint后可能删除掉一些旧的wal文件. 如果这些被删掉的wal文件是只读实例恢复依赖的wal, 那么只读实例就无法启动.
对于这样的问题, 通常的解决办法:

  • 开启wal归档、

  • 配置wal_keep_segments,

  • 或者备份时使用slot记录接收wal的位置避免清除未被pg_basebackup接收的wal.

实例大了之后(一般来讲 SSD+万兆网 这种配置好的环境TB以上算大实例, 配置差的环境几百GB就算大实例了.), 创建只读实例确实有一些挑战. 动则数小时, 甚至可能由于WAL已被删除而功亏于溃.
如果正好是HA节点的standby节点挂了, 会有一个较长的时间窗口这个集群将处于单点状态.

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

  • PolarDB 创建RO(只读实例)还需要拷贝文件吗? 不需要. 只需要增加计算节点, 挂载共同的存储设备即可.

    • 所以不管实例的存储多大, 增加RO节点都非常快.

  • 对RO节点的配置有要求吗? 几乎没有要求, 可以采用低配置. 但是如果想用RO来做计算节点的HA备机, 推荐同等配置.

本期问题1:
请问给较大的PostgreSQL实例创建RO(只读)实例可能存在哪些问题?

  • a. 拷贝时间过长, 主节点wal文件可能被清理, 只读实例可能无法启动

  • b. 拷贝文件时可能导致网络带宽打满.

  • c. 需要停主库才能创建只读实例

  • d. 拷贝文件过程中可能耗费主实例的存储资源, 影响业务

答案:

  • abd

解释:

  • 参考文章内容, 建议的配置, 建议的限速方法pg_basebackup.

本期问题2:
请问PolarDB创建RO(只读)实例时需要拷贝数据文件吗?

  • a. 需要

  • b. 不需要

答案:

  • b

解释:

  • PolarDB 是计算存储分离架构, 计算节点共享同一份存储, 所以创建RO(只读)实例时不需要拷贝数据文件.

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

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

Image

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