标签:haproxy
一、Haproxy的简介
Haproxy的官网站点:http://haproxy.com/ 工作需要的话要多看看官方文档.
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
二、Haproxy的工作特性
HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。htproxy只是http协议的反向代理,但支持tcp层对基于tcp的应用层协议做LB;
代理的作用:访问控制、web缓存(请求内容的加速效果)、反向代理、内容路由(根据流量及内容类型等条件将请求转发至特定的服务器).
缓存的作用:(缓存首先是代理) 减少冗余内容的传输:节省带宽、缓解网络瓶颈;降低了对原始服务器的请求响应压力;降低了传输延迟;
Haproxy 的独门武器ebtree (数据结构,弹性二叉树).
三、Haproxy的版本介绍
HAProxy目前主要有这样几个版本:
1.4——提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
客户端侧的长连接(client-side keep-alive)
TCP加速(TCP speedups)
响应池(response buffering)
RDP协议(Remote Desktop Protocol)
基于源的粘性(source-based stickiness)
更好的统计数据接口(a much better stats interfaces)
更详细的健康状态检测机制(more verbose health checks)
基于流量的健康评估机制(traffic-based health)
支持HTTP认证
服务器管理命令行接口(server management from the CLI)
基于ACL的持久性(ACL-based persistence)
日志分析器
1.3——内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。
内容交换(content switching):基于任何请求标准挑选服务器池;
ACL:编写内容交换规则;
负载均衡算法(load-balancing algorithms):更多的算法支持;
内容探测(content inspection):阻止非授权协议;
透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;
内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;
分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;
快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;
会话速率限制(session rate limiting):适用于托管环境;
最新版本的haproxy 1.5.x 大范围更新,大量新特性引入:
三、Haproxy的安装和配置说明
CentOS 6.6系统集成了1.5.2版本的haproxy。
1) 安装haproxy
# yum install -y haproxy
# rpm -ql haproxy
主配置文件:
/etc/haproxy/haproxy.cfg
2) haproxy 的配置文件介绍
# vim /etc/haproxy/haproxy.cfg
global # 全局配置文件,配置中的参数为进程级别的参数,且通常与其运行的OS相关;
log 127.0.0.1 local2 # 日志配置,所有的日志都记录本地,通过local2输出
chroot /var/lib/haproxy # 改变haproxy的工作目录
pidfile /var/run/haproxy.pid # 指定pid文件的路径
maxconn 4000 # 最大连接数的设定
user haproxy # 指定运行服务的用户
group haproxy # 指定运行服务的用户组
#---------------------------------------------------------------------
# common defaults that all the ‘listen‘ and ‘backend‘ sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http # 默认使用协议,可以为{http|tcp|health} http:是七层协议 tcp:是四层 health:只返回OK
log global # 全局日志记录
option httplog # 详细记录http日志
option dontlognull # 不记录空日志
option http-server-close # 启用http-server-close
option forwardfor except 127.0.0.0/8 # 来自这些信息的都不forwardfor
option redispatch # 重新分发,ServerID对应的服务器宕机后,强制定向到其他运行正常的服务器
retries 3 # 3次连接失败则认为服务不可用
timeout http-request 10s # 默认http请求超时时间
timeout queue 1m # 默认队列超时时间
timeout connect 10s # 默认连接超时时间
timeout client 1m # 默认客户端超时时间
timeout server 1m # 默认服务器超时时间
timeout http-keep-alive 10s # 默认持久连接超时时间
timeout check 10s # 默认检查时间间隔
maxconn 3000 # 最大连接数
frontend:用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
Backend:用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
balance roundrobin #定义算法;基于权重进行轮询
listen: 通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。
default:用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
2.1)
balance: 指明调度算法;算法可分为动态(权重可动态调整)和静态两类(调整权重不会实时生效)两类;
roundrobin: 轮询(实现的是加权轮询),动态算法.
statuc-rr:基于权重进行轮询,但是为,静态算法. 在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;
leastconn:最少连接,适用于有着较长会话的协议,动态算法; 在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;
source: 将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;受权重总数的变化影响。
hash-type: map-based: 静态;
consistent: 动态;
uri: 也是会受hash-type的影响,强烈建议在使用hash-type的使用用consistent;适用于后端服务器是缓存服务器的场景;以提高其命中率的;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性。
3) 配置Haproxy的日志文件
定义日志功能:
# vim /etc/haproxy/haproxy.cfg
启动日志功能:
log127.0.0.1 local2
完成下面动作日志功能才能生效;
# vim /etc/rsylog.conf
local7.*/var/log/boot.log
下面添加:
local2.*/var/log/haproxy.log
还要启用服务监听功能;
# Provides UDP syslog reception
启用下面两项:
$ModLoad imudp
$UDPServerRun 514
# service rsyslog reload
# service rsyslog restart
四、Haproxy负载均衡web
1) 配置示例:
Haproxy 的服务地址: 172.16.8.100
配置2个后端的web服务器:
NODE2: 172.16.8.101
# vim /var/www/html/index.html
<h1>node1 Page</h1>
# service httpd start
NODE3: 172.16.8.102
# vim /var/www/html/index.html
<h1>node2 blue.com</h1>
# service httpd start
要确保上面2个web页面能够正常被访问:
# curl http://172.16.8.101
# curl http://172.16.8.102
haproxy服务器添加代理功能:
# vim /etc/haproxy/haproxy.cfg
修改为:
frontend main *:80
其他都注释:
添加:
default_backendappsrvs 定义的名称;
backend appsrvs后端这里要与上面定义的名字保持一致;
blanceroundrobin指明调度算法;
serverweb1 172.16.8.101:80 check
serverweb2 172.16.8.102:80 check
上面就相当于我们已经定义了一个(Nginx的)server;
2) 启动Haproxy 服务:
# service haproxy start
3) 在浏览器中进行验证:
五、Haproxy的状态监控
1、Haproxy的监控页面
# vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static if url_static
#default_backend app
default_backend appserver
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend appserver
balance roundrobin
option httpchk
cookie SERVERID insert indirect nocache
server web1 172.16.8.101:80 check inter 2 rise 1 fall 3 cookie web1
server web2 172.16.8.102:80 check inter 2 rise 1 fall 3 cookie web2
stats enable # 开启Haproxy统计状态
stats hide-version # 隐藏代理服务器版本信息
stats uri /haproxyadmin?Stats # 访问的url
stats realm Haproxy\ Statistics # 统计页面认证时提示内容信息
stats auth admin:admin # 设置登录用户和密码
stats admin if TRUE # 如果认证通过,则就可以打开stats管理功能
访问:http://172.16.8.100/haproxyadmin?stats
如果其中一个服务停止了则显示:
六、Haproxy的动静分离(使用ACL进行定义)
# vim /etc/haproxy/haproxy.cfg
frontend main
bind *:80
bind *:8080
acl url_staticpath_beg-i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend staticif url_static
default_backendappsrvs
-----------------------------------------------------
| static backend for serving up images, stylesheets and such
----------------------------------------------------
backend static ↑的名字保持一致;如果是以上acl中定义的内容就分配到下面2台服务器;
balance roundrobin
server static1172.16.8.201 check
server static2172.16.8.202 check
backend appsrvs其他的全部都交给appsrvs 中的定义的服务器;
balance roundrobin
option forwardfor except 127.0.0.1 header X-Forwarded-For
# 允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。
option httpchk# 指明检测的方式;
cookie SERVERID insert indirect nocache # 基于cookie 的粘性;
# 添加cookie 信息,SERVERID 是自己随便添加的名字,insert是内插机制,indirect nocache 重定向后不写入缓存中;
serverweb1 172.16.8.101:80check cookie web1 # 定义cookie显示的信息;
serverweb2 172.16.8.102:80check cookie web2
只要不是 .jpg .gif .png .css .js 结尾的页面! 都会使用 default_backendappsrvs 后端的主机;
进入网页的调试界面,会有Cookie 的显示信息;
-----------------------------------------------
注释:bind:指明监听的地址和端口;此命令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字;
--------------------------------------------------------------------
七、Haproxy的ACL
ACL:haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性,其配置法则通常分为两步;
首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或或转发至某特定的后端,定义ACL的语法格式如下:
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>: ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号) 和:(冒号)haproxy中,ACL可以重名,这可以把多个测试条件定义为一个共同的acl;
<criterion>: 测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];
[flags]: 目前haproxy 的ACL支持的标志位有3个;
-i:不区分<value>中的模式字符的大小写;
-f: 从指定的文件中加载模式;
--: 标志符的强制结束标记,在模式中的字符串像标记符时使用;
<value>: acl测试条件支持的值有一下四类;
整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其通常为版本测试)且支持使用的操作符有5个,分别为eq,ge,gt,le和lt;
字符串:支持使用"-i"以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“--”标志位;
正则表达式:其机制类同字符串匹配;
IP地址及网络地址
同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:
“与”(默认即为与操作 &)、“或”(使用“||”操作符)以及“非”(使用“!”操作符).
注:根据老师的上课内容,和整理的笔记写出的内容,如果有不足的地方请大家多多指点指点。
本文出自 “blue” 博客,请务必保留此出处http://sailove.blog.51cto.com/3215562/1659393
标签:haproxy
原文地址:http://sailove.blog.51cto.com/3215562/1659393