【DB吐槽大会】第42期 - PG 读写分离不友好

简介: 大家好,这里是DB吐槽大会,第42期 - PG 读写分离不友好

背景


1、产品的问题点

  • PostgreSQL 读写分离非常不友好, 没有内置的对业务完全透明的读写分离功能.

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

  • 为什么要读写分离?
  • 读请求占比较高, 并且单个实例无法支撑业务的请求吞吐时, 通过增加只读实例, 将读请求分流到只读实例以满足业务需求.
  • 什么是业务透明的读写分离?
  • 应用发起SQL, 数据库根据SQL是否会对数据库产生写操作自动分发到主库或只读库.

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

  • 读占比和吞吐较大的业务
  • 读请求相对来说比较复杂, 需要耗费较大IO和CPU计算, 怕影响主实例(RW实例)的业务

4、会导致什么问题?

  • 没有读写分离功能, 业务必须连接多个数据源, 在代码中自己判断, 将读、写请求发送到不同的数据源. 增加了程序设计复杂度.
  • 而且只读和读写节点可能发生角色切换, 代码里面不仅要判断SQL是否要路由到RO, 还要判断当前数据源到底是RO还是RW角色.

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

  • 使用 pgpool-II 中间件

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

  • 通过pgpool-II连接数据库, 性能存在巨大的损耗
  • 多一跳延迟增加、
  • pgpool-II自身的损耗
  • 高并发小事务损耗50%以上 (tpc-b测试样例)
  • 功能不完备, 例如:
  • 函数内的query不能再路由
  • 自定义函数需要配置黑白名单, 否则统一路由到rw节点. (函数白名单、黑名单需要手工维护)
  • 增加了1个组件增加了1份故障点
  • 增加了配置复杂度, 例如
  • 心跳检测配置
  • 从库与主库延迟多少后自动踢出只读实例列表
  • 恢复后是否自动加入只读实例列表
  • 连接池个数, 空闲自动释放时间, 生命周期等

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

  • 希望内核层面支持对业务透明的自动读写分离
  • 不管是rw还是ro节点, 平等对待所有连接. 应用可以使用驱动来load balance连接
  • 从库与主库延迟自动踢出只读实例列表, 恢复后是否自动加入只读实例列表
  • 解析SQL, 生成执行计划, 自动路由plan execute
  • 根据SQL的代价来决定是否要将sql分发给只读实例. 用户可以设置代价阈值.
  • 不依赖外部产品
相关文章
|
2月前
|
SQL 关系型数据库 分布式数据库
Citus 简介,将 Postgres 转换为分布式数据库
【10月更文挑战第4天】Citus 简介,将 Postgres 转换为分布式数据库
112 4
|
SQL Oracle 关系型数据库
【DB吐槽大会】第48期 - PG 性能问题发现和分析能力较弱
大家好,这里是DB吐槽大会,第48期 - PG 性能问题发现和分析能力较弱
|
SQL 关系型数据库 数据库
【DB吐槽大会】第75期 - PG 不支持索引失效功能
大家好,这里是DB吐槽大会,第75期 - PG 不支持索引失效功能
|
关系型数据库 Java 分布式数据库
【DB吐槽大会】第9期 - PG 大量连接写小事务性能差
大家好,这里是DB吐槽大会,第9期 - PG 大量连接写小事务性能差
|
存储 JSON 搜索推荐
【DB吐槽大会】第35期 - “富人”的烦恼?PG 不会自动选择索引类型
大家好,这里是DB吐槽大会,第35期 - “富人”的烦恼?PG 不会自动选择索引类型
|
关系型数据库 数据库
【DB吐槽大会】第57期 - PG multi-master 支持不友好
大家好,这里是DB吐槽大会,第57期 - PG multi-master 支持不友好
|
SQL 关系型数据库 Java
【DB吐槽大会】第16期 - PG Standby不支持解析逻辑日志
大家好,这里是DB吐槽大会,第16期 - PG Standby不支持解析逻辑日志
|
SQL 消息中间件 存储
【DB吐槽大会】第33期 - PG 逻辑复制不支持DDL
大家好,这里是DB吐槽大会,第33期 - PG 逻辑复制不支持DDL
|
SQL 索引 关系型数据库
知其所以然 | 阿里分布式数据库X-DB如何实现Online DDL?
“关系”在数据库中的主要表现形式是表,包含表属性,列属性,索引以及约束等。通过“关系”来规范存储,使得用户通过SQL标准规范存取数据。借助SQL语句丰富的表达能力,在数据库层面就能搞定复杂的业务。
1647 0
|
SQL 关系型数据库 Java
PgSQL · 应用案例 · PostgreSQL flashback(闪回) 功能实现与介绍
背景 闪回的需求往往是救命的需求,因为通常情况下数据库正常运行是不需要闪回的,往往是出现了误操作,被攻击,被注入后,数据库的数据被删除或恶意纂改并且纂改的事务已提交,也就是说纂改已经被持久化了。 这种情况下需要闪回来救命,回到被破坏前的状态。
3301 0