Haproxy
第1章 前言
首先,我们知道nginx负载均衡集群,LVS负载均衡集群,和haproxy负载集群,这三种集群比较来说,LVS性能最好,但是搭建相对复杂,nginx的upstream模块支持集群负载,但是对web节点的健康检查功能不多,性能也没有haproxy好,这也是haproxy为什么受欢迎的原因之一!
第2章 Haproxy简介
1. haproxy是一个使用C语言编写的开源软件,支持高可用,负载均衡,以及基于tcp和http的应用程序代理
2. Haproxy特别适用于负载特别大的web站点,这些站点通常又需要会话保持或者7层处理,haproxy完全可以支持数以万计的并发连接,并且他的运行模式使得它可以简答安全的整合到您当前的架构中,保证您的web节点不暴露在网络上
3. Haproxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发链接数,多进程或多线程模型受内存限制,系统调度器限制以及无处不在的锁限制,很少能处理数千并发链接
4. 事件驱动模型因为在有更好的资源和时间管理的用户空间,实现所有这些任务,所有没有这些问题,此模型的缺点是,在多核系统上,这些程序通常扩展性较差,这就是为什么他们必须进行优化,是每个CPU时间片做更多的工作
第3章 haproxy负载均衡的调度算法:
3.1 目前haproxy支持的调度算法常见有如下几种
先介绍表动态hash的特点:
服务器运行时就可进行权重调整,即只需要重新载入配置文件即可,不需要重新启动haproxy,并且支持慢速启动,即重新恢复的后端节点不会一次性接受大量请求,而是慢慢增加的
3.1.1 roundrobin:基于权重的轮询调度
动态加权轮询算法,支持权重的运行时调整及慢启动机制,最大支持4095个后端节点,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法
3.1.2 static-rr:不支持动态hash,没有后端数量限制,基本不用
静态轮询算法,不支持权重的运行时调整和慢启动机制,每个服务器根据权重轮流使用,此种算法对后端节点数量没有限制
3.1.3 lc:类似于LVS中wlc算法
但是这里是只考虑活动链接数,即选择活动连接数最少的,最好在长连接会话中使用
3.1.4 source:基于hash表的算法,类似于nginx中的ip_hash
源地址hash算法,对请求源ip地址进行hash,该算法一般用与不能插入cookie的tcp模式,它还可以用户广域网上为拒绝使用会话cookie的客户端提供最有效的粘连
3.1.5 uri:基于uri生成hash表的算法,主要用于后端节点是缓存服务器的场景
此种方法基于uri进行选择,如客户端访问了http://test.com/a.jpg,那么在这个uri缓存失效之前,任何一个客户访问这个路径,一定访问的就是a.jpg
3.1.6 url_params:
根据url的参数来调度,用于将同一个用户的信息,都发送到同一个后端节点
3.1.7 hdr:header基于头部的信息来构建hash表
基于用户请求的主机名进行调度
第4章 Haproxy负载均衡的简单实现
4.1 环境准备:
4.1.1 负载均衡前端:
10.0.0.41 172.16.1.41 backup
4.1.2 后端web服务器端:
10.0.0.17 172.16.1.17 web03 10.0.0.18 172.16.1.18 web04
4.2 yum安装:
yum –y install haproxy
4.3 配置文件说明:
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy 改变当前工作目录 pidfile /var/run/haproxy.pid 当前进程pid文件 maxconn 4000 最大连接数 user haproxy 所属用户 group haproxy 所属用户组 daemon 以守护进程的方式运行haproxy # turn on stats unix socket stats socket /var/lib/haproxy/stats defaults mode http 默认的模式tcp:4层;http:7层;health:只会返回OK log global 应用全局的日志配置 option httplog 启用日志记录http请求,默认haproxy的日志是不记录http请求日志的 option dontlognull 启动该项,日志中将不会记录空链接,所谓空链接就是在上游的 负载均衡器或者监控系统为了探测该服务器是否可用时 需要定期的连接或者获取某一固定的组件或者页面, 或者探测扫描端口是否在监听或开放等动作被称为空链接; option http-server-close 每次请求完毕后主动关闭http通道 option forwardfor except 127.0.0.0/8 如果服务器上的应用程序向记录发起请求的客户端的ip地址,需要在haproxy上配置此项, option redispatch 当时用了cookie时,haproxy会将其请求的后端服务器的server ID插入到cookie中,以保证会话的session持久性,而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置次参数,会将客户的请求强制定向到另外一个后端server上,以保证服务正常 retries 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 main *:5000 监听端口 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 后端web集群组名 backend static balance roundrobin 负载均衡算法, balance roundrobin轮询 balance source保存session值 server static 127.0.0.1:4331 check 静态文件部署在本机 backend app balance roundrobin 负载均衡算法 server app1 127.0.0.1:5001 check 定义后端 server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check
4.4 web服务端部署:
这里为了快速部署,安装了httpd,yum安装即可
4.4.1 创建测试页面:
echo "172.16.1.17 web03" > /var/www/html/index.html echo "172.16.1.18 web04" > /var/www/html/index.html
4.4.2 启动httpd服务:
systemctl start httpd.service
4.4.3 启动httpd服务后访问页面测试一下,确保后端节点访问正常
1.1 编写负载均衡服务器haproxy的配置文件:
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg frontend http *: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 web backend web balance roundrobin server web03 172.16.1.17:80 check server web04 172.16.1.18:80 check
1.2 启动haproxy服务:
systemctl start haproxy.service
1.3 进行负载测试:
1.3.1 第一次访问:
1.1.1 第二次访问:
1.1 查看httpd服务的日志:
1.1.1 日志记录的是负载均衡的ip地址,而非真实访问的源IP地址
[[email protected] html]# tail -2 /var/log/httpd/access_log 172.16.1.41 - - [18/Mar/2018:02:28:12 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" 172.16.1.41 - - [18/Mar/2018:02:28:13 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
1.1.2 解决办法:
找到定义日志记录格式的地方:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
修改记录http访问的头部信息:
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
重启httpd服务:
systemctl restart httpd.service
1.1.3 在此访问后验证:
[[email protected] html]# tail -2 /var/log/httpd/access_log "10.0.0.1" - - [18/Mar/2018:02:41:49 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" "10.0.0.1" - - [18/Mar/2018:02:41:49 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
第2章 实现基于cookie实现负载:
2.1 cookie可以实现根据客户端cookie信息来实现持久连接,实现原理:
客户端首次访问服务器,服务端会通过set-cookie设定客户端的cookie信息,以后客户端访问服务端时,会附加设置好的cookie信息进行访问
2.2 修改haproxy配置文件信息: 绿色为修改部分
backend web balance roundrobin cookie webser insert nocache server web03 172.16.1.17:80 cookie web03 server web04 172.16.1.18:80 cookie web04
cookie 关键字用法说明:
nocache:姜付加cookie信息的源不缓存于缓存服务器中
insert:插入cookie信息
rewrite:重写cookie
prefix:作为前缀
2.3 进行测试: 多次访问 都是同一台服务器
第1章 Haproxy状态页:
1.1 在配置文件中添加状态页相关信息:
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxyadmin/stats stats realm Haproxy\ Statistics stats auth admin:admin stats admin if TRUE
1.2 在浏览器中输入网址访问
http://10.0.0.41:1080/haproxyadmin/stats
第1章 实现haproxy自动监控后端状态:
1.1 修改haproxy配置文件:
backend web balance roundrobin server web03 172.16.1.17:80 check port 80 inter 2 fall 2 rise 1 server web04 172.16.1.18:80 check port 80 inter 2 fall 2 rise 1
1.2 宕掉后端服务器,模拟故障:
[[email protected] html]# systemctl stop httpd.service [[email protected] httpd-2.4.6]# systemctl stop httpd.service
1.3 进行访问:
1.1 恢复其中一台,再次进行测试:
后端服务器恢复后,立马上线
原文地址:http://blog.51cto.com/13520772/2095442