You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

问题分析

  1. 健康检查精度不足:仅用tcp-check connect只能验证端口是否开放,无法确认节点是否能正常处理SQL请求(比如节点处于同步中、非可用状态),HAProxy误判节点可用性。
  2. 备份节点限制:cockroachdb-3标记为backup,仅当所有非备份节点宕机时才会被启用。若主节点宕机但其他非备份节点正常,HAProxy因健康检查失效无法切换到可用节点。
  3. 模式配置冲突: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

  1. 检查配置语法合法性:
haproxy -c -f /path/to/haproxy.cfg
  1. 重启HAProxy容器:
docker restart haproxy

验证步骤

  1. 启动所有CockroachDB节点和HAProxy。
  2. 通过HAProxy建立SQL连接并执行查询。
  3. 手动停止主节点容器:
docker stop cockroachdb-1
  1. 在原有SQL会话中继续执行查询,确认是否自动切换到其他节点并正常返回结果。

内容的提问来源于stack exchange,提问作者Ramke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:32:41