设为首页 收藏本站
查看: 1409|回复: 0

[经验分享] HAproxy负载均衡动静分离实现及配置详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-12 09:29:30 | 显示全部楼层 |阅读模式
HAproxy的介绍                                                                                   



    HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

    HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

HAproxy的安装及生成重要文件                                                                     


HAproxy在centos6.6有较新的包,因此我们可以直接yum安装使用

1
2
3
4
#yum install haproxy -y
[iyunv@localhost ~ ]# rpm -ql haproxy
/etc/rc.d/init.d/haproxy       //服务脚本
/etc/haproxy/haproxy.cfg       //配置文件



HAproxy的应用层次和实现模型                                                                     


HAproxy的应用层次

    1.可以是应用层:http
    2.可以是TCP层:mysql,缓存处理
其常规应用的模型是fullnat型:
在网卡地址转换时,源IP地址和目标IP敌阵地都会发生变化。

wKioL1SuiNGASxpeAACgcGSGF8A599.jpg
HAproxy的配置详解                                                                                 


一.配置段组成:

    1.全局配置:global
    2.代理配置段:其中代理配置端大致还有四类:
        defaults:段用于为所有其它配置段提供默认参数.
        frontend:定义前端监听套接字,类似于nginx的server.
        backend :定义后端的服务器,类似与nginx的upstream.
        listen  :可以将前后端一起定义在listen中,通常在TCP层时使用。
整体配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
global   
    log         127.0.0.1 local2      //定义日志
    chroot      /var/lib/haproxy      
    pidfile     /var/run/haproxy.pid
    maxconn     40000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8 header X-Forword-For
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 30000
listen stats                   //单独定义状态页面
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version   
    stats uri     /haproxyuri?stats
    stats realm   Haproxy Statistics
    stats auth    admin:admin
    stats admin if TRUE
frontend http-in       //前端配置
    bind *:80
    mode http
    log global
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .jpeg .gif .png .css .js

    use_backend static_servers          if url_static
    default_backend dynamic_servers

backend static_servers
    balance roundrobin
    server imgsrv1 172.16.200.7:80 check maxconn 6000
    server imgsrv2 172.16.200.8:80 check maxconn 6000
backend dynamic_servers
    cookie srv insert nocache
    balance roundrobin
    server websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1
    server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2
    server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3



二.HAproxy的关键指令
balance :用于指明调度算法
使用位置:defaults,listen,backend
使用格式:balance url_param  
常用的参数有:
    roundrobin 动态加权轮询;最多接受4095并发请求。
    static-rr:静态的加权轮询,其在后端服务器连接数上没有限制;
    leastconn:最少连接数;动态的,适用于缓存服务器和mysql等较长会话;
    source:源IP绑定,是否是静态的取决于使用的hash_type
    uri:基于uri的方式,进行客户端服务器绑定,是否静态使用hash-type决定;
    url_param:通过用户的参数标识来负载在均衡至不同的后端.   
bind :用于定义一个或几个监听地址。
使用位置:frontend和listen。
使用格式:bind []: [, ...]
如果定义多个监听端口:
    bind :80,:8080  中间不要有空格
mode :用于实例的运行模式或协议
    mode { tcp|http|health }
    1.tcp: 通常用于SSL、SSH、SMTP等应用;
    2.http:应用于HTTP模式,工作于应用层;
    3.health:自定义外部健康状态检测
    例如:mode http 指定使用http协议

hash-type
使用格式:hash-type
定义用于将hash码映射至后端服务器的方法;其不能用于frontend区段;可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法。
map-based:就是在调度时把根据用户请求的URL,进行hash计算,然后将这个结果对后端主机的个数进行取模。假设每个主机给予1,2, 3编号这个值必然是在后端主机的之中的一个,因此这样不同的url最终hash计算结果必然不同,那么最终调度到后端主机的也必然不同,这样只有同一个UR,请求才会被调度至后端主机。这就是取模法。
但是:取模法一旦有一台主机发生故障,那么所有的主机的取模计算都将发生错误。
consistent:这种方式是将所有主机建设分布在一个0-2的32次方的数字大环上,将用户请求的URL,也进行hash计算,然后把这个结果对2的32次方取模,这个数字结果也必然是落在这个32次方数字的大环上。然后按照顺时针方向,这个数字离那个主机进,就被调度至那一台主机。
log
log global
log   [ []]
启用日志,因此可用于所有区段。。
启用方法:编辑日志配置文件
1
2
3
4
5
6
# vim /etc/rsyslog.conf
14 $UDPServerRun 514
60 # Save boot        messages also to boot.log
61 local7.*                                               var/log/boot.log
62 local2.*                                               /var/log/haproxy.log
#service rsyslog restart



