钩子与扩展开发与 PG 高可用 Patroni

共 19 题
#

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 沿升级脚本链升级 ✓ 正确答案