1.1HAProxy 简介

HAProxy是一个可靠的、高性能的负载均衡软件,也是一种免费、快速且可靠的解决方案,可为基于TCP(第四层)和HTTP(第七层)的应用程序提供高可用、负载均衡的代理,特别适合用于流量非常高的网站。 HAProxy的操作模式使得其在与现有的体系结构集成时非常容易且无风险,同时也提供了不暴露web服务器的可用性。 HAProxy工作于OSI七层参考模型的第四层和第七层。

HAPoXxy是一个单线程、事件驱动的非阻塞引擎,同时结合了一个快速的vo层与基于优先级的调度程序。HAProxy支持单进程与多进程,但在运行多进程时,会有一些限制。同时单个进程可以运行多个实例,而且在单个进程中,可以配置300000个不同的代理并保持良好的运行。因此,通常不需要为所有实例启动多个进程。

HAProxy以尽可能快、尽可能少的移动数据操作为设计原则。因此,它实现了一个分层模型并为每个级别提供bypass机制,确保在非必要的情况下,数据不会传到更高的级别。大多数处并为每个级别提供bypass机制,确保在非必要的情况下,数据不会传到更高的级别。大多数处理都是在内核中执行的,HAProxy尽最大努力通过提供一些提示或者猜测, 可以通过在以后分组时避免某些操作来尽可能快地帮助内核完成工作。

当HAProxy工作在TCP或HTTP的close模式下时,其消耗的处理时间占15%,内存占85%;当HAProxy工作在TCP或HTTP的keep- -alive模式下时,其消耗的处理时间占30%,内存占70%。 HAProxy只需要haproxy可执行程序和配置文件即可运行。对于日志记录,建议使用正确配置的syslog守护程序并记录日志轮换。配置文件会在启动之前被解析,然后HAProxy会尝试它停止工作,这意味着HAProxy 没有运行时故障。它停止工作,这意味着HAProxy 没有运行时故障。

1.2HAProxy 的工作层及其区别

第四层:四层负载均衡器是通过分析IP层及TCP/IP层的流量实现基于“IP+端口”的负载均衡,主要通过报文的目的地址和端口配合负载均衡算法选择后端真实服务器,确定是否需要对报文进行修改并将数据转发至选出的后端真实服务器。

第七层:七层负载均衡器是基于应用层信息(如URL、Cookies 等)的负载均衡。主要依据报文的内容配合负载均衡算法选择后端真实服务器,然后再分发请求到真实服务器进行处理,也称“内容交换器”。客户端与负载均衡器、负载均衡器与后端真实服务器之间会分别建立TCP连接。

1.2.1Nginx、LVS、Haproxy 对比

Nginx:优点:1、Nginx的高并发,同时能承载上万个并发连接;2、nginx有充足的第三方功能模块的支持,主要通过upstream模块进行负载均衡;3、nginx对网络的依赖较小,理论上只要Ping得通,网页访问正常,nginx就能连得通;4、工作在网络的7层之上,可以针对http应用做一些分流的策略,它的正则规则比haproxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,nginx单凭这点可利用的场合就远多于lvs了。 缺点:1、将Nginx当做反向代理时,负载均衡功能不是很好,对后端服务器的健康检查功能较弱;2、nginx仅能支持http、https和email协议,这样就在适用范围上面小些,这个是它的缺点;3、nginx只支持通过端口来检测,不支持通过url来检测。

LVS:优点:1、抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;2、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat;3、应用范围比较广,可以对所有应用做负载均衡;4、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率; 缺点:1、软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。 2、如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦。

Haproxy:优点:1、HAProxy是支持虚拟主机的,可以工作在4、7层。 2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;3、支持url检测后端的服务器;4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;6、HAProxy的算法较多 缺点:1.扩展性差:添加新功能很费劲,对不断扩展的新业务,haproxy很难应对;2.在四层代理时,仅支持tcp协议的代理;

1.3HAProxy 安装及其配置文件

HAProxy的安装比较简单,可以直接使用yum源直接进行安装,要是需要使用最新版本则可以在官网上面下载最新的版本编译安装。

安装过程:HAProxy可以直接使用yum安装。安装完成后可以对其相关的配置文件进行修改。

(1)使用yum安装HAProxy

使用yum安装如下:

安装完成后可以看到haproxy的主配置文件在etc下的haproxy里。

可以查看里面的参数。

(2)了解HAProxy的配置文件的相关参数

HAProxy配置文件:

Global部分:部分参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改

Defaults部分:部分配置的参数属于公共配置,会被frontend、backend、 listen 部分自动引用。若在frontend、backend、 listen 部分存在相同的参数,则会被新的参数自动覆盖。

