标签:Haproxy
HAProxy的概述:HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
配置文件: /etc/haproxy/haproxy.cfg #yum安装haproxy的主配置文件
代理配置段:分四个区段: defaults、frontend、listen、backend;
defaults name 用于为listen/frontend/backend提供默认值,其name是可选参数,只是为了更好的阅读。
listen name 通过关联前后端定义一个完整的代理服务器
frontend name 定义监听的套接字,用于接收客户端请求并与之连接
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
maxconn conns
设定一个前端的最大并发连接数,因此其不能用于backend区段。对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。
如果为conns指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值方为明智决定。其默认为2000。
log address facility [level [ minlevel ]]
为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数,不过,如果使用了“log global”且"global"段已经定了两个log参数时,多余了log参数将被忽略。
global:当前实例的日志系统参数同"global"段中的定义时,将使用此格式;每个实例仅能定义一次“log global”语句,且其没有任何额外参数;
address:定义日志发往的位置,其格式之一可以为IPv4_address:PORT,其中的port为UDP协议端口,默认为514;格式之二为Unix套接字文件路径,但需要留心chroot应用及用户的读写权限;
facility:可以为syslog系统的标准facility之一;
defaults
mode http #默认的模式mode{tcp|http|health},health只会返回OK
#retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #心跳检测超时
log 127.0.0.1 local0 err #[err warning info debug]
balance roundrobin #负载均衡算法
option httplog #日志类别,采用httplog
option httpclose #每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现
option dontlognull
option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
mode { tcp|http|health } 设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。
tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用;
http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝;
listen stats
bind 0.0.0.0:8888 #监听端口
option httplog #采用http日志格式
stats enable #开启stats统计页面
stats uri / #统计页面访问的前缀,后通常要加上?stats
stats realm "Haproxy Auth" #开启认证功能
stats auth admin:admin #认证时的账号和密码
stats admin if TRUE #在制定条件下开启admin功能
stats refresh 3s #统计页面自动刷新时间间隔
stats show-desc demo #统计页面显示的相关描述信息
stats hide-version #隐藏haproxy的版本号
bind 绑定监听地址
语法:bind [address]:port_range [, ...] interface interface
此指令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字。
frontend main *:80
default_backend apache_groups
use_backend: 调用指定的后端主机(定义在frontend和listen中);
语法: use_backend backend [{if | unless} condition]
condition 条件多为acl的名称
backend apache_groups
balance roundrobin
cookie SERVERID insert indirect
server slave2 192.168.1.3:80 check inter 1s rise 2 fall 3 cookie A maxconn 1000
server slave3 192.168.1.4:80 check inter 1s rise 2 fall 3 cookie B maxconn 1000
语法:balance algorithm [ arguments ]
algorithm用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。
支持的算法有:
roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;
static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;
leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
语法: server name address [param ]
name:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了"http-send-server-name",它还将被添加至发往此服务器的请求首部中;
address:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地
址;
disabled:此服务器禁用;
backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;
check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定。
inter delay: 设定监控状态检查的时间间隔,单位为毫秒,默认为2000,也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟
rise count:设定检查状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数
fall count:设定检查状态检查中,某server从正常状态转换至离线状态需要成功检查的次数
cookie value:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;
maxconn maxconn:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;
maxqueue maxqueue:设定请求队列的最大长度;0表示无上限;
weight weight:权重,默认为1,最大值为256,0表示不参与负载均衡;
[root@Haproxy ~]# yum install -y haproxy #直接使用RPM来安装
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg #haproxy的主配置文件
listen proxytofirehose :443
mode tcp
balance roundrobin
stick-table type ip size 200k expire 30m
stick on src
server firehose 192.168.122.2:443 check
curl -x 192.168.122.172:80 www.wo.com.cn 此命令使用192.168.122.172:80这个代理服务器IP和端口访问站点www.wo.com.cn参数说明 -x 设置代理,格式为host[:port],port的缺省值为1080
wget -Y on -e "http_proxy=http://192.168.122.172:9201" "www.wo.com.cn" 此命令使用192.168.122.172:9201这个代理服务器IP和端口访问站点www.wo.com.cn 参数说明 -Y 是否使用代理 -e 执行命令
标签:Haproxy
原文地址:http://blog.51cto.com/13581826/2107860