PostgreSQL 9.5环境下C++项目如何检测数据库主节点可用性
C++项目内检测PostgreSQL 9.5主节点可用性的实现方案
别用fork进程调用外部工具的方案,也没必要写复杂的模拟查询逻辑,直接基于PG官方的libpq客户端库做两层校验就够,性能开销极低,完全适配C++项目场景:
- 第一层:实例存活状态校验
建立连接后直接调用PQstatus接口获取连接状态,返回值为CONNECTION_OK才代表实例可以正常接收请求。注意连接参数里必须配置connect_timeout(建议设1~3秒),避免跨节点网络异常时连接长时间阻塞拖垮业务。
这一步不需要发任何SQL,比跑模拟查询的效率高很多。 - 第二层:主节点身份校验
连通不代表连到的是可写主节点,毕竟集群里还有2个副本。PG9.5已经内置了实例状态查询接口,直接执行SELECT pg_is_in_recovery()即可:返回结果为
t说明当前连接的是处于恢复状态的只读副本,返回f才是支持写入的主节点。
这个查询是直接读内核内存里的状态标记,不会访问业务表、不会产生WAL日志,开销比自定义模拟业务查询小一个量级。
几个实际落地的注意点:
- 不要只用TCP端口探测判断可用性,PG进程启动后、WAL重放完成前就会打开监听端口,这时候端口是通的,但实例根本没法处理正常请求,会出现误判。
- 如果你项目里用的是libpq的C++封装库(比如libpqxx),逻辑完全一致:先检查连接对象的可用状态,再执行上面的单值状态查询判断主备身份即可,不需要额外引入依赖。
- 检测逻辑不要放在业务请求的同步链路里,建议单独开后台线程/协程,每1~2秒轮询一次三个节点的状态,本地缓存当前可用主节点的连接信息,业务侧直接用缓存的连接就行,避免每次请求都额外做检测增加延迟。
内容的提问来源于stack exchange,提问作者mouse_00
相关产品推荐
相关产品推荐

