haproxy是一款非常的专业的全7层的反向代理负载均衡器,采用的是epoll机制,可以实现4层和7层的负载均衡,4层使用的是tcp模式可以模拟lvs,7层使用的是http模式可以模拟nginx,nginx和haproxy的处理速度都远不及lvs,因为他们是工作在用户空间的,而lvs是工作在内核空间的
- 性能特性?
-
单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
-
事件检查器(eventchecker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
-
在任何可用的情况下,单缓冲(singlebuffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
-
MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
- 可以实现:
- 反向代理
- 基于cookie会话绑定
- 网页动静分离
- haproxy与各负载均衡器的区别?
- 与nginx:同样工作在用户空间,nginx是一款轻量级,能实现缓存、webserver、邮件、负载均衡等功能,但nginx的许多功能都需要第三方的模块,而haproxy的转发能力比nginx有更强更灵活的定制性,可以运用splice实现0复制的转发,并且有更直观的图形化管理界面,不过通用性不如nginx,并无缓存功能
- 与varnish:varnish是一款web缓存系统,
- 与lvs:lvs是工作在内核空间上直接转发的,无缓存功能
- 衡量一个负载均衡器的性能:
- 会话率,会话接收的速率,类似于并发数QPS,每秒的NEW状态的查询请求数,可以通过http的header来标记,实时有效并发,最能体现负载均衡性能的最主要的指标,通常预期应该至少在10倍以上的并发能力
- 会话并发能力,类似活动连接数,即ESTABLISHED状态的会话,由于使用了keep-alive保持连接数以及链接复用等机制,因此活动连接数通常是并发数的很多倍,1:20
- 数据处理速度,减去与客户端,与服务端建立连接和传输的时间,中间那部分时间的数据处理的速度
- 调度算法
- roundrobin 动态,加权轮询,所谓动态就是可以实时生效,不用重启服务,但是连接数受限,最多支持4128
- static-rr 静态轮询,需重启服务
- leastconn 动态,根据后端主机的负载数量进行调度
- source 类似源地址hash,可以指定hash-type ,有map-based(取膜法,静态), consistent(一致性哈希,动态)
- uri 类似于DH算法,目标地址哈希,可以指定hash-type ,有map-based(取膜法,静态), consistent(一致性哈希,动态)
- hdr(<name>):根据请求报文中指定的header(User-agent,referer,hostname,cookie)进行调度,把指定的header的值做hash计算;可根据header首部来进行调度,非常强大,比如根据User-Agent浏览器类型来进行调度,可以指定hash-type ,有map-based(取膜法,静态), consistent(一致性哈希,动态)
bind *:8080
mode http
default_backend websv1
backend websv1
balance roundrobin
server web1 172.16.52.59:80 check
server web2 172.16.52.60:80 check
mode http
default_backend websv1
backend websv1
balance uri
hash-type consistent
server web1 172.16.52.59:80 check
server web2 172.16.52.60:80 check
mode http
default_backend websv1
backend websv1
balance hdr(User-Agent)
hash-type consistent
server web1 172.16.52.59:80 check
server web2 172.16.52.60:80 check
bind *:8080
mode http
default_backend websv1
backend websv1
balance roundrobin
server web1 172.16.52.59:80 check weight 1 cookie web1
server web2 172.16.52.60:80 check weight 3 cookie web2
cookie COOKIEID insert nocache indirect
mode http
default_backend websv1
backend websv1
balance roundrobin
server web1 172.16.52.59:80 check weight 1 cookie web1
server web2 172.16.52.60:80 check weight 3 cookie web2
cookie COOKIEID prefix nocache indirect
listen status
bind *:8081
stats enable
bind *:8080
mode http
default_backend websv1
backend websv1
balance roundrobin
server web1 172.16.52.59:80 check weight 1 cookie web1
server web2 172.16.52.60:80 check weight 3 cookie web2
cookie COOKIEID prefix nocache indirect
listen status
bind *:8081
stats enable
stats uri /hastatus
stats realm "Sensitive Information"
stats auth boom:boom
stats auth map:map
stats admin if TRUE
stats scope . //指明作用域为当前范围,貌似开了不太靠谱,只能显示总的数量,不是很直观,不太习惯
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
bind *:8080
mode http
rspadd Via:\ 172.16.52.58
default_backend websv1
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
# log 127.0.0.1 local2
log 127.0.0.1 local2
/*实现日志存储功能,vim /etc/sysconfig/rsyslog , 里面的选项貌似不加-r 也是可以的,
SYSLOGD_OPTIONS="-r"
*/
/* 但是vim /etc/rsyslog.conf里面必须要开启
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
local2.* /var/log/haproxy.log
配置完成后重启haproxy和rsyslog服务可以查看/var/log/haproxy.log
systemctl restart rsyslog.service
systemctl restart haproxy.service
*/
chroot /var/lib/haproxy
///创建虚拟目录,可以提高安全性,工作在假根目录,即是受到攻击,但也不会危害到系统,可以提升系统的安全级别
pidfile /var/run/haproxy.pid
///套接字文件,haproxy工作过程要建立4个套接字,即与接受client端的一次请求和返回,与后端server端发起一次请求和被返回
maxconn 4000
user haproxy
group haproxy
daemon
///守护进程
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
///工作模式有
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
mode http
bind *:1080
stats enable
stats hide-version
stats uri /haproxyadmin
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend http-in
bind *:80
log global
option httpclose
option logasap
option dontlognull
capture request header Host len 20
capture request header Referer len 60
default_backend servers
backend servers
balance roundrobin
server web1 172.16.52.59:80 check maxconn 4000
server web2 172.16.52.60:80 check maxconn 3000
option httpclose
option httpclose
option httpclose
frontend mysql
bind *:3306
mode tcp
log global
default_backend mysqlservers
backend mysqlservers
balance leastconn
server mysql1 172.16.52.59:3306 inter 2 rise 1 fall 2 maxconn 300
///inter是指健康状态检查的时间间隔为2s,rise是指从updown到ok状态检查的次数,而fall则是从ok到down状态的检查次数
server mysql2 172.16.52.59:3306 inter 2 rise 1 fall 2 maxconn 300
- 访问:http://172.16.52.58:1080/haproxyadmin
- 使用zaibbix监控haproxy http://blog.csdn.net/hanzheng260561728/article/details/52819253
cd socat-1.7.3.0
./configure
make
make install
which socat
stats socket /var/lib/haproxy/stats