Frontend部分:部分主要用于处理请求的虚拟节点,Frontend可以将匹配到本地区域的请求交给下边的backend。可根据ACL规则直接指定需要使用的后端服务器

Backend部分:部分主要用于配置后端服务器集群,即一组后端的真实服务器,用来处理前端传来的请求,同样支持ACL规则,与LVS的真实服务器类似。

Listen部分: 部分是fontend与backend部分的集合体,在目前版本的配置文件中,默认已将其移除,但是仍然可以使用,如开启HAPOXY自带的Web监控平台。

(3)对HAProxy的配置文件进行修改配置

HAProxy 配置文件参数:

global                                                        # 全局参数global模块的设置    

log         127.0.0.1 local2                     # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志    

chroot      /var/lib/haproxy                #工作目录    

pidfile     /var/run/haproxy.pid         #进程pid文件    

maxconn     4000                                 #最大连接数    

user        haproxy                                 #所属用户    

group       haproxy                               #所属用户组    

daemon                                                 #以守护进程方式运行haproxy stats socket /var/lib/haproxy/stats     #定义socket套接字,针对在线维护很有帮助

defaults                                              # defaults模块的设置    

mode                    http                  # 默认的模式{ tcp|http|health},health只会返回OK    

log                     global                  #应用全局的日志配置     option                  httplog             #启用日志记录HTTP请求,默认不记录HTTP请求日志                                                                    

option                 dontlognull       #不记录健康检查的日志信息    

option http-server-close              #每次请求完毕后主动关闭http通道    

option forwardfor       except 127.0.0.0/8   # 启用X-Forwarded-For,将客户端的真实IP写入其中。                                                                        

option                  redispatch       #在连接失败的情况下启用或禁用会话重新分发,默认值是1                                                                              

retries                 3                          # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用    

timeout http-request    10s          #http请求超时时间    

timeout queue           1m               #一个请求在队列里的超时时间  

  timeout connect         10s              #连接超时    

timeout client          1m                  #客户端超时    

timeout server          1m                #服务器端超时    

timeout http-keep-alive 10s        #设置http-keep-alive的超时时间    

timeout check           10s               #检测超时    

maxconn                 3000                 #每个进程可用的最大连接数

frontend  main *:80                                           #frontend模块的设置,定义了一个前端    

acl url_static       path_beg       -i /static /images /javascript /stylesheets    

acl url_static       path_end       -i .jpg .gif .png .css .js          #这里定义了一个acl规则     use_backend static   if  url_static               #如果匹配到了acl,则访问后端的static模块 default_backend             my_webserver        #如果没有匹配到acl,则将请求丢给默认的模块

backend static                                        #定义第一个后端模块,static    

balance     roundrobin                      #负载均衡算法为轮询

server      static 127.0.0.1:80 check    #后端服务器地址

backend my_webserver                     #定第二个后端,my_wenserver

balance     roundrobin                         #负载均衡算法    

server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端     server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端     server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端

listen stats                                            #定义一个listen模块,用于状态检测

mode http                                            #模式采用http

bind 0.0.0.0:8888                               #绑定本机的地址及端口

stats enable                                         #启用状态检测功能

stats uri     /haproxy-status              #状态检测的URI

stats auth    haproxy:123456           #访问检测界面的用户名和密码

1.4HAProxy 访问控制列表

 HAProxy能够从请求、响应流、客户端或服务器信息、表、环境信息等提取数据,提取此类数据的操作被称为获取样本。检索时,这些样本可以用于实现各种目的,最常见的是将它们与预定义的称为模式的数据进行对比。

访问控制列表(ACL )提供了灵活的解决方案来执行内容切换,或者基于从请求、响应、任何环境状态中提取出来的数据来做出决策。执行的操作通常包括阻塞请求、选择后端或添加HTTP头部,使用原则非常简单。

HAProxy 访问控制列表原则:

从数据流、表或环境中提取数据样本;

对提取的样本可选的应用格式进行转换;

将一种或多种模式匹配应用到样本;

当模式与样本匹配时,执行操作。

HAProxy访问控制列表 常用选项:

ACL可用于frontend、backend 或listen部分,但是最常见的是用于frontend部分。其语法如下:

acl <aclname> <criterion> [flags] [operator] [<value>] …

常用的选项:

Acl   ACL 关键字,定义ACL规则;    

Aclname   ACL 规则名,严格区分大小写,只能使用大写字母、小写字母、数字、-(中线)、(下划线) (点号)和:(冒号);    

Criterion  获取样本方法的名称, 常见的有hdr beg(host)、hdr. dom(host)、 hdr(host)、path. beg、path end、url、 ur_sub、 ur_dir. ur_beg、 url end、url len等。  

  Flags   参数,如:-filename等。    

Operator   操作符,并不是所有的criterion都支持此操作符。     Value   通常指匹配的路径或文件等,若存在多个,则使用空格分隔。 

