一、HAProxy简介
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。
并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
2、、Session持久机制:
1、session绑定:始终将来自同一个源IP的请求定向至同一个RS;没有容错能力;有损均衡效果;(sh)
2、session复制:在RS之间同步session,每个RS拥有集群中的所有的session;对规模集群不适用;必须RS支持(lblcr)
3、session服务器:利用单独部署的服务器来统一管理集群中的session;(单有单点故障)
3、HAProxy目前主要有两个版本:
1.4——提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
客户端侧的长连接(client-side keep-alive) -----------维持响应和请求
TCP加速(TCP speedups)
响应池(response buffering)
RDP协议 ------------------------------------远程桌面协议
基于源的粘性(source-based stickiness)-------------------同一个IP发往同一个上游server
更好的统计数据接口(a much better stats interfaces)
更详细的健康状态检测机制(more verbose health checks)
基于流量的健康评估机制(traffic-based health)
支持HTTP认证
服务器管理命令行接口(server management from the CLI)
基于ACL的持久性(ACL-based persistence) -------------用户的请求作分类发往不同的服务器组
日志分析器
4、若要获得最高性能:
若要获得最高性能,需要在Linux 2.6或打了epoll补丁的Linux 2.4上运行haproxy 1.2.5以上的版本。
haproxy 1.1l默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。
1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。
HAProxy 1.3在Linux 2.6及打了epoll补丁的Linux 2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。
5、在较新版本的Linux 2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,这甚至可以达到10Gbps的性能。
6、性能
HAProxy借助于OS上几种常见的技术来实现性能的最大化
1、 单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
2、O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
3、在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
4、借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
5、内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
6、树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
7、优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
8、精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
总结:
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。
因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。
实例:配置haproxy-nginxWEB服务的负载均衡:
haproxy-vm1: eth0 172.16.3.2/16
eth1 192.168.1.2/24
web1-vm2: eth0 192.168.1.1/24
web2-vm3: eth0 192.168.1.10/24
本机当作测试机:172.16.3.100/16
一、haproxy-vm1
环境:
# ifconfig eth0 172.16.3.2/16 up
# ifconfig eth1 192.168.1.2/24 up
# yum install haproxy
1、配置日志文件
# cat /etc/haproxy/haproxy.cfg 中定义日志文件的描述信息
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2 这段定义 ,是把日志发往那里;要想使用这个定义就需要在/etc/sysconfig/syslog 配置文件中,添加(# local2.* /var/log/haproxy.log)这项
# vim /etc/rsyslog.conf
$ModLoad imtcp 把注释去掉即可 (这已经是去掉注释的)
$InputTCPServerRun 514
local2.* /var/log/haproxy.log(这项需要添加,为什么添加上面有说明)
# service rsyslog restart 配置完成重启下
# ss -tnl 查看下514端口是否监听
2、配置主配置功能
# vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
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
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
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
frontend main *:80 设置监听IP和端口为 监听所有IP和端口为80
default_backend webservers 定义后端服务器组名称为 webservers
backend webservers 定义后端服务器组内容
balance roundrobin 指定为轮训方式为roundrobin
server s1 192.168.1.1:80 指定backend-server:名称为s1 IP为192.168.1.1 端口为80
server s2 192.168.1.10:80 指定backend-server:名称为s1 IP为192.168.1.10 端口为80
或者把上面的frontend和backend合写为:
listen main *:80
balance roundrobin
server s1 192.168.1.1:80
server s2 192.168.1.10:80
二、web-vm2 192.168.1.1
# ifconfig eth0 192.168.1.1/24 up
# yum install nginx
# echo "192.168.1.1" > /usr/share/nginx/html/index.html
三、web-vm2 192.168.1.10
# ifconfig eth0 192.168.1.10/24 up
# yum install nginx
# echo "192.168.1.10" > /usr/share/nginx/html/index.html
四、检测:
http://172.16.3.2 (有图有真相)
HAproxy动静分离所有机制
基于上面的基础负载均衡环境做的web-server动静分裂:
web1-vm2
# yum install php
其他不需要添加任何配置(提供个php测试页面即可!)
haproxy的主配置文件详解:
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
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
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
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 除了127.0.0.0/8网络,所有的主机需要记录客户端主机
option redispatch 开启再次绑定功能
retries 3
timeout http-request 10s 请求backend-server时长
timeout queue 1m 排队等待时长
timeout connect 10s 超出连接时长
timeout client 1m frontend-server时长
timeout server 1m backend-server时长
timeout http-keep-alive 10s 会话保持时长
timeout check 10s 检查超时时长
maxconn 3000 最大并发连接
frontend main 定义客户端请求定义设置
bind :80 监听端口
bind :8088
acl clear dst_port 8088 定义访问8088端口定义
#acl login path_beg /login 定义直接转发的条件
#redirect location http://www.baidu.com if login 符合条件的转发位置
#redirect prefix / if clear 符合访问端口的转发位置也可以写成“http://172.16.3.2”
reqadd X-Proto:\ SSL if clear 符合访问端口的请求首部的尾部添加的内容“SSL”
rspadd X-Via:\ haproxy if clear 符合访问端口的响应首部的尾部的添加内容“haproxy”
option forwardfor except 127.0.0.0/8 记录除了127.0.0.0/8网段的,源客户端IP地址得记录
acl url_static path_beg -i /images /stylesheets /vedios /javascript 指定静态分离的条件
acl url_static path_end -i .jpg .html .css .js .png .gif 指定静态分离的条件
use_backend static if url_static 定义符合定义条件分配的backend-server
default_backend webservers 默认 backend-server
backend static
balance roundrobin
server s1 192.168.1.10:80 check port 80 指定 backend-server信息,和检测机制
server b1 127.0.0.1:8080 backup check port 8080 指定备用backend-server地址信息
backend webservers
balance roundrobin
server s2 192.168.1.1:80 check port 80 指定默认backend-server信息
server b1 127.0.0.1:8080 backup check port 8080 指定备用backend-server地址信息
stats enable 开启状态管理接口
stats hide-version 隐藏版本信息
stats uri /haha?stats URL路径的信息
stats scope . 所在区域位置
stats realm HAPorx\ boy 验证提示信息
stats auth admin1:admin 验证用户和密码
stats admin if TRUE 验证通过运行状态管理
测试图片
动态访问图
静态访问图