安装环境
 yum install gcc openssl-devel readline-devel systemd-devel make pcre-devel

下载

haproxy各版本链接如下:

https://src.fedoraproject.org/repo/pkgs/haproxy/

 curl https://www.lua.org/ftp/lua-5.4.3.tar.gz > lua-5.4.3.tar.gz
 curl https://www.haproxy.org/download/2.3/src/haproxy-2.3.9.tar.gz > haproxy-2.3.9.tar.gz


安装lua

haproxy 1.6 以及之后版本依赖 lua5.3 以上的版本,因此编译安装 haproxy 之前,需要提前编译安装 lua

 tar zxf lua-5.4.3.tar.gz
 cd lua-5.4.3
 make INSTALL_TOP=/usr/local/lua-5.4.3 linux install

安装openssl 1.1.1k

shard的作用是生成动态链接库

 curl -R -O https://www.openssl.org/source/openssl-1.1.1k.tar.gz
 tar xvzf openssl-1.1.1k.tar.gz
 cd openssl-1.1.1k
 ./config --prefix=/usr/local/openssl-1.1.1k shared
 make
 make install


安装haproxy

 tar xvf haproxy-2.3.9.tar.gz
 cd haproxy-2.3.9
 make ARCH=x86_64 \
 TARGET=linux-glibc \
 USE_NS=1 \
 USE_TFO=1 \
 USE_OPENSSL=1 \
 SSL_LIB=/usr/local/openssl-1.1.1k/lib \
 SSL_INC=/usr/local/openssl-1.1.1k/include \
 USE_ZLIB=1 \
 USE_LUA=1 \
 USE_PCRE=1 \
 USE_SYSTEMD=1 \
 USE_LIBCRYPT=1 \
 USE_THREAD=1 \
 USE_CPU_AFFINITY=1 \
 LUA_INC=/usr/local/lua-5.4.3/include \
 LUA_LIB=/usr/local/lua-5.4.3/lib \
 EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o" \
 PREFIX=/usr/local/haproxy
 make install PREFIX=/usr/local/haproxy
 cp -a haproxy /usr/sbin/

配置systemd

/etc/systemd/system/haproxy.service

 [Unit]
 Description=HAProxy Load Balancer
 After=syslog.target network.target
 
 [Service]
 Type=notify
 EnvironmentFile=/etc/sysconfig/haproxy
 ExecStart=/usr/sbin/haproxy -f $CONFIG_FILE -p $PID_FILE $CLI_OPTIONS
 ExecReload=/bin/kill -USR2 $MAINPID
 ExecStop=/bin/kill -USR1 $MAINPID
 KillMode=mixed
 
 [Install]
 WantedBy=multi-user.target

/etc/sysconfig/haproxy

 # Command line options to pass to HAProxy at startup
 # The default is:
 #CLI_OPTIONS="-Ws"
 CLI_OPTIONS="-Ws"
 
 # Specify an alternate configuration file. The default is:
 #CONFIG_FILE=/etc/haproxy/haproxy-2.3.9.conf
 CONFIG_FILE=/etc/haproxy/haproxy.cfg
 
 # File used to track process IDs. The default is:
 #PID_FILE=/var/run/haproxy-2.3.9.pid
 PID_FILE=/var/run/haproxy.pid


启动

 systemctl daemon-reload
 systemctl enable haproxy

配置文件

