# 1. PostgreSQL 的钩子(Hook)机制,ProcessUtility_hook、ExecutorStart_hook? A ProcessUtility_hook 只用于查询执行后的清理 B 钩子只能修改核心源码实现 C 钩子通过扩展注册回调,在特定阶段拦截或扩展服务器行为 ✓ 正确答案 D 钩子无法注册到共享库
# 2. Patroni + etcd 的高可用架构? A etcd 只用于存储业务数据 B Patroni 用 etcd 做分布式一致性存储,实现 leader 选举与故障切换 ✓ 正确答案 C Patroni 不提供故障切换能力 D 高可用无需 DCS,可单节点实现
# 3. Patroni 的配置,bootstrap、standby cluster、复制槽? A Patroni 不管理复制槽 B bootstrap 只用于配置备库 C bootstrap 定义集群初始化,slots 配置可保留逻辑复制槽避免 failover 丢失 ✓ 正确答案 D standby cluster 用于初始化独立主库
# 4. C 扩展与 PL/pgSQL 扩展的取舍? A PL/pgSQL 性能一定高于 C 扩展 B C 扩展性能高可访问底层能力,PL/pgSQL 开发快适合业务逻辑 ✓ 正确答案 C C 扩展不能注册新类型 D 两者功能完全相同
# 5. pg_stat_statements 的源码阅读路径? A 它通过 ProcessUtility_hook 和 ExecutorEnd_hook 收集统计,用 queryId 聚合 ✓ 正确答案 B 它通过修改核心源码实现统计 C 它不使用共享内存 D 它无法生成 SQL 指纹
# 6. C 扩展开发的内存管理,palloc 与内存上下文(MemoryContext) A 内存上下文与内存释放无关 B 扩展必须用 malloc 并手动逐一释放 C palloc 在内存上下文内分配,删除上下文即自动释放其全部内存 ✓ 正确答案 D palloc 分配的内存永不释放
# 7. 扩展如何通过 _PG_init 注册 GUC 参数并安装钩子?shared_preload_libraries 与 session_preload_libraries 的加载时机差异是什么? A _PG_init 不能注册 GUC B session_preload_libraries 在 postmaster 启动时加载 C 钩子无需 preload 即可注册 D _PG_init 注册 GUC 与钩子,shared_preload_libraries 在 postmaster 启动时加载可注册全局钩子 ✓ 正确答案
# 8. Patroni 在 DCS 中存储哪些内容(leader key、成员列表、配置)?TTL 租约如何用于故障检测与避免双主? A DCS 只存储配置,不存 leader B leader key 不需要 TTL C 任何节点都能同时成为 leader D DCS 存储 leader key 与成员信息,TTL 租约过期触发切换,选举保证唯一 leader 防双主 ✓ 正确答案
# 9. 扩展开发的基本步骤,Makefile、控制文件、SQL 文件? A 扩展由控制文件、SQL 脚本、Makefile(PGXS)组成,用版本号管理升级 ✓ 正确答案 B 扩展无需控制文件即可安装 C SQL 脚本只能写一个版本,不能升级 D Makefile 与扩展构建无关
# 10. Patroni 的工作原理,基于 etcd/ZooKeeper/Consul 的 leader 选举? A 选举不需要 DCS,靠节点自选 B 节点通过 DCS 原子创建 leader key 竞争成为 primary,保证唯一 leader ✓ 正确答案 C 多个节点可同时成为 primary D leader 不需要续租
# 11. Patroni 的限制与替代方案(Stolon、repmgr)? A repmgr 与 Patroni 功能完全一致 B Patroni 无需任何外部依赖 C Patroni 功能强但依赖 DCS,repmgr 更轻量但协调能力较弱 ✓ 正确答案 D Stolon 不需要数据库
# 12. Patroni 的故障检测与切换流程? A 切换需要人工干预,无法自动 B 故障检测通过 DCS 租约,切换时 standby 抢锁 promote 成为新 primary,旧主降级 ✓ 正确答案 C 故障切换会保留旧主继续写 D 切换与 DCS 无关
# 13. PG 扩展开发,C 扩展的 PG_MODULE_MAGIC 与调用约定? A 扩展函数无需声明 PG_FUNCTION_INFO_V1 B PG_MODULE_MAGIC 是可选宏,不定义也能加载 C PG_MODULE_MAGIC 记录编译版本用于加载时校验,函数遵循 V1 约定 ✓ 正确答案 D 调用约定只影响存储过程,不影响 C 函数
# 14. Patroni 的 watchdog/fencing 机制如何防止脑裂(双主写) A 多个节点同时写是安全的 B watchdog 只用于监控数据库性能 C 脑裂无法预防 D watchdog 在节点失去领导权时强制重启/宕机,物理隔离防止双主写 ✓ 正确答案
# 15. 自定义 background worker 如何注册与启动?与 cron 定时任务相比在数据库内执行周期任务的优缺点是什么? A background worker 在数据库进程内运行可访问共享内存,适合高性能周期任务 ✓ 正确答案 B background worker 无法访问数据库 C cron 定时任务运行在数据库进程内 D background worker 无需注册即可启动
# 16. Patroni 的 synchronous_mode 如何动态维护 synchronous_standby_names?切换时如何避免异步降级丢数据? A Patroni 动态维护 synchronous_standby_names,保证同步复制从而切换不丢已提交数据 ✓ 正确答案 B 同步模式与 synchronous_standby_names 无关 C 同步复制下切换必然丢数据 D Patroni 不管理同步复制
# 17. Patroni 的 REST API(/primary、/switchover)在运维编排与故障演练中的应用? A Patroni 不提供 REST API B REST API 只能查看,不能切换 C /primary 用于强制切换 D /switchover 可触发手动切换,用于故障演练与运维编排 ✓ 正确答案
# 18. PG 的扩展生态,PostGIS/pgvector 的部署与性能? A 两者都只能全表扫描 B PostGIS 用 GiST 空间索引优化空间查询,pgvector 用 HNSW 索引优化向量检索 ✓ 正确答案 C pgvector 不支持索引 D PostGIS 无法创建空间索引
# 19. 扩展的发布与安装(CREATE EXTENSION 的版本控制与更新路径) A 版本控制与 SQL 脚本无关 B 扩展无法升级版本 C 升级脚本只能有一个版本 D CREATE EXTENSION 按 default_version 安装,ALTER EXTENSION UPDATE 沿升级脚本链升级 ✓ 正确答案