HAProxy部署

一、下载

1.1 官网

http://www.haproxy.org/

二、部署

2.1 安装依赖

#centos 7
yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget

#ubuntu 20.04
apt install make iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip libreadline-dev libsystemd-dev

apt install lua5.3
#直接安装lua

2.2 安装lua

http://www.lua.org/home.html

解压后进入lua源码目录

make all test
#执行安装命令

#进入源码下的src目录
./lua -v
#查看lua版本 

[root@localhost src]# ./lua -v
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
#lua安装完成

2.2 编译安装

tar xf haproxy-2.6.6.tar.gz
#解压源码包

cd haproxy-2.6.6/
#进入部署目录

#编译参数
make -j $(nproc) ARCH=x86_64 TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINIT=1 LUA_INC=/apps/lua/src/ LUA_LIB=/apps/lua/src/ PREFIX=/apps/haproxy
#编译选项的详细信息可以查看INSTALL文件

make install PREFIX=/apps/haproxy
#安装

mkdir /apps/haproxy/{etc,run}
#建立配置文件目录

haproxy.service

cat << EOF > /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/apps/haproxy/sbin/haproxy -f /apps/haproxy/etc/haproxy.cfg
-c -q
ExecStart=/apps/haproxy/sbin/haproxy -Ws -f /apps/haproxy/etc/haproxy.cfg -p /apps/haproxy/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload

三、配置

3.1 配置文件

#启动时加载的配置文件在haproxy.service文件中指定的
#默认的配置文件路径为:/etc/haproxy下,本文中修改为/apps/haproxy/etc/
#在examples目录下可以使用配置文件模板

3.2 常用配置详解

haproxy.cfg

3.2.1 创建配置文件

mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg

3.2.2 配置文件用法

global
#全局设置
  maxconn 100000
  #最大连接数
  chroot /apps/haproxy
  #牢笼机制
  stats socket /apps/haproxy/run/haproxy.sock mode 600 level admin
  #socket文件配置

uid 99
#user nobody
#指定运行用户

gid 99
#group nobody
#指定运行组

daemon
#以守护进程方式运行

#nbproc 2
#线程数,与CPU保持一致

#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
#设置线程=>CPU亲和

pidfile /apps/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info

defaults
#默认设置
  option redispatch
  #当后端不可用时,请求转发到健康的后端。
  option http-keep-alive
  #开启与客户端的会话保持。
  option forwardfor
  #透传客户端地址给后端服务器。
  maxconn 100000
  #最大连接数,此处的优先级高于global。
  mode http
  #默认工作方式
  timeout http-keep-alive 120s
  #会话保持时间。
  timeout connect 600s
  #haproxy与后端服务器的连接超时时间,建立tcp之前。
  timeout server 600s
  #haproxy与后端服务器的连接超时时间,建立tcp之后。
  timeout client 600s
  #haproxy与客户端最长的非活动时间。
  timeout check 3s
  #对后端服务器的检测超时时间。

listen stats
#监听名称
  mode http
  #工作模式
  bind 0.0.0.0:9999
  #绑定ip和端口
  stats enable
  #启用状态
  log global
  #日志级别
  stats uri /haproxy-status
  #状态页uri
  stats auth admin:123456
  #状态页登陆账号:密码

listen web_port
#监听名称
  bind 192.168.3.65:80
  #绑定IP地址:端口
  mode http
  #工作模式
  log global
  #日志级别
  option forwardfor
  #客户端地址透传
  balance roundrobin
  #指定调度算法
  server web1 192.168.3.60:80 check inter 3s fall 2 rise 5 weight 1 maxconn 500
  #后端服务器web1
  server web2 192.168.3.61:80 check inter 3s fall 2 rise 5 weight 2 maxconn 500
  #后端服务器web2
  #redirect prefix https://ywngo.com
  #重定向到目标地址

#frontend museum-webserver-80
#  bind 192.168.3.65:80
#  绑定IP地址:端口
#  mode http
#  工作模式
#  use_backend museum-webshost-80
#  关联到指定的backend

#backend museum-webshost-80
#  server web1 192.168.3.60:80 check inter 3s fall 3 rise 5
#  server web2 192.168.3.61:80 check inter 3s fall 3 rise 5

3.2.3 简单配置文件范例

global
    maxconn 100000
    chroot /apps/haproxy
    stats socket /apps/haproxy/run/haproxy.sock mode 600 level admin
    uid 99
    gid 99
    daemon
    pidfile /apps/haproxy/run/haproxy.pid
    log 127.0.0.1 local3 info