haproxy 的全局配置内容

 global : 表示全局配置内容开始
 log : 定义 rsyslog 配置
 chroot : 锁定 haproxy 进程的运行目录
 pidfile : 指定 pid 文件存放路径
 maxconn : 指定进程的最大并发连接数
 user : 指定进程的运行者身份
 group : 指定进程的运行组身份
 daemon : 指定进程以守护进程运行
 nbproc : 指定 haproxy 开启的进程数
 cpu-map : 1.8 版本以上的 haproxy 指定进程号和指定cpu绑定
 nbthread: 指定每个进程所开启的线程数,默认为 1
 spread-checks: 分散 tcp 健康监测,防止后台服务器数量过多,压力过大,建议 2-5
 
 proxies 配置 haproxy 所代理的主机配置
 defaults :表示代理配置功能开始
 mode http/tcp :表示默认采用的代理模式, L4 或者 L7
 log global :日志配置
 option dontlognull :是否记录空连接日志
 option http-server-close:开启 http 服务端主动关闭连接功能
 option forwardfor :开启 http 转发的 X-Forwarded-For 报文头功能
 option redispatch :当已建立的连接服务器宕机后,强制将用户请求调度到其他健康的服务器
 retries :连接失败后的重复尝试连接次数
 timeout http-request :设置 http 请求最大请求时长
 timeout queue :连接在等待队列中的最大时长
 timeout connect :设置等待连接成功的最长时间
 timeout client :设置客户端不活跃时间
 timeout server :设置服务器端最大不活跃时间
 timeout http-keep-alive :设置连接的 keepalive 时间
 timeout check :设置已连接的连接检查
 maxconn :设置前端最大连接数量
 
 listen 方式定义代理服务功能
 listen :后面配置一个代理名称,配置区分大小写
 bind :定义本个代理中 haproxy 对外监听的 ip 地址和端口
 server :指定后端被代理的地址和健康监测配置
 
 frontend 和 backend
 通过前后端分别定义的方式完成代理配置,建议使用上面的 listen 方式,比如:
 frontend web
 bind 192.168.10.10:80
 use_backend web_server
 backend web_server
 server 192.168.10.30:80
 server 192.168.10.40:80
 
 由于 haproxy 通常会配置多个业务和系统的代理配置,将全部配置信息写到一个配置文件中不便于管理,下面我们可以指定一个目录作为配置文件的存放目录,haproxy 启动时可以读取目录下的全部配置文件,比如我们创建 /etc/haproxy/conf 目录,然后修改 haproxy 的启动配置文件,添加该路径

开启Prometheus Exporter

从2.0开始,Haproxy 通过外部组件的形式实现 prometheus exporter。需要在编译的时候选择 prometheus exporter 模块

 make TARGET=linux-glibc EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o"

验证haproxy 是否安装 prometheus exporter

 #执行如下命令,查看结果
 haproxy -vv
 
 Available services : prometheus-exporter

配置文件设置

将metric 整合到stats

 frontend stats
    bind *:8404
    option http-use-htx
    http-request use-service prometheus-exporter if { path /metrics }
    stats enable
    stats uri /stats
    stats refresh 10s



Data Plane API

Data Plane API 是一个sidecar进程,可以独立于haproxy运行并且提供 API的方式来管理haproxy。支持haproxy最低版本是1.9。

本质就是一个监控程序,定期检查 haproxy的配置文件,如果有更改就自动reload。

单独运行

 dataplaneapi \
    --host 127.0.0.1 \
    --port 5555 \
    --haproxy-bin /usr/sbin/haproxy \
    --config-file /etc/haproxy/haproxy.cfg  \
    --reload-delay 5 \
    --reload-cmd "service haproxy reload" \
    --restart-cmd "service haproxy restart" \
    --userlist haproxy-dataplaneapi \
    --transaction-dir /tmp/haproxy

haproxy 2.0 之后,支持通过haproxy自身的进程来启动data plane api

需要haproxy 运行在 master-worker 模式,

 program api
     command dataplaneapi --host 0.0.0.0 --port 5555 --haproxy-bin /usr/sbin/haproxy --config-file /etc/haproxy/haproxy.cfg --reload-cmd "systemctl reload haproxy" --reload-delay 5 --userlist haproxy-dataplaneapi
     no option start-on-reload

启动并验证是否成功

 systemctl restart haproxy
 systemctl status haproxy
 systemctl status haproxy
 ● haproxy.service - HAProxy Load Balancer
    Loaded: loaded (/etc/systemd/system/haproxy.service; disabled; vendor preset: disabled)
    Active: active (running) since Mon 2021-05-10 11:44:31 CST; 1s ago
   Process: 282538 ExecStop=/bin/kill -USR1 $MAINPID (code=exited, status=0/SUCCESS)
   Process: 280321 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
  Main PID: 282541 (haproxy)
     Tasks: 49
    Memory: 40.8M
    CGroup: /system.slice/haproxy.service
            ├─282541 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -Ws
            ├─282543 dataplaneapi --host 0.0.0.0 --port 5555 --haproxy-bin /usr/sbin/haproxy --config-file /etc/haproxy/haproxy.cfg --reload-cmd systemctl reload haproxy --reload-delay 5 --userlist haproxy-dataplaneapi
            └─282544 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -Ws
 May 10 11:44:31 yz-mbg-017160 systemd[1]: Started HAProxy Load Balancer.
 May 10 11:44:32 yz-mbg-017160 haproxy[282541]: time="2021-05-10T11:44:32+08:00" level=info msg="HAProxy Data Plane API v2.2.1 7fb8e05"
 May 10 11:44:32 yz-mbg-017160 haproxy[282541]: time="2021-05-10T11:44:32+08:00" level=info msg="Build from: https://github.com/haproxytech/dataplaneapi.git"
 May 10 11:44:32 yz-mbg-017160 haproxy[282541]: time="2021-05-10T11:44:32+08:00" level=info msg="Build date: 2021-04-07T11:50:45Z"

