使用 Docker-Compose 部署 HAProxy 为TiDB-Server 做负载均衡

使用HAProxy 为TiDB-Server 做负载均衡

环境
  • IP: 192.168.180.46
  • 系统: CentOS 7
服务器 IP hostname
HAProxy 192.168.180.46 test1
TiDB-Server 192.168.180.47 test2
TiDB-Server 192.168.180.48 test3
TiDB-Server 192.168.181.18 test4
创建文件夹
mkdir -p /home/tidb/haproxy/config
配置haproxy.cfg
cat > /home/tidb/haproxy/config/haproxy.cfg << eric
global
  log     127.0.0.1 local0
  maxconn 32                    # 最大同时32连接
  daemon                        # 以daemon方式在后台运行

defaults
  # mode http                   # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
  retries         3             # 连接后端服务器失败重试次数,超过3次后会将失败的后端服务器标记为不可用。

  # 超时时间如果设置的太短,会导致应用程序断开连接,建议根据实际情况调整
  timeout client  30s           # 客户端响应超时             30秒
  timeout server  30s           # server端响应超时           30秒
  timeout connect 5s            # 连接server端超时           5秒
  timeout check   10s           # 对后端服务器的检测超时时间 10秒

listen stats                    # 定义监控页面
  mode  http
  bind  *:1080                  # 绑定端口1080
  stats refresh 1s              # 每1秒更新监控数据
  stats uri /stats              # 访问监控页面的uri
  stats realm HAProxy\ Stats    # 监控页面的认证提示
  stats auth admin:654321       # 监控页面的用户名和密码

frontend tidb_front
  mode  tcp
  bind  *:4000                  # 监听4000端口
  default_backend tidb_back

backend tidb_back

  mode    tcp
  option  tcp-check
  balance roundrobin

  server TiDB-Server-test2 192.168.180.47:4000 check inter 10s rise 3 fall 3 weight 1
  server TiDB-Server-test3 192.168.180.48:4000 check inter 10s rise 3 fall 3 weight 2
  server TiDB-Server-test4 192.168.181.18:4000 check inter 10s rise 3 fall 3 weight 3
eric

创建 docker-compose.yaml 文件
cat > /home/tidb/haproxy/docker-compose.yaml << eric
version: '3.1'

services:

  HAProxy:
    image: haproxy:2.0.6
    restart: always
    container_name: HAProxy
    ports:
      - 4100:80
      - 4000:4000
      - 1080:1080
    volumes:
      - ./config/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
eric

查看管理界面

http://192.168.180.46:1080/stats

haproxy.cfg 配置详解
global
  log     127.0.0.1 local0
  maxconn 32                    # 最大同时32连接
  daemon                        # 以daemon方式在后台运行

defaults
  # mode http                   # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
  retries         3             # 连接后端服务器失败重试次数,超过3次后会将失败的后端服务器标记为不可用。

  # 超时时间如果设置的太短,会导致应用程序断开连接,建议根据实际情况调整
  timeout client  30s           # 客户端响应超时             30秒
  timeout server  30s           # server端响应超时           30秒
  timeout connect 5s            # 连接server端超时           5秒
  timeout check   10s           # 对后端服务器的检测超时时间 10秒

listen stats                    # 定义监控页面
  mode  http
  bind  *:1080                  # 绑定端口1080
  stats refresh 1s              # 每1秒更新监控数据
  stats uri /stats              # 访问监控页面的uri
  stats realm HAProxy\ Stats    # 监控页面的认证提示
  stats auth admin:654321       # 监控页面的用户名和密码

frontend tidb_front
  mode tcp
  bind *:4000                   # 监听4000端口
  default_backend tidb_back

backend tidb_back

  mode     tcp
  option   tcp-check            # 这个必须要加,否则健康检查会失败,因为当前使用的是TCP协议,它表示使用TCP协议做检查,而不是使用HTTP或health协议

  # 8种负载均衡方式
  1.balance roundrobin          # 轮询,软负载均衡基本都具备这种算法
  2.balance static-rr           # 根据权重,建议使用
  3.balance leastconn           # 最少连接者先处理,建议使用
  4.balance source              # 根据请求源IP,建议使用
  5.balance uri                 # 根据请求的URI
  6.balance url_param,         # 根据请求的URl参数'balance url_param' requires an URL parameter name
  7.balance hdr(name)           # 根据HTTP请求头来锁定每一次HTTP请求
  8.balance rdp-cookie(name)    # 根据据cookie(name)来锁定并哈希每一次TCP请求

  balance  roundrobin           # roundrobin 轮询方式

  # 健康检查:
  1.inter:   时间间隔10秒
  2.rise:    重试三次
  3.fall:    失败三次连接状态将变为DOWN
  4.weight:  权重1
  server TiDB-Server-test2 192.168.180.47:4000 check inter 10s rise 3 fall 3 weight 1
  server TiDB-Server-test3 192.168.180.48:4000 check inter 10s rise 3 fall 3 weight 2
  server TiDB-Server-test4 192.168.181.18:4000 check inter 10s rise 3 fall 3 weight 3

超时引发的异常
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
将如下属性值改大

timeout client 30s # 客户端响应超时 30秒

timeout server 30s # server端响应超时 30秒

timeout connect 5s # 连接server端超时 5秒

2赞