Linux Haproxy

Linux Haproxy
    Haproxy是一款基于TCP(4层传输层)和HTTP应用(7层应用层)的代理软件,它能够做为负载均衡器,由于是开源软件,因此彻底免费;Haproxy默认使用的是事件驱动、单一进行模型,相似nginx,一个进程响应多个请求;它具备如下特性:
        高可用性:Haproxy能够在负载均衡服务出现故障时自动的将服务从故障节点切换到其事先配置好的备用节点,保证了服务的不间断提供;
        可扩展性:随着业务量的加大,现有的集群规模不能知足需求时,能够向集群中动态的添加后端服务器节点,知足业务的须要;
        但是可控性:Haproxy提供了一个监控页面,能够对集群服务或后端服务器节点进行实时的监控,能够在出现故障时根据各类方式(邮件,短信等)通知管理员,及时进行故障排除;
        安全性:Haproxy提供了对后端服务器进行健康状态检测的机制,能够定时探测后端服务器的状态,在后端服务器负载饱和前,能够自动屏蔽新来的链接,以保证服务器的正常使用;
        高性能:Haproxy借助于OS上的几种常见的技术来实现性能的最大化;
            1.默认为单进程、采用事件驱动模型,显著下降了进程上下文切换的开销以及内存的占用;
            2.采用O(1)事件检查器,容许其在高并发链接中对任何链接的任何事件实现即时探测;O(1)能够实如今超级多的数据中查找任何一个资源所消耗的时间都是相同的;
            3.在任何可用状况下,单缓冲机制能以不复制任何数据的方式完成读写操做,这回节约大量的CPU时钟周期以及内存带宽;
            4.借助于linux2.6及以上的OS中的splice()系统调用,Haproxy能够实现零复制转发;在linux3.5及以上的OS中还能够实现零复制启动;
            5.内存分配器在固定大小的内存池中可实现即时内存分配,这更够显著减小建立一个会话的时长;
            6.使用树形存储,使用的是做者本身开发的弹性二叉树,实现了以O(log(N))的低开销来保持计数器命令、保持运行队列命令、管理轮询以及最少链接队列;
            7.优化了HTTP首部分析功能,避免了在HTTP首部分析过程当中重读任何内存区域;
            8.减小了繁重的系统调用,大部分工做都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
        Note:Haproxy的tcp层负载均衡是经过软件模拟出来的,其实际的性能远没有LVS强,可是Haproxy配置简单,使用方便,对于通常的企业级访问量彻底是够用的;
    工做位置:
        Haproxy能够位于客户端(Clients)与web server之间实现负载均衡,也能够在位于web server与后端的app server之间实现负载均衡,还能够位于app server与后端的数据库之间实现动静分离;
 
    Haproxy的代理功能:
        代理服务器通俗的说就是客户端要访问互联网上的某些资源时不是本身直接去资源服务器上请求相应的资源,而是将本身的需求告诉本身的代理服务器,而后代理服务器代替客户端去请求其须要的资源;这样能够增长真实客户端的安全性,也能够在代理服务器上作一些访问策略,增长访问性能,好比在代理服务器上增长缓存功能,当下次再访问相同资源时,代理服务器就不用再去资源服务器上请求资源了,而是将本身的缓存直接响应给真实客户端;那么代理服务器是怎么实现代理的呢?代理服务器首先会接收到客户端的请求,而后对其进行分析,查看其要访问的资源是什么,而后根据分析结果从新构造数据包,将本身做为客户端再去请求相应资源,因此资源服务器看到的是代理服务器的地址,若是不在代理服务器上作相应的设置,资源服务器是没法知道真实客户端的ip地址的;
        关于长链接:
            长链接通常是指客户端与服务器端在一段时间以内一直保持着链接状态,这样能够避免频繁的建立链接,而消耗更多的资源,毕竟链接的建立与拆除也是须要消耗资源的;可是有代理服务器的链接就与通常状况的有些不一样了,由于你要分清客户端是与代理服务器保持长链接仍是经过代理服务器直接和后端资源服务器直接保持长链接呢!长链接通常都是应用在互联网上的客户端和服务器之间,用于减小服务器的负载,咱们这里讲述的Haproxy代理是位于资源服务器这一边的,能够理解成Haproxy是资源服务器组对外的出口,资源服务器为内网中的主机,因此Haproxy与资源服务器能够不使用长链接,主要是客户端与Haproxy之间在须要时才启用长链接(不是说Haproxy与资源服务器就不可使用长链接,根据须要启用便可);
        关于缓存:
            在现今的互联网上有一个说法就是cache is king,这足以说明缓存的重要性了,缓存能够减小冗余数据的传输、节省带宽,缓解网络瓶颈、下降对原始服务器的访问压力、下降了传输延迟等;
        关于链接数:
            Haproxy代理服务器同时可处理的链接数,会受linux中的端口号数量的限制,由于做为http的代理,在接收到客户端的请求后,会为这个链接随机分配一个端口号,用于与其创建链接,从而进行数据的传输,同时,代理服务器还要向后端的真正的服务器发起相关的请求,这就又须要一个端口号来创建链接,因此大致算一下,linux中一共有65535个端口,先后各分去一半,也就是说在满载的时候Haproxy代理服务器最多也就能处理(65535/2)个链接,这仍是没有去掉各类服务监听使用的固定端口的状况;这段内容只是为了代表端口号对链接数的限制,在生产环境中是不会让服务器同时处理三万多个链接的,会致使服务器高负载,挂掉的;还有就是单个用户默承认以打开的文件为1024个,因此通常会将这个数字尽可能的调大一点,让服务器能够处理更多请求;由于在linux中一切皆文件,一个端口号就是一个文件(套接字文件);相比来讲LVS就不受套接字数量的限制,由于LVS是在内核中直接处理的,无需端口号,这不是劝你用LVS,若是是中小型网站,并发量并很少的环境中使用LVS就会有种杀鸡用牛刀的感受,再说了LVS在更高层的控制功能上比较弱小,好比LVS就不支持动静分离;因此选择哪一种软件,由需求而定,适用就好;
        Haproxy只能实现对http协议进行反向代理,本身不具备缓存功能,可是它支持对4层传输层基于tcp通讯的应用进行负载均衡;
    评估负载均衡器性能的三要素:
        会话率:单位时间内会话创建的速率;
        会话并发能力:能够保持多少个会话同时存在的能力;
        数据率:数据的传输效率;
    HAproxy安装及配置:
        安装:
            yum install haproxy
        配置文件:
            /etc/haproxy/haproxy.cfg
            haproxy的配置文件分为一下几段:
                global:全局配置段
                defaults:默认配置段,能够为backend、frontend以及listen提供相同的默认配置参数;同一参数能够在defaults中定义,也能够在frontend、backed、以及listen中定义,可是在后者中定义参数优先级高于前者;
                listen:直接指定监听的端口和地址,不使用frontend和backend就能够完成向后端进行调度;能够经过此段定义haproxy的监控页面
                frontend:前端配置段,相似nginx中的server
                backend:后端配置段,相似nginx中的upstream
            Haproxy能够经过在frontend中使用use_backed参数调用backend,来实现负载均衡;
        简单的例子:
            须要三台主机,一台为centos7做为haproxy代理,另外两台为centos6做为web server,运行httpd服务;
            centos7:
            yum install haproxy
            vim /etc/haproxy/haproxy.cfg
                frontend  main *:80
                    default_backend             webserver
                backend webserver
                    balance     roundrobin
                    server clone1 192.168.80.131:80 check
                    server clone2 192.168.80.134:80 check
            vim /etc/rsyslog.conf
                $ModLoad imudp
                $UDPServerRun 514
            local2.*                /var/log/haproxy.log
            systemctl restart rsyslog.service
            systemctl start haproxy.service
            centos6_1:
                echo "<h1>clone1</h1>" > /var/www/html/index.html
                service httpd start
            centos6_2:
                echo "<h1>clone2</h1>" > /var/www/html/index.html
                service httpd start
            在浏览器端键入cnetos7的IP地址访问web服务进行测试;
        参数详解:
            global:
                log ip_addr log_level
                    定义日志功能;haproxy的日志功能是经过将日志发送给日志服务器进行记录的,而不是像其余服务同样,直接记录到日志文件的;因此要想记录haproxy的日志,须要对/etc/rsyslog.conf进行相关配置:在配置文件中启用$ModLoad imudp及$UDPServerRun 514后添加有关log_level的相关功能;
 
                chroot /path/to/dir
                    定义根目录,以安全方式运行;
                maxconn conn_number
                    定义每一个进程所能接受的最大并发链接数;
                daemon
                    定义服务做为守护进程,在后台运行
                stats socket /var/lib/haproxy/stats
                    设置访问stats状态页时,基于unix套接字进行访问;
                ulimit-n number
                    设定每一个进程所能打开的最大文件描述符,服务默认会自动进行设置;
                spread-checks <0…50, in percent>
                    用于将对后端进行健康状态检测的时机进行分散,以防止形成瞬间拥塞现象;html


            backend:
                balance 
                    指定调度算法:
                        动态:权重可动态调整
                            roundrobin:基于权重进行轮询调度,每一个后端主机最多支持4128个链接;
                            leastconn:新的链接请求会被调度到后端具备最少链接数的服务器上;在由较长时间会话的场景中推荐使用;
                        静态:权重不会实时生效
                            static-rr:基于权重进行轮询调度,每一个后端主机支持的链接数量没有限制;
                            source:将请求的源地址进行hash运算,而后除之后端服务器的总权重数,最后将结果调度到相应的服务器上;能够将同一IP的客户端始终调度到同一台服务器上;可是当后端服务器的权重发生变化之后,就有可能会将以前同一IP的请求调度至其余服务器上;
 
                        hdr (<name>):根据请求报文中指定的header(use_age、hostname等)进行调度,将指定header的值作hash计算,而后除之后端服务器的总权重,最后将链接调度到指定服务器;
                    全部跟hash有关的调度算法,都会受hash-type指定的类型影响,若是是map-based(默认)就是静态算法,若是为consistent就是动态算法;
                server <name> <addr> [:port] [param*]:指定后端服务器地址;还能够定义在listen中;
                    name:指定服务器的内部名称,用于日志查询;
                    address:指定服务器的IP地址;
                    port:指定将链接请求调度至此服务器上的哪一个目标端口,未设定时使用客户端请求时使用的端口;
                    param*:为此服务器设定的参数,能够实现特定功能;
                        backup:指定此服务器为比用服务器,相似sorry server;
                        check:启动对此处定义的后端服务器进行健康状态检查;
                cookie [ rewrite | insert | prefix ] [ indirect ] [ nocache ]:能够基于浏览器cookie实现session绑定;
                    例子:
                        backend webserver
                        balance     roundrobin
                        cookie SERVERID insert nocache indirect
                        server clone1 192.168.80.131:80 check weight 1 cookie clone1
                        server clone2 192.168.80.134:80 check weight 2 cookie clone2
 
                        cookie <value>:当Haproxy代理服务器第一次接收到某客户端发来的请求时,在为其调度选择后端服务器后会再为其分发一个cookie,等下次这个客户端再来请求时,会检查其cooki值,若是匹配则直接将其调度至相关服务器上;相似于基于session的cookie绑定;
                maxconn number:此服务器能都接收的并发链接的最大数量;
                weight:定义服务器的权重;1-250
 
            frontend:
                bind [<addr>]:<port_range> [,…] :设置监听的套接字,能够是多个;
                    除了能够用在frontend中,还能够用在listen中;
                    addr:可为主机名、IP地址,*表示全部主机;
                    port_range:能够是单一端口号,也能够是端口号列表;
                mode {tcp|http}:指定实例同后端服务器之间运行的模式或协议,当实现内容交换时,前端和后端必须使用同一种模式,不然将没法传输数据;
                    tcp:客户端和服务器端之间建议一条全双工的链接,而且不会对7层报文作任何的处理,一般用于SSL、SSH等场景;默认模式;
                    http:客户端请求在通过Haproxy到达后端服务器时会进行7层的深度解析,而后再根据解析结果将请求调度至后端服务器上;
                maxconn number:定义一个前端的额最大并发链接数;这个链接数的数量会经过调度算法分散到backend中定义的后端服务器上,因此设置这个数值时要考虑本身的后端服务器能够承受多大的并发量;而且这个并发链接数不能够超过global中设置的最大链接并发数;
                default_backend:指定默认的后端服务器;
                use_backend:指定使用的后端服务器;优先级比default_backend高;能够添加条件语句“if”;格式为:use_backend name if acl_rule_name
        其余参数:
            capture request header <name> len <length> 
                捕获请求报文最后一次出现时的header的完整值,用于在日志中记录额外信息;只能用在frontend和listen中;
                name:要捕获的header的名称;
                length:截取要保存的的头部值的长度;
 
            capture response header <name> len <length>
                捕获响应报文最后一次出现是的header的完整值,用于在日志中记录额外信息;只能用在frontend和listen中;
            option httplog:当mode为http时,记录丰富的日志信息; 可用于defaults、frontend、listen、backend中;
 
            option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
                用于记录真实的客户端的地址,若是不设置,因为Haproxy代理的存在,后端服务器日志中记录的来源地址都会是Haproxy的IP地址;可用于defaults、frontend、listen、backend中;
                而且须要在后端服务器的web程序日志中将”X-Forwarded-For”添加进去;
                    示例:LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 
            errorfile /path/to/file:定义错误页面重定向,使用Haproxy主机本地文件进行响应;可用于defaults、frontend、listen、backend中;
            errorloc|errorloc302 url:使用指定的url进行响应;响应状态码为302,不适用于GET之外的其余请求方法;可用于defaults、frontend、listen、backend中;
            errorloc303 url:返回303状态码;可用于defaults、frontend、listen、backend中;
            http-request { allow | deny | tarpit | auth [realm <realm>] } [ { if | unless } <condition> ]:设置关于七层的请求报文的访问控制;可用于frontend、listen、backend中;
            acl <aclname> <criterion> [flags] [operator] <value> :定义访问控制列表;
                aclname:指定acl的名称
                criterion:指定要检查的属性(条件),好比src、src_port等
                flags:标志位,目前haproxy支持三个标志位:-i为不区分value中模式的大小写、-f为从指定的文件中加载模式、--为标记符的强制结束标志;
                value:acl测试条件支持的值有四种:
                    1.整数或整数范围,仅支持使用正整数,且支持五种操做符:eq、ge、gt、le、lt;
                    2.字符串:支持使用”-i”忽略字符大小写,支持使用”\”进行转移;
                    3.正则表达式:其机制相似字符串匹配机制;
                    4.IP地址及网络地址;

                Note:同一个acl中能够定义多个测试条件,这些测试条件能够由逻辑操做符指定其关系,条件间的组合测试关系有三种:与(默认)、或、非;
                详情请查看:http://cbonte.github.io/haproxy_dconv/1.5/configuration.html#7
                            http://cbonte.github.io/haproxy-dconv/1.5/configuration.html#4
        haproxy的状态监控页:
            能够在listen和backend中设置;
            参数选项:
                stats enable:启用haproxy的统计报告;
                stats uri /path/to/file:设置统计报告页的位置
                stats     realm “String”:设置登陆时的提示信息
                stats auth stats_user:stats_passwd:指定登陆的用户名和密码
                stats hide-version:隐藏haproxy的版本信息;
                stats scope . :指定stats的做用域;”.”为当前(自身)做用域的意思;
                stats admin if TRUE:当验证经过时,启动管理员在统计状态页中的管理权限(能够直接设置让backend中的server下线或者上线);
            例子:
                1.listen statistics
                    bind *:12138
                    stats enable
                    stats hide-version
                在浏览器输入http://192.168.80.138:12138/haproxy?stats便可查看统计状态页;
 
                2.listen statistics
                    bind *:12138
                    stats enable
                    stats hide-version
                    stats scope .
                    stats uri   /haproxy-stats
                    stats auth guowei:admin
                    stats realm "Haproxy\ stats page"
                在浏览器输入http://192.168.80.138:12138/haproxy-stats后会提示输入用户名密码,按要求输入便可查看统计状态页;
  
官方文档:http://cbonte.github.io/haproxy-dconv/1.5/configuration.html前端

 

               注:根据马哥视频作的学习笔记,若有错误,欢迎指正;侵删;
 linux

相关文章
相关标签/搜索