PostgreSQL码农集散地

龙蜥 SkillHub 放大招: 一句话搞定 PG 集群部署和管理

最近在龙蜥 SkillHub 上翻到一个很有意思的 skill,叫 pg-create-cluster,由唐成老师的中启乘数科技(杭州)贡献。( https://gitee.com/anolis/anolis-skills/blob/master/skills/pg-create-cluster/ )

它的目标就一句话: 让 Claude Code 帮你对话式地把 PostgreSQL 流复制集群建起来。

传统 DBA 想建一个 1 主 2 备的 PG 集群,你得翻 30 页文档、记 若干 个参数、跑 hosts 探查、跑 vips 选空闲 VIP、跑 binpaths 看实际版本,然后小心翼翼地拼一条 create 命令。中间任意一个细节错了,initdb 报错、端口冲突、VIP 被占,前功尽弃。

pg-create-cluster 这个 skill 的核心思路,不是把这些命令打包成一个脚本,而是让 Claude Code 站在你旁边,像聊天一样一步一步问你。你回答,它就生成下一步命令;你犹豫,它就再问你一遍。

今天这篇文章,就把这件事拆开讲。

一、这件事的本质:工具开始"长出嘴"

过去十年,DBA 工具一直在做"减法" —— 把 30 页文档压成 5 个参数,把 5 个参数压成 1 条命令。

pg-create-cluster 这件事,走出了另一条路:工具不再只输出命令,而是开始"问你问题" 。

它做三件事:

第一,对话式 —— 一次只问 1 个问题,已定下的绝不重问。

第二,点选式 —— 跑 hosts / vips / binpaths 把真实的主机、VIP、版本摆到你面前让你选,而不是开放填空。

第三,shell 落地 —— 最后它会生成具体脚本命令直接跑起来。

合在一起, 这个 skill 解决的是一件很经典的事情:把 DBA 建库这件事,从"翻文档拼命令"降维到"跟 AI 助手聊天" 。

二、必须先确认的三件事

用这个 skill 之前,有 三件事 必须先确认,缺一个就跑不通。

第一件:CLup 必须先起来。 本地 CLup 默认连 127.0.0.1 的 8090 端口,远程 CLup 要带 --url,而且端口后面不能加 /api。这里有个非常关键的工程哲学: 建库第一步必须先问用户本地还是远程,连接配置要先于凭据确定。你连哪台机器,直接决定后续每条命令要不要带 --url。

第二件:Python 解释器是固定的。 必须用 /opt/csu_pyenv/bin/python,这个解释器自带 pycryptodome 库,脚本做密码 AES 加密依赖它。换别的 Python 解释器,跑起来会直接报错。

第三件:PG 二进制要对得上 OS。 这是一个非常隐蔽的坑 —— 同一台机上的 PG,如果是给 EL8 编的,但你跑的是 Rocky9,initdb 时会缺 libicui18n.so.60、libssl.so.1.1 这些 .so 文件,然后直接挂掉。解法是要么换装对 OS 的 PG,要么换一台 PG 编译正常的主机。

三、"像聊天不像表单"是这个 skill 的灵魂

三个原则看似简单,做到位的 skill 不到 10% 。

第一:一次只问 1 个。绝对不写成"请提供:集群名、主库 IP、备库 IP、PG 版本……"这种清单。每轮先扫历史对话,已定下的绝不重问。

这件事看似简单,但实际上 90% 的 AI 工具都会在这一步栽 —— 上来就丢表单给用户,用户根本不知道先回答哪个。

第二:用真实数据做选择。先跑 hosts / vips / binpaths --host 把真实的主机、VIP、版本摆到你面前让你点选,而不是开放填空。

理由很直接: 用户在填空的时候,90% 会填错(拼错 IP、用错版本);但在点选的时候,选错的可能性不到 5% 。这是 skill 设计上对人类认知规律的尊重。

第三:连接先于凭据。第一句必须是"这次连本地 CLup 还是远程",不能上来就要密码。理由:

  • 连接 URL 决定了后续每条命令是否要带 --url,顺序不能乱
  • 上来就要密码,用户会本能地警觉 —— 你还没说你要干什么,凭什么给密码?

四、用户只需决定 6 件事

pg-create-cluster 的参数哲学是: 用户只需决定 6 件事,其余走默认。

#
参数
来源
1
集群名
用户取
2
主库 IP
从 hosts 挑在线 agent 可达的
3
备库 IP
剩余在线主机,可多台,但同一台不能既主又备
4
PG 完整版本
binpaths --host <主库IP>
 看实际装的(如 16.10)
5
VIP + 池 ID
vips
 已自动排除被占的 VIP 和主机 IP
6
repl 流复制密码
默认 repl_user=db_user / repl_pass=db_pass

管理员账号、端口、os_user、os_uid、probe 配置这些,缺省取模板(template)。setting_list 系统自动从 get_init_db_conf 按 PG 版本取,含 listen_addresses='*' 等关键配置,不要问用户。

至少 2 台(1 主 1 备),建议 3 台(1 主 2 备) 。

五、主路径就这 4 条命令

3 条探查 + 1 条创建,完事。

# 1. 探查在线主机
/opt/csu_pyenv/bin/python create_pg_sr_cluster.py \
  --user <u> --pass <p> hosts

# 2. 探查空闲 VIP(末尾直接给 recommended selectable VIPs)
/opt/csu_pyenv/bin/python create_pg_sr_cluster.py \
  --user <u> --pass <p> vips

# 3. 探查 PG 实际版本
/opt/csu_pyenv/bin/python create_pg_sr_cluster.py \
  --user <u> --pass <p> binpaths --host <主库IP>

# 4. 创建 + 轮询任务
/opt/csu_pyenv/bin/python create_pg_sr_cluster.py \
  --user <u> --pass <p> create \
  --cluster-name <名> --primary <主IP> --standby <备IP1,IP2> \
  --version <完整版本> --vip <VIP> --pool-id <池ID> \
  --repl-pass <密码> --wait

成功会打印 SUCCESS: cluster created (task N)。

脚本内部实际跑的事情是: 登录 → 逐节点匹配 pg_bin_path → 取 setting_list(含 listen_addresses='*')→ preflight 校验(目录空/端口/VIP) → 组装 body(密码加密) → 提交 → 轮询任务(state=1 成功、-1 失败) 。

六、作者已经替你踩过的坑

这一段不读,踩到再查文档就晚了。

坑 ① · 密码混淆

验证连库时报 password authentication failed for user "postgres",很多 DBA 第一反应是去翻 CREATE BODY,找到顶层打印的 db_pass 字段,然后用这个值去登录 —— 立刻报错。

原因是这个 db_pass 是 to_db_text 的 AES 加密串,不是明文。实例真实密码 = 模板默认明文 postgres 。

正确姿势:

PGPASSWORD=postgres /usr/pgsql-14/bin/psql -h <VIP 或 主库IP> -U postgres

坑 ② · database not connected

建库时报 create_replication_user ... database not connected!,99% 是 setting_list 的问题 —— 没 listen_addresses,新 PG 只听 localhost,CLup server 连不上。

这个 skill 已经自动从 get_init_db_conf 取 setting_list,正常不会再现;若改脚本时又复现,先查 setting_list 里有没有 listen_addresses='*' 。

坑 ③ · state=0 不是故障

现网 CLup 这版 clup_cluster.state=0 = 正常(库里所有健康集群都是 0);CLAUDE.md 写的 1=Normal 是逻辑 HA state,不是这个表的列。

判健康要看:

  • clup_db.db_state=0(Running)
  • 主备角色正确
  • pg_stat_replication 在 streaming(state=streaming 且 replay_lsn=sent_lsn)

七、v1 范围 —— 如实说,不含糊

v1 仅支持
v1 不支持
已有在线主机
新建虚拟机再建集群(create_vm_sr_cluster 留 v2)
显式指定主备(--primary / --standby)
主机不够时硬装
至少 1 主 1 备,建议 1 主 2 备
—

凭据安全单独说一句:密码走 --pass 会出现在进程命令行(ps aux 就能看到),更推荐用环境变量CLUP_USER / CLUP_PASS(默认先读环境变量,没读到才用 flag)。

最后

pg-create-cluster 这个 skill,最值得借鉴的不是它的命令、不是它的脚本,而是它对人类认知规律的尊重 ——

  • 一次问一个
  • 用真实数据做选择
  • 连接先于凭据

这三件事做到位,AI 助手才真的从"工具"升级成"伙伴"。

过去十年,运维工具一直在做减法 —— 把命令变少,把参数变少,把文档变薄;未来十年,运维工具会开始做加法 —— 让工具主动问你问题,主动把你的认知负担接过去。

pg-create-cluster 是这个转向里最容易被低估的一步。它看起来只是个 skill,但它潜台词是: DBA 工具终于开始"长嘴"了。

只要这个趋势继续下去,下一个十年,DBA 的核心能力就不再是"记住多少命令",而是"知道怎么问对问题、怎么让 AI 助手替你把命令执行好"。

参考资料

  • 完整 skill 内容:龙蜥 SkillHub · pg-create-cluster
  • 配套视频:本期 8 分钟精讲视频已生成, 可在「digoal德哥」视频号获取

📌 如果你今天还在为建一个 PG 流复制集群头疼,建议你今天就把 Claude Code + pg-create-cluster SKILL 这套装起来。然后告诉 Claude Code:"建一个 1 主 2 备的 PG 16.10 集群",让它替你跑完整个流程。