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
相关产品推荐
相关产品推荐

