通过HAProxy执行Cockroach SQL 主节点故障后无法切换问题排查
问题描述
基于Docker搭建3节点CockroachDB集群并搭配HAProxy,需求是通过HAProxy执行Cockroach SQL,确保主节点宕机时SQL查询能持续执行。但主节点宕机后,HAProxy无法自动切换至其他正常节点,SQL连接直接退出。
当前HAProxy配置
# Global settings global daemon maxconn 4096 defaults log global mode http option httplog option dontlognull retries 3 timeout connect 5000 timeout client 50000 timeout server 50000 frontend cockroach-sql bind *:26257 mode tcp default_backend cockroach-sql-backend backend cockroach-sql-backend mode tcp balance roundrobin option tcp-check tcp-check connect server cockroachdb-1 cockroachdb-1:26257 check inter 5000 fall 3 rise 2 server cockroachdb-2 cockroachdb-2:26257 check inter 5000 fall 3 rise 2 server cockroachdb-3 cockroachdb-3:26257 check inter 5000 fall 3 rise 2 backup # Handle Haproxy stats for web browser listen stats bind :8083 mode http stats enable stats uri /stats stats show-node stats hide-version stats refresh 30s stats auth haproxy:password
测试命令
通过以下命令在node1容器中经HAProxy执行Cockroach SQL:
docker exec -it cockroachdb-1 ./cockroach sql --certs-dir=certs --host=haproxy:26257
问题分析
- 健康检查精度不足:仅用
tcp-check connect只能验证端口是否开放,无法确认节点是否能正常处理SQL请求(比如节点处于同步中、非可用状态),HAProxy误判节点可用性。 - 备份节点限制:
cockroachdb-3标记为backup,仅当所有非备份节点宕机时才会被启用。若主节点宕机但其他非备份节点正常,HAProxy因健康检查失效无法切换到可用节点。 - 模式配置冲突:
defaults块默认mode http,虽然后端手动指定tcp,但HTTP相关配置(如option httplog)会干扰TCP代理的健康检查逻辑。
解决方案
1. 优化健康检查逻辑
替换简单的TCP端口检查为SQL查询验证,确保节点能正常处理请求,同时移除备份节点限制:
backend cockroach-sql-backend mode tcp balance roundrobin option tcp-check # 发送SQL查询验证节点可用性 tcp-check send "SELECT 1;\r\n" tcp-check expect string "1" server cockroachdb-1 cockroachdb-1:26257 check inter 5000 fall 3 rise 2 server cockroachdb-2 cockroachdb-2:26257 check inter 5000 fall 3 rise 2 server cockroachdb-3 cockroachdb-3:26257 check inter 5000 fall 3 rise 2
- 去掉
backup标记,让三个节点都参与负载均衡,CockroachDB自身会处理主从路由,HAProxy只需保证转发到可用节点。 - 用
SELECT 1验证节点SQL服务的可用性,比端口检查更精准。
2. 修正默认模式配置
将defaults块的默认模式改为tcp,移除HTTP相关配置:
defaults log global mode tcp option dontlognull retries 3 timeout connect 5000 timeout client 120000 timeout server 120000 timeout tunnel 120000 # 适配CockroachDB长连接特性
- 移除
option httplog,避免TCP模式下的日志干扰。 - 延长超时时间,适配CockroachDB的长连接场景,减少因超时导致的连接中断。
3. 验证配置并重启HAProxy
- 检查配置语法合法性:
haproxy -c -f /path/to/haproxy.cfg
- 重启HAProxy容器:
docker restart haproxy
验证步骤
- 启动所有CockroachDB节点和HAProxy。
- 通过HAProxy建立SQL连接并执行查询。
- 手动停止主节点容器:
docker stop cockroachdb-1
- 在原有SQL会话中继续执行查询,确认是否自动切换到其他节点并正常返回结果。
内容的提问来源于stack exchange,提问作者Ramke
相关产品推荐
相关产品推荐

