一、概述
HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上(CentOS、Ubuntu、Debian、OpenSUSE、Fedora、麒麟、欧拉、UOS)。
HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy具备媲美商用负载均衡器的性能和稳定性。
核心功能
负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法
健康检查:支持TCP和HTTP两种健康检查模式
会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
HTTP请求重写与重定向
监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态
关键特性
采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。
大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。
HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。
HAProxy作者在8年前(2009)年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。
应用场景
高并发要求较高的场合下
二、安装
一、环境内核配置
可有可无(vim /etc/sysctl.conf)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65023
net.ipv4.tcp_max_syn_backlog = 10240
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 10000
二、编译安装
wget https://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
cd /haproxy-1.7.2/
make PREFIX=/usr/local/haproxy TARGET=linux2628
make install PREFIX=/usr/local/haproxy
三、建立配置文件
从haproxy的源码包中的examples下的init.haproxy中获得配置文件的路“/etc/haproxy/haproxy.cfg”
mkdir /etc/haproxy
touch /etc/haproxy/haproxy.cfg
添加系统服务
vim /etc/init.d/haproxy
chmod +x /etc/init.d/haproxyd
chkconfig --add /etc/init.d/haproxy添加3和5运行级别下自启动
chkconfig haproxy --level 35 on
chkconfig --list
配置文件
三、 启动haproxy
service haproxy start
service haproxy stop
service haproxy restart | reload
systemctl daemon-reload也可以使用systemctl 启动
配置web
安装epel-release yum install -y epel-release
安装nginx yum install -y nginx
修改配置文件 并启动 echo nginx1 > /usr/share/nginx/html/index.html (web1)
echo nginx2 > /usr/share/nginx/html/index.html (web1)
systemctl start nginx
四、调度算法
roundrobin:表示简单的轮询。
static-rr:表示根据权重。
leastconn:表示最少连接者先处理。
source:表示根据请求的源 IP,类似 Nginx 的 IP_hash 机制。
ri:表示根据请求的 URI。
rl_param:表示根据 HTTP 请求头来锁定每一次 HTTP 请求。
rdp-cookie(name):表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。
五、负载均衡
一、七层负载
配置负载
global
daemon
maxconn 256
pidfile /var/run/haproxy/haproxy.pid
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:8080
default_backend servers
backend servers
server server1 127.0.0.1:8000 maxconn 32
server server2 127.0.0.1:8090 maxconn 32
配置监控页面
listen stats #定义监控页面
bind *:1080 #绑定端口1080
stats refresh 30s #每30秒更新监控数据
stats uri /stats #访问监控页面的uri
stats realm HAProxy\ Stats #监控页面的认证提示
stats auth admin:admin #监控页面的用户名和密码
二、四层负载
配置负载
global
daemon
maxconn 256
pidfile /var/run/haproxy/haproxy.pid
defaults
mode tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:8080
default_backend servers
backend servers
balance roundrobin #轮询
#balance source #保持会话
server server1 127.0.0.1:8000 maxconn 32
server server2 127.0.0.1:8090 maxconn 32
六、keepalived+haproxy高可用
haproxy配置
(需要两台haproxy 配置内容一致)
global
daemon
maxconn 256
pidfile /var/run/haproxy/haproxy.pid
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend servers
backend servers
server server1 192.168.115.128:80 maxconn 32
server server2 192.168.115.131:80 maxconn 32
配置keepalived
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
script "killall -0 haproxy" #使用killall -0检查haproxy实例是否存在,性能高于ps命令
interval 2 #脚本运行周期
weight 2 #每次检查的加权权重值
}vrrp_instance HA_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.115.200
}
track_script {
chk_haproxy #对应的健康检查配置
}
}
测试
虚拟ip监控页面