K8s中部署2副本PostgreSQL StatefulSet是否为同一个数据库?
问题解答
- 默认配置下的2副本PostgreSQL StatefulSet 两个Pod对应独立的数据库实例,不会共享数据,你观测到的单Pod修改无法同步到另一个Pod的现象,完全符合原生StatefulSet的默认行为。
1. 为什么同一个StatefulSet的两个Pod不是同一个数据库?
原生K8s的StatefulSet仅负责Pod有序创建、稳定网络标识、持久卷绑定这类基础编排能力,不会自动实现PostgreSQL层面的主从复制、数据同步逻辑。默认配置replicas=2时,两个Pod完全独立启动、互不感知,自然就是两个独立的数据库实例。
2. 没有数据同步的多副本是不是没有实际意义?
单纯把StatefulSet副本数改成2、不做任何数据库层的同步配置的场景下,多副本确实没有实际价值,还会带来数据不一致的误解。
但配置了主从同步逻辑的多副本部署价值很高:
- 一个Pod作为主节点处理读写请求,其他副本作为从节点实时同步主节点数据,主节点故障时可以自动切换到从节点,实现数据库高可用
- 业务侧可以把读请求分发到从节点处理,降低主节点的读压力
3. 两个副本的存储是共享还是完全独立?
默认配置下完全独立:
- StatefulSet配合
volumeClaimTemplate使用时,会为每个副本Pod生成独立的PVC,对应独立的PV,两个Pod的存储完全隔离,不会共享 - 即使你手动配置两个Pod挂载同一个共享PV,也无法同时运行两个PostgreSQL实例:PostgreSQL默认会对数据目录加锁,阻止多个进程同时操作同一份数据文件,强行配置会直接导致数据损坏。
内容的提问来源于stack exchange,提问作者John Wu
相关产品推荐
相关产品推荐

