You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL只读副本执行查询并实现K8s环境下的读写分离?

Kubernetes中PostgreSQL主从读写分离实现方案

PostgreSQL本身没有内置的读写自动路由机制——你当前所有请求走主节点,就是因为直接连接了主节点,Postgres不会主动把读请求转发到副本。要实现读写分离,主要有以下几种可行方案:

1. 显式区分连接(最直接的落地方式)

你需要在应用层分别配置主节点和只读副本的连接信息:

  • 写操作(INSERT/UPDATE/DELETE等)强制使用主节点的连接串
  • 读操作(SELECT)切换到只读副本的连接串

在Kubernetes环境中,可以给主、副本分别创建独立的Service:

  • 给主Pod打标签role: primary,创建Service postgres-primary,selector匹配该标签
  • 给副本Pod打标签role: replica,创建Service postgres-replica,selector匹配该标签

应用通过这两个Service分别发起连接,就能实现读写请求的分流。这种方式逻辑简单,适合小型项目或者对数据一致性要求极高的场景。

2. 引入中间件代理(生产环境推荐)

通过部署专门的数据库代理组件,统一接收所有数据库连接,由代理自动判断SQL类型并转发到对应节点:

  • PgBouncer:常用的Postgres连接池代理,可通过配置路由规则区分读写请求,将SELECT转发到副本,其他操作发往主节点
  • Patroni:不仅能实现Postgres的高可用切换,也提供读写分离路由能力,它会自动维护主/副本的状态,代理层直接对接Patroni的集群服务即可

在K8s中可以将代理组件以Deployment形式部署,暴露一个统一的Service给应用,应用只需要连接这个代理地址,无需关心后端的主从节点。

3. 利用ORM框架的多数据源支持

如果你的应用使用ORM框架(比如Hibernate、Django ORM、MyBatis等),可以通过框架自带的多数据源配置实现自动路由:

  • 比如Django可以配置DATABASE_ROUTERS,自定义路由规则,将读操作导向副本库
  • Hibernate可以通过配置@ReadOnly注解或者分库策略,让指定方法的查询走副本

这种方式无需大幅修改业务代码,靠框架层面完成读写分流,适合中大型项目。

注意事项

  • 副本延迟:只读副本的数据同步存在一定延迟,如果你的业务有“写完立即读”的场景,这类读请求仍需走主节点,避免读取到旧数据
  • 节点状态感知:无论是显式连接还是代理方案,都需要确保能及时感知主从节点的状态变化(比如主节点故障切换),K8s的Service结合标签选择器可以自动处理Pod的上下线

内容的提问来源于stack exchange,提问作者Shauryagoel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:12:17