如果haproxy运行在docker里,需要改reload命令如下

 --reload-cmd "kill -SIGUSR2 1"

动态添加代理配置

dataplaneapi 有一个事物的概念,我们可以基于次模型进行动态haproxy 的操作,以下是一个简单的演示

创建代理的流程

  • 首选创建backend

  • 添加server到backend

  • 创建frontend

  • 添加bind 到frontend

创建事务

curl -X POST --user admin:emar \ -H "Content-Type: application/json" \ http://localhost:5555/v2/services/haproxy/transactions?version=1 {"_version":1,"id":"1d03f37c-67ef-4637-9edd-654d387c67eb","status":"in_progress"}

查看事务

 curl -X GET --user admin:emar \    -H "Content-Type: application/json" \    "http://localhost:5555/v2/services/haproxy/transactions"        {       "_version":1,       "id":"1d03f37c-67ef-4637-9edd-654d387c67eb",       "status":"in_progress"    }

创建backend

http

 curl -X POST --user admin:admin \
    -H "Content-Type: application/json" \
    -d '{"name": "test_backend", "mode":"http", "balance": {"algorithm":"roundrobin"}, "httpchk": {"method": "HEAD", "uri": "/check", "version": "HTTP/1.1"}}' \
    "http://localhost:5555/v2/services/haproxy/configuration/backends?transaction_id=1d03f37c-67ef-4637-9edd-654d387c67eb"
   
 {
    "balance":
       { "algorithm":"roundrobin" },
       "mode":"http",
       "name":"test_backend"
 }  
   

创建backend

tcp

 curl -X POST --user admin:emar \
    -H "Content-Type: application/json" \  
    -d '{"name": "test_backend", "mode":"tcp", "balance": {"algorithm":"leastconn"}}'  \
    "http://localhost:5555/v2/services/haproxy/configuration/backends?transaction_id=1d03f37c-67ef-4637-9edd-654d387c67eb"
 
 {
    "balance":
       { "algorithm":"leastconn" },
       "mode":"tcp",
       "name":"test_backend"
 }

添加后端servers

curl -X POST --user admin:emar \    
-H "Content-Type: application/json" \    
-d '{"name": "server1", "address": "192.168.18.166", "port": 4000, "check": "enabled", "maxconn": 10000, "weight": 10, "inter": 10, "rise": 2, "fall": 3}' \    
"http://localhost:5555/v2/services/haproxy/configuration/servers?backend=test_backend&transaction_id=1d03f37c-67ef-4637-9edd-654d387c67eb"

创建frontends

curl -X POST --user admin:emar \    
-H "Content-Type: application/json" \    
-d '{"name": "test_frontend", "mode": "tcp", "default_backend": "test_backend", "maxconn": 2000}' \    
"http://localhost:5555/v2/services/haproxy/configuration/frontends?transaction_id=1d03f37c-67ef-4637-9edd-654d387c67eb"

创建bind

curl -X POST --user admin:emar \     
-H "Content-Type: application/json" \     
-d '{"name": "tidb-lb", "address": "*", "port": 3390}' \     
"http://localhost:5555/v2/services/haproxy/configuration/binds?frontend=test_frontend&transaction_id=1d03f37c-67ef-4637-9edd-654d387c67eb"

确认配置完成

curl -X PUT --user admin:emar \    
-H "Content-Type: application/json" \    
"http://localhost:5555/v2/services/haproxy/transactions/1d03f37c-67ef-4637-9edd-654d387c67eb" 
  
  {    
  "_version":1,    
  "id":"1d03f37c-67ef-4637-9edd-654d387c67eb",    
  "status":"success" 
  }

修改server

curl -X POST \    
--user admin:emar \    
-H "Content-Type: application/json" \    
-d '{"name": "server2", "address": "192.168.18.164", "port": 4000, "check": "enabled", "maxconn": 30, "weight": 10, "inter": 10, "rise": 2, "fall": 3}' \    
"http://localhost:5555/v2/services/haproxy/configuration/servers?backend=test_backend&version=2"



参考文档

官方安装文档

编译参数说明

Data Plane API 官方文档

Data Plane API git 地址