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"