1.5HAProxy 配置实例

将演示如何配置HAProxy。在操作之前,请确保所有服务器均设置好路由转发功能且处于同一局域网内,同时服务器已完成了一些常用的初始化设置,如设置主机名、关闭SELinux,后续不再进行说明。

HAProxy的搭建主要分为两部分:后端的真实服务器(RealServer)搭建和前端的负载调度器(Load Balancer)搭建。   此外,HAProxy还自带一个基于 Web的监控平台,可以查看集群中所有后端服务器的运行状态、配置分组等信息,也可以对后端的节点进行部分管理操作,在升级节点、故障维护时非常有用。 下边为简单的原理图。

对防火墙进行配置,使其允许80端口持续对外提供服务,命令如下:

前端负载均衡调都器:IP地址:192.168.163.139 作用:负载调度器 Haproxy

后端真实服务器:IP地址:192.168.163.140 作用:提供后端服务 Webserver 1

后端真实服务器:IP地址:192.168.163.141 作用:提供后端服务 Webserver 2 

Webserver 1配置

 1、在webserver 1 上安装web服务。

 2、在webserver 1上编写一个简单的html页面。操作如下:

 3、最后wq保存退出。

4、重启服务,使其生效。

 5、在浏览器里可以查看一下效果。如下:

 Webserver 2 配置

1、与webserver 1 一样,先安装web服务。

2、在webserver 2上也编写一个简单的html页面。

3、同样wq保存退出。

4、重启服务,使其生效。

5、在浏览器里可以查看一下效果。如下:

HAProxy 配置

1、在负载均衡器上安装haproxy服务。

2、安装完成后对其配置文件进行修改。

3、跳转到frontend与backend部分,将内容修改为以下内容:

frontend web   bind *:80   #监听80端口

default_backend     websrvs  #调用后端web服务器组

backend websrvs       #定义后端web服务器组

balance roundrobin   #轮询模式

server web1 192.168.163.140:80 check   #check表示检测监控状态

server web2 192.168.163.141:80 check 

# main frontend which proxys to the backends 这行后面多余的部分全部用#注释掉

4、修改完成后重启服务,使其生效。

5、在浏览器里访问192.168.163.139,看下效果。

 使用web监控平台

HAProxy自带的Web监控平台在升级节点、更新维护时非常有用。开启HAProxy自带的web监控平台需要在负载均衡器上进行相关的配置。

1、修改配置文件/etc/haprox/haproy.cig,在文件末尾添加以下内容。

listen admin_stats     bind *:8080                        #监听8080端口,不能与之前的端口冲突    

stats enable                        #状态监控页面功能启动    

stats refresh 30s                 #统计页面自动刷新时间    

stats uri    /admin               #指定url路径    

stats realm  haproxy           #定义提示页面    

stats auth admin:123456   #登录账号和密码    

stats hide-version                #隐藏系统页面上haproxy的版本信息    

stats admin if TRUE             #允许管理员控制相关代理

2、重启服务,使其生效。

3、配置永久生效的防火墙规则,允许haproxy通过8080端口持续对外提供服务,命令如下:

3、完成后即可通过浏览器使用http://192.168.163.139:8080/admin 登录监控平台查看。登录成功后,效果如下:

web监控平台参数简介

Queue Cur: current queued requests             //当前的队列请求数量

Max:max queued requests    //最大的队列请求数量

Limit:                                        //队列限制数量

Session rate(每秒的连接回话)列表:

scur: current sessions       //每秒的当前回话的限制数量

smax: max sessions          //每秒的新的最大的回话量

slim: sessions limit           //每秒的新回话的限制数量

Sessions

Total:           //总共回话量

Cur:            //当前的回话

Max:            //最大回话

Limit:          //回话限制

Lbtot: total number of times a server was selected  //选中一台服务器所用的总时间

Bytes

In:          //网络的字节数输入总量

Out:       //网络的字节数输出总量 

Denied Req: denied requests             //拒绝请求量

Resp:denied responses      //拒绝回应

Errors Req:request errors                   //错误请求

Conn:connection errors         //错误的连接

Resp: response errors (among which srv_abrt) //错误的回应

Warnings Retr: retries (warning)                       //重新尝试

Redis:redispatches (warning)        //再次发送Server列表:

Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态

LastChk:   持续检查后端服务器的时间 Wght: (weight) : 权重

Act: server is active (server), number of active servers (backend)   //活动链接数量

Bck: server is backup (server), number of backup servers (backend)   //backup:备份的服务器数量

Down:                                                                                   //后端服务器连接后都是down的数量 Downtime: downtime: total downtime (in seconds)      //总的downtime 时间

Throttle: warm up status                                                      //设备变热状态 

Logo

更多推荐