defaults
#默认设置
    option redispatch
    #当后端不可用时,请求转发到健康的后端。
    option http-keep-alive
    #开启与客户端的会话保持。
    option forwardfor
    #透传客户端地址给后端服务器。
    maxconn 100000
    #最大连接数,此处的优先级高于global。
    mode http
    #默认工作方式
    timeout http-keep-alive 120s
    #会话保持时间。
    timeout connect 600s
    #haproxy与后端服务器的连接超时时间,建立tcp之前。
    timeout server 600s
    #haproxy与后端服务器的连接超时时间,建立tcp之后。
    timeout client 600s
    #haproxy与客户端最长的非活动时间。
    timeout check 3s
    #对后端服务器的检测超时时间。

listen stats
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri /haproxy-status
    stats auth admin:123456
#系统状态页面


listen k8s-apiserver
    bind 192.168.3.38:6443
    #绑定IP地址:端口
    mode tcp
    #工作模式
    log global
    #日志级别
    option forwardfor
    #客户端地址透传
    balance roundrobin
    #指定调度算法
    server k8s-m1 192.168.3.31:6443 check inter 3s fall 3 rise 5 weight 1
#    server k8s-m2 192.168.3.32:6443 check inter 3s fall 3 rise 5 weight 1 maxconn 500
#    server k8s-m3 192.168.3.33:6443 check inter 3s fall 3 rise 5 weight 1 maxconn 500

3.2.4 监听keepalived VIP

net.ipv4.ip_nonlocal_bind=1
#监听绑定在不存在的IP地址上,Linux系统内核参数。

haproxy调度算法

默认情况下是轮询。

1.1 静态算法

无法实时修改权重,必须重启haproxy。

#动态方式修改权重

yum install socat
#安装socat

echo "help" | socat stdio /apps/haproxy/run/haproxy.sock
#将help传给haproxy.sock 查看可用指令

echo "show info" | socat stdio /apps/haproxy/run/haproxy.sock
#查看haproxy运行状态

echo "get weight web-app1/web1 2" | socat stdio /apps/haproxy/run/haproxy.sock
#获取web-app1的后端服务器web1的权重

echo "set weight web-app1/web1 2" | socat stdio /apps/haproxy/run/haproxy.sock
#将web-app1的后端服务器web1的权重修改为2

echo "disable server web-app1/web1 2" | socat stdio /apps/haproxy/run/haproxy.sock
echo "enable server web-app1/web1 2" | socat stdio /apps/haproxy/run/haproxy.sock
#关闭/打开web-app1的后端服务器web1。
1.1.1 static-rr 静态轮询

静态轮询,无法动态调整权重值。因为轮询各后端的服务器都是相等的(或者某台后端服务器的权重是0,即不进行转发)。

1.2.2 first

根据配置文件中的顺序进行转发。第一个服务器占完之后,才会将请求发给第二位的服务器。基本上不会使用。

1.2 动态算法

可以动态调整,将请求转发到较低负载的后端服务器上。且可以动态调整权重。

1.2.1 roundrobin(haproxy默认调度算法)

基于权重的轮询动态调度算法,支持权重的运行时调整。支持慢启动(对于新添加的后端服务器,负载缓慢增加,避免刚启动的服务接受太多连接。)每个后端backend中支持最多4095个real server。

1.2.2 leastconn

当前后端服务器中连接最少的优先调度。比较适合长连接使用,如mysql等。

1.2.3 hdr

对header请求中指定信息做hash。若值无效,则使用默认的轮询调度。

配置范例

balance hdr(User-Agent)
#取请求头中的user-agent进行hash
hash-type consistent
1.2.4 rdp-cookie

可以实现对windows远程桌面负载,如果后端有多个windows 服务器,rdp-cookie可以实现同一个请求始终被转发给同一个后端服务器。如果此前从未访问,第一次连接时使用roundrobin算法计算出一个后端服务器进行转发。

配置范例

listen RDP
  bind 192.168.1.1:3389
  mode tcp
  balance rdp-cookie
  persist rdp-cookie
  tcp-request inspect-delay 5s
  tcp-request content accept if RDP_COOKIE
  server win-server1 192.168.1.2:3389 check fall 3 raise 5 inter 2s weight 1 
1.2.4 random

1.9版本后增加random算法,基于一个随机值作为一致性hash的key,随机负载平衡对于大型服务器场合或经常添加或删除服务器非常有用。

balance random

1.3 算法总结

static rr    =>    tcp/http    静态
frist        =>    tcp/http    静态

roundrobin    =>    tcp/http    动态
leastconn    =>    tcp/http    动态
random        =>    tcp/http    动态

source        =>    tcp/http
uri            =>    http
url_param    =>    http    取决于hash_type是否consistent
hdr            =>    http
rdp-cookie    =>    tcp

1.4 算法应用场景

frist    =>    #使用较少

static-rr    =>    #做了session共享的web集群
rounderobin    =>
random    =>

leastsonn =>    #数据库
source =>    #基于客户端公网IP的会话保持

uri    =>http    #缓存服务器,CDN服务器
url_param    =>http

hdr    =>    #基于客户端请求报文头部做下一步处理

rdp-cookie    =>    #很少使用

标签: none

添加新评论