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

Spring Boot对接Kubernetes中PostgreSQL StatefulSet读写访问配置问题

问题1:Spring Boot读写分离配置方法

实现读写请求分别走master、slave服务,核心是配置多数据源并按照请求类型路由,以下是最常用的MyBatis-Plus动态数据源方案的application.properties配置:
首先引入动态数据源依赖(Maven示例):

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

然后修改application.properties:

# 设置默认数据源为master
spring.datasource.dynamic.primary=master
# 严格匹配数据源,找不到对应数据源时报错
spring.datasource.dynamic.strict=true

# 主库配置,地址指向PostgreSQL master的Headless Service域名
spring.datasource.dynamic.datasource.master.url=jdbc:postgresql://pg-master-headless.你的命名空间.svc.cluster.local:5432/实际库名
spring.datasource.dynamic.datasource.master.username=数据库用户名
spring.datasource.dynamic.datasource.master.password=数据库密码
spring.datasource.dynamic.datasource.master.driver-class-name=org.postgresql.Driver

# 从库配置,地址指向PostgreSQL slave的ClusterIP Service域名
spring.datasource.dynamic.datasource.slave.url=jdbc:postgresql://pg-slave-cluster.你的命名空间.svc.cluster.local:5432/实际库名
spring.datasource.dynamic.datasource.slave.username=数据库用户名
spring.datasource.dynamic.datasource.slave.password=数据库密码
spring.datasource.dynamic.datasource.slave.driver-class-name=org.postgresql.Driver

配置完成后,只需要在业务方法上添加注解路由即可:写方法加@DS("master")或者不加(默认走master),读方法加@DS("slave"),也可以配合AOP实现自动根据读/写方法路由,不需要手动修改业务代码。

问题2:仅绑定master的Headless Service运行机制

首先需要纠正一个误解:Headless Service本身不具备自动请求分发的能力,你提到的“自动分发”是绑定多个Pod场景下的客户端侧负载逻辑,仅指向master的场景下不存在分发逻辑,核心运行机制如下:

  • Headless Service的核心特征是clusterIP: None,Kubernetes不会为它分配虚拟ClusterIP,kube-proxy也不会处理该服务的流量转发,DNS解析该服务域名时会直接返回背后绑定的所有Pod的真实IP列表。
  • 你当前场景下的Headless Service配置了只匹配role=master标签的PostgreSQL Pod,正常单主PostgreSQL集群同一时间只会有一个Pod带该标签,所以DNS解析结果只会返回唯一的master Pod IP,请求会直接发送到master节点,不会出现路由到slave的情况。
  • 如果你的PostgreSQL集群用了Patroni等高可用组件,当旧master节点故障、新master被选举出来后,高可用组件会自动更新Pod标签,把旧master的role=master标签移除,给新master加上该标签,Headless Service的DNS解析结果会自动同步为新的master IP,应用不需要修改任何配置即可自动发现新的master地址,这也是为什么用Headless Service暴露master的核心优势。
  • 如果Headless Service绑定了多个Pod(比如所有slave节点),DNS会返回所有slave的IP列表,客户端可以自己实现轮询等负载策略,这就是大家常说的“Headless Service自动分发”的本质,分发逻辑在客户端,不在Service本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:15:05