健康检查
通过创建到后端的连接实施健康检查
main()
PgpoolMain()
processState = PERFORMING_HEALTH_CHECK;
do_health_check()
make_persistent_db_connection()
discard_persistent_db_connection()
如果连接创建失败,会抛出异常,进而跳转到统一的异常处理点,如果超过重试次数,将后端降级,并最终调用pgpool.conf配置文件里设置的failover_command。
main()
PgpoolMain()
if(processState == PERFORMING_HEALTH_CHECK)
process_backend_health_check_failure()
degenerate_backend_set(&health_check_node_id,1)
degenerate_backend_set_ex()
register_node_operation_request(NODE_DOWN_REQUEST)
failover()
trigger_failover_command()
failover()的切换过程
再次确认后端状态,如无效更新后端的backend_status为CON_DOWN
获取第一个状态正常的后端作为new_master
kill所有子进程(这是基于pgpool做HA的一个很大的优势,可以可靠的切断所有来自客户端的连接,隔离故障节点)
对down掉的后端执行pgpool.conf配置文件里设置的failover_command
如果down掉的是primary,搜索新的primary,即第一个"SELECT pg_is_in_recovery()"返回不是t的后端。
重启所有子进程
发送restart通知给worker进程
通知PCP子进程failover/failback完成
发送restart通知给pcp进程