HAProxy 负载均衡器
一、HAProxy 简介
HAProxy是一个使用C语言编写的自由开源软件,提供高可用性 、负载均衡 以及基于TCP 和HTTP的应用程序代理功能。
特性概述:
- 适用于高负载Web站点,支持会话保持与七层处理
- 单进程事件驱动模型,支持数万并发连接
- 可轻松集成至现有架构,保护后端服务器不直接暴露于网络
- 被GitHub、Bitbucket、Stack Overflow、Reddit、Twitter等知名网站及AWS广泛使用
二、负载均衡类型
层级 | 类型 | 说明 | 常见产品 |
---|---|---|---|
二层 | MAC层负载均衡 | 基于虚拟MAC地址分配至实际MAC地址 | |
三层 | IP层负载均衡 | 基于虚拟IP地址分配至实际IP地址 | |
四层 | TCP层负载均衡 | 基于IP+端口进行转发 | F5、LVS、Nginx、HAProxy |
七层 | HTTP层负载均衡 | 基于URL、IP或主机名进行转发 | HAProxy、Nginx、Apache、MySQL Proxy |
三、HAProxy 安装
1.1、YUM 安装
bash
[root@yyh1 ~]# yum -y install haproxy
1.2、源码安装
1.安装编译环境
bash
[root@yyh1 ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel gcc-c++ zlib-devel lua
2.创建用户
bash
[root@yyh1 ~]# useradd -r -M -s /sbin/nologin haproxy
3.编译安装
bash
[root@yyh1 ~]# tar -xzvf haproxy-2.1.3.tar.gz
[root@yyh1 ~]# cd haproxy-2.1.3/
[root@yyh1 haproxy-2.1.3]# make clean
[root@yyh1 haproxy-2.1.3]# make -j $(grep 'processor' /proc/cpuinfo |wc -l) \
> TARGET=linux-glibc \
> USE_OPENSSL=1 \
> USE_ZLIB=1 \
> USE_PCRE=1 \
> USE_SYSTEMD=1
[root@yyh1 haproxy-2.1.3]# make install PREFIX=/usr/local/haproxy
[root@yyh1 haproxy-2.1.3]# cp haproxy /usr/sbin/
2、设置 Linux 内核参数
bash
[root@yyh1 haproxy-2.1.3]# vim /etc/sysctl.conf
[root@yyh1 haproxy-2.1.3]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
3、配置 haproxy 服务
bash
[root@yyh1 haproxy-2.1.3]# mkdir /etc/haproxy
[root@yyh1 haproxy-2.1.3]# vim /etc/haproxy/haproxy.cfg
内容如下
cfg
global
log 127.0.0.1 local0 info
#log loghost local0 info
maxconn 20480
#chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
#maxconn 4000
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option dontlognull
option httpclose
option httplog
#option forwardfor
option redispatch
balance roundrobin
timeout connect 10s
timeout client 10s
timeout server 10s
timeout check 10s
maxconn 60000
retries 3
#--------------统计页面配置------------------
listen admin_stats
bind 0.0.0.0:8189
stats enable
mode http
log global
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
stats auth admin:admin
#stats hide-version
stats admin if TRUE
stats refresh 30s
#---------------web设置-----------------------
listen webcluster
bind 0.0.0.0:80
mode http
#option httpchk GET /index.html
log global
maxconn 3000
balance roundrobin
cookie SESSION_COOKIE insert indirect nocache
server rs1 192.168.100.20:80 check
server rs2 192.168.100.30:80 check
4、启动 haproxy,配置 haproxy.service 服务单元文件
bash
[root@yyh1 ~]# vim /usr/lib/systemd/system/haproxy.service
bash
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
bash
[root@yyh1 ~]# systemctl daemon-reload
5、配置日志信息
bash
[root@yyh1 ~]# vim /etc/rsyslog.conf

打开UDP和TCP服务

6、重启服务
bash
[root@yyh1 ~]# systemctl restart rsyslog
[root@yyh1 ~]# systemctl enable rsyslog
[root@yyh1 ~]# systemctl restart haproxy
[root@yyh1 ~]# systemctl enable haproxy
7、测试访问并查看日志
发现负载均衡轮询


查看日志
bash
[root@yyh1 ~]# tail -f /var/log/haproxy.log

8、登录 haproxy 监控页面


四、 haproxy.cfg 配置文件详解
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen
1、配置文件结构
global
:全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关defaults
:配置默认参数,这些参数可以被用到frontend,backend,Listen组件frontend
:接收请求的前端虚拟节点,frontend可以指定具体使用后端的backendbackend
:后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器listen
:fronted和backend的组合体,比如haproxy实例状态监控部分配置。Haproxy1.3之前的唯一配置方式
2、时间单位
us
:微秒,即1/1000000秒ms
:毫秒,即1/1000秒s
:秒m
:分钟h
:小时d
:天
3、日志级别对照表
级别 | 代码 | 说明 |
---|---|---|
emerg | 0 | 系统不可用 |
alert | 1 | 需立即处理的事件 |
crit | 2 | 关键事件 |
err | 3 | 错误事件 |
warning | 4 | 警告事件 |
notice | 5 | 普通重要事件 |
info | 6 | 信息事件 |
debug | 7 | 调试信息 |
4、全局配置(global)
cfg
global
log 127.0.0.1 local0 info # 定义haproxy日志输出设置
#log loghost local0 info # 定义haproxy日志级别
maxconn 20480 # 定义最大连接数
#chroot /usr/local/haproxy # chroot运行路径
pidfile /var/run/haproxy.pid # haproxy进程PID文件
#maxconn 4000
user haproxy # 运行haproxy用户,可用uid代替
group haproxy # 运行haproxy用户组,可用gid代替
daemon # 以后台形式运行haproxy
5、默认配置(defaults)
cfg
defaults
mode http # 所处理的类别(7层代理http,4层代理tcp)
log global # 引入global定义的日志格式
option dontlognull # 不记录健康检查日志信息
option httpclose # 每次请求完毕后主动关闭http通道,haproxy不支持keep-alive模式
option httplog # 日志类别为http日志格式
#option forwardfor # 如果后端服务器需要获取客户端的真实ip,需要配置的参数,可以从http header中获取客户端的ip
option redispatch
balance roundrobin # 设置默认负载均衡方式,轮询方式
timeout connect 10s # 默认连接超时时间
timeout client 10s # 默认客户端超时时间
timeout server 10s # 默认服务器超时时间
timeout check 10s # 设置超时检查超时时间
maxconn 60000 # 最大连接数
retries 3 # 3次连接失败就认为服务器不可用,也可以通过后面设置
6、前端虚拟节点配置(frontend)
cfg
frontend http_80_in
bind 0.0.0.0:80 # 设置侦听端口,即haproxy提供的web服务端口,和lvs的vip类似
mode http
log global
option httpclose
option httplog
option forwardfor
default_backend wwwpool # 设置请求默认转发的后端服务池
7、定义后端服务集群配置(backend)
cfg
backend wwwpool # 定义wwwpool服务器组
mode http
option redispath
option abortonclose
balancer source # 负载均衡的方式,源哈希算法
cookie SERVERID # 允许插入serverid到cookie中,serverid后面可以定义
option httpdchk GET /test.html #心跳测试
server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maconn 8
8、页面监控(listen)
cfg
listen admin_stats # frontend和backend的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:8189 # 侦听端口
stats enable # 开启监控
mode http
log global
stats uri /haproxy_stats # 监控页面的url访问路径
stats realm Haproxy\ Statistics # 监控页面的提示信息
stats auth admin:admin # 监控页面的用户和密码
#stats hide-version # 隐藏统计页面上的haproxy版本信息
stats admin if TRUE # 手工启用/禁用,后端服务器haproxy
stats refresh 30s # 每个30秒自动刷新监控页面
五、常用命令与验证
- 检查配置文件语法:
haproxy -f /etc/haproxy/haproxy.cfg -c
- 重新加载配置:
systemctl reload haproxy
- 查看监控页面:
http://<IP>:8189/haproxy_stats