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) 在浏览器中进行验证:

 

 

650) this.width=650;” src=”http://www.fwqtg.net/wp-content/uploads/2015/06/Haproxy1.jpg” style=”float:none;” title=”图像 2.png” alt=”Haproxy” />

 

五、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 后端的主机;

 

 

650) this.width=650;” src=”http://www.fwqtg.net/wp-content/uploads/2015/06/Haproxy5.jpg” style=”float:none;” title=”图像 2.png” alt=”Haproxy” />

进入网页的调试界面,会有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


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注