wKiom1SusnrTjrIOAAEnf6G_2tU643.jpg
maxconn
使用格式:maxconn
指明前端链接的最大并发连接数,指定尽量大一些,但是不可以大于globle段落的值。
default_backend 指定默认后端,通常用于匹配的后端没有找到时使用。
使用格式:default_backend
例如:
use_backend     dynamic  if  url_dyn
use_backend     static   if  url_css url_img extension_img
default_backend dynamic
server 后端用于声明server
使用格式:server  [:port] [param*]
工作位置:不可以用于defaults和frontend段。
:主机标示,最好设置和主机名一致。
:此服务器的的IPv4地址,也支持使用可解析的主机名;
[:port]:指定目标端口,未设定时,将使用客户端请求时的同一相端口;
例如:server    node3  192.168.1.122:80 check
服务器或默认服务器参数:

backup:设定为备用服务器,这样只有当其他所有的服务器均故障时才启用。

check :启动对此server执行健康状态检查,他可以带的参数有:
      inter :设定健康状态检查的时间间隔
      rise :server从离线状态转换至正常状态需要成功检查的次数;
      fall :server从正常状态转换为不可用状态需要检查的次数;
      cookie :基于cookie的绑定
maxconn :指定此服务器接受的最大并发连接数;
maxqueue :设定请求队列的最大长度;
observe :通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;
redir :启用重定向功能
server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check
weight :权重,默认为1,最大值为256,0表示不参与负载均衡;
基于cookie的绑定实例:
1
2
3
cookie srv insertindirect nocache
76    server    node2  172.16.249.220:80 cookie first check rise 2 fall 1
77    server    node4  172.16.249.248:80 cookie second check rise2   fall 1



这里面cookie绑定在了first上了。
wKiom1Sv6jKw7SkEAACctIPBZWg174.jpg
Redir 重定向
直接在想要重定向的地方,后面添加
server    node4 172.16.249.248:80  redir http://172.16.249.122 check
wKioL1Sv7PDyVN1UAADSKiqiq0U874.jpg

Stats_enable
启用状态页面,这个页面不仅可以显示信息,还可以是控制的功能。
直接启用后端使用stats_enable ,对那个组启启用状态页面。这时的默认访问路径为
/Haproxy?stats  因此我们给予施加权限。
为了安全我们还可以修改它的Uri的
1
2
3
4
5
6
7
8
9
backend static
74    balance     roundrobin
75    server    node2  192.168.1.220:80  check rise 2    fall 1
76    server    node4  192.168.1.179:80   check rise 2    fall 1
77     stats enable                                 启用状态页面
78     stats uri /ha?stats                     //状态页面请求路径
79     stats realm HAPorxyStats  //状态页面的领域,中间如果有空格要转义
80     stats auth admin:pass              //认证的用户名和密码,中间用:冒号隔开。
81     stats admin if TRUE         //如果是密码验证成功允许进入管理区域



wKioL1Sv7n3y6UOwAATC69cM2pk528.jpg
但是我们通常会把stats单独定义在listen中如:

1
2
3
4
5
6
7
8
listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy Statistics
    stats auth    admin:admin
    stats admin if TRUE



option forwardfor
option forwardfor [ except  ] [ header  ] [ if-none ]
含义:就是指明记录客户端ip,除了127.0.0.1 之外的IP会被记录下来。
实现过程:

1
2
3
frontend http-in
    mode http
    option forwardfor except 127.0.0.1 header X-Forword-For



然后,后端主机访问日志格式也需要做响应的修改才能实现这种结果。
编辑后端主机的配置文件,修改配置文件日志格式:
1
2
3
4
497 LogFormat "%{X-Forword-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
498 LogFormat "%h %l %u %t \"%r\" %>s %b" common
499 LogFormat "%{Referer}i -> %U" referer
500 LogFormat "%{User-agent}i" agent



ACL

acl   [flags] [operator]  ...

:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;

:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];

[flags]:目前haproxy的acl支持的标志位有3个:

        -i:不区分中模式字符的大小写;

        -f:从指定的文件中加载模式;

        --:标志符的强制结束标记,在模式中的字符串像标记符时使用;

:acl测试条件支持的值有以下四类:

        整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为           通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;

        字符串:支持使用“-i”以忽略字符大小写,支持使用“”进行转义;如果在模式首部出现了-i,可以在         其之前使用“--”标志位;

        正则表达式:其机制类同字符串匹配;

        IP地址及网络地址  

path_beg :用于测试请求的URL是否以指定的模式开头;

path_end :用于测试请求的URL是否以指定的模式结尾;

动静的实现:                                                                                         


事例演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
frontend http-in
    bind *:80
    mode http
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .jpeg .gif .png .css .js
    use_backend static_servers          if url_static
    default_backend dynamic_servers
backend static_servers
    balance roundrobin
    server node1 172.16.11.1:80 check
    server node2 172.16.11.2:80 check
backend dynamic_servers
    cookie srv insert nocache   //动态内容我们是一般做cookie绑定的
    balance roundrobin
    server node3 172.16.11.3:80 check  cookie first
    server node4 172.16.11.4:80 check  cookie second
    server node5 172.16.11.5:80 check  cookie three





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-40541-1-1.html 上篇帖子: HaProxy+Nginx+Tomcat获取真实ip的配置问题 下篇帖子: haproxy的web服务负载均衡、动静分离、 MySQL服务负载均衡、状态监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表