【DB吐槽大会】第60期 - PG 只读实例不支持写操作

简介: 大家好,这里是DB吐槽大会,第60期 - PG 只读实例不支持写操作

背景


1、产品的问题点

  • PG 只读实例不支持写操作

2、问题点背后涉及的技术原理

  • PG 通过流复制支持物理的standby节点, standby节点通过接收主库wal日志, 实时回放block增量, 实现同步.
  • 由于PG主库和从库物理一致, 所以这个standby节点是只读的, 不支持写操作. 例如不支持创建临时表, 不支持写unlogged table. 不支持写数据等.

3、这个问题将影响哪些行业以及业务场景

  • 分析业务场景

4、会导致什么问题?

  • 分析业务通常计算量和IO的消耗量都很大, 所以一般会把分析逻辑放在standby库执行, 但是分析逻辑通常比较复杂, 例如把逻辑封装到函数中, 计算会有中间结果产生, 用中间结果再进行后续计算.
  • 因为standby库不支持写操作(包括写临时表), 使得中间结果没地方存放, 导致业务不得不放弃使用standby进行带中间结果的复杂逻辑分析.

5、业务上应该如何避免这个坑

  • 不将计算逻辑放到函数中, 而是通过业务的SQL调用来完成, 并且将中间结果写入到主库, 主库再同步到只读库, 同步完再进行下一步操作
  • 使用数组代替临时表存储中间结果.

6、业务上避免这个坑牺牲了什么, 会引入什么新的问题

  • 中间结果数据写入主库, 再同步有几个问题
  • 浪费主库存储资源
  • 浪费了3次传输中间结果的网络资源(读取、写入、同步)
  • 同步有延迟, 使得整个分析过程变长
  • 使用数组代替临时表的方案也有问题, 每个数组有1GB上限, 而且逻辑变得更复杂, 不适合新手, 门槛较高.

7、数据库未来产品迭代如何修复这个坑

  • 希望只读实例能支持临时表的定义和写入, 可以考虑临时表的定义不放在pg_catalog, 如果要放在pg_catalog也可以(这个可以在主库操作, 同步到只读库, 元数据定义的量还是比较小的, 不过还要考虑统计信息等, 也会导致上下不一致, 可以考虑放弃stat或者使用本地化stat)
  • 希望最终统计结果可以写主库(也就是说写入操作自动路由到主库操作, 不需要通过业务导一次. 例如fdw借口?)
  • 《PostgreSQL readonly standby 只读库如何写数据? - DDL DML 操作透明传输到主库》



相关文章
|
关系型数据库 数据库 PostgreSQL
【DB吐槽大会】第38期 - PG 不能自动创建(扩展)分区
大家好,这里是DB吐槽大会,第38期 - PG 不能自动创建(扩展)分区
|
SQL 消息中间件 存储
【DB吐槽大会】第33期 - PG 逻辑复制不支持DDL
大家好,这里是DB吐槽大会,第33期 - PG 逻辑复制不支持DDL
|
SQL 关系型数据库 数据库
【DB吐槽大会】第75期 - PG 不支持索引失效功能
大家好,这里是DB吐槽大会,第75期 - PG 不支持索引失效功能
|
SQL 资源调度 并行计算
【DB吐槽大会】第54期 - PG 资源隔离、管理手段较少
大家好,这里是DB吐槽大会,第54期 - PG 资源隔离、管理手段较少
|
存储 JSON 搜索推荐
【DB吐槽大会】第35期 - “富人”的烦恼?PG 不会自动选择索引类型
大家好,这里是DB吐槽大会,第35期 - “富人”的烦恼?PG 不会自动选择索引类型
|
SQL 关系型数据库 Java
【DB吐槽大会】第16期 - PG Standby不支持解析逻辑日志
大家好,这里是DB吐槽大会,第16期 - PG Standby不支持解析逻辑日志
|
存储 安全 关系型数据库
【DB吐槽大会】第52期 - PG 函数内容不支持加密
大家好,这里是DB吐槽大会,第52期 - PG 函数内容不支持加密
|
关系型数据库 数据库 索引
【DB吐槽大会】第32期 - PG 没有全局索引
大家好,这里是DB吐槽大会,第32期 - PG 没有全局索引
|
关系型数据库 分布式数据库 数据库
【DB吐槽大会】第44期 - PG 同步复制不支持自动升降级
大家好,这里是DB吐槽大会,第44期 - PG 同步复制不支持自动升降级
|
关系型数据库 物联网 数据库
【DB吐槽大会】第28期 - PG 每次只扩展1个block
大家好,这里是DB吐槽大会,第28期 - PG 每次只扩展1个block