Web群集搭建——Haproxy(理论+搭建实操+配置文件详解及优化方案)
Posted TaKe___Easy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web群集搭建——Haproxy(理论+搭建实操+配置文件详解及优化方案)相关的知识,希望对你有一定的参考价值。
Haproxy
一、Haproxy概述与调度算法原理
1.1 Haproxy概述
- Haproxy是一个使用C语言编写的自由及开放源代码的软件,其提供高可用性、负载均衡,并且是基于TCP和HTTP的应用程序代理
- 特别适用于负载大的Web站点,这些站点通常又会需要会话保持或七层处理。Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进当前的架构中并同时保护当前Web服务器不被暴露到网络上
- Haproxy实现了一种事件驱动,单一进行模型,次模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题的存在
- 此模型的缺点是当在多核系统上,这些程序通常扩展性较差。所以他们需先进行优化以使每个CPU时间片(Cycle)做更多的工作
1.2 Haproxy调度算法
- Haproxy支持多种调度算法,最常用的有三种
- RR(Round Robin)
- RR算法是最简单最常用的一种算法,即轮询调度
- LC(Least Connections)
- 最小连接数算法,根据后端的节点连接数大小动态分配前段请求
- 此算法相比RR算法有很大改进,也是目前用到比较多的一种算法
- SH(Source Hashing)
- 基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookid等做集群调度
- 此调度算法好处是可以实现会话保持,但某些IP访问量非常大时会引起负载不均衡,导致部分节点访问量超大,影响业务使用
1.3 常见的Web集群调度器
- 目前常见的Web集群调度器分为软件和硬件
- 软件通常使用开源的LVS、Haproxy、nginx
- LVS性能最好,但是搭建相对复杂
- Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能也没有Haproxy好
- 硬件一般使用比较多的事F5,也有很多人使用国内的一些产品,比如梭子鱼、绿盟等
- 软件通常使用开源的LVS、Haproxy、nginx
二、Haproxy应用分析与主要优点以及四层与七层负载均衡区别
2.1 应用分析
- LVS在企业应用中虽抗负载能力很强,但存在不支持正则处理,不能实现动静分离的不足。且对于大型网站,LVS的实施配置复杂,维护成本相对较高
- Haproxy是一款可提供高可用性、负载均衡、并且基于TCP和HTTP应用代理的软件。适用于负载大的Web站点,运行在硬件上可支持数以万计的并发连接的连接请求
2.2 Haproxy高性能负载均衡主要优点
- Haproxy可以对mysql进行负载均衡,对后端的DB节点进行检测和负载均衡
- Haproxy支持虚拟主机,可以工作在4、7层
- Haproxy在负载均衡速度和并发处理上优于Nginx
- 能够补充Nginx的一些缺点,比如Session的保持、Cookie的引导等工作
- 支持url检测后端服务器的状态
- 支持很多均衡算法。例如:Round-robin(轮询)、Weight-round-robin(加权轮询)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
2.3 四层与七层负载均衡区别
- 四层负载均衡器是通过分析IP层及TCP/UDP层的流量实现的基于“IP+端口”的负载均衡。主要通过报文的目标地址和端口配合负载均衡算法选择后端真实服务器,确定是否需要对报文进行修改(根据需求可能会修改目标地址、源地址、MAC地址等)并将数据转发至选出的后端真实服务器
- 七层负载均衡器是基于应用层信息(如URL、Cookies等)的负载均衡。主要依据报文的内容配合负载均衡算法选择后端真实服务器,然后再分发请求到真实服务器进行处理,也称“内容交换器”
- 客户端与负载均衡器、负载均衡器与后端真实服务器之间会分别建立TCP连接
三、Haprox集群搭建搭建
3.1 集群规划
- Haproxy:192.168.131.10
- Nginx1:192.168.131.11
- Nginx2:192.168.131.12
- 客户端(Win10):192.168.131.7
3.2 Haprox部署
- 编译安装
[root@localhost ~]# uname -r
3.10.0-693.el7.x86_64
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc gcc-c++ make
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /opt/
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# tar zxvf haproxy-1.5.19.tar.gz
[root@localhost opt]# cd haproxy-1.5.19/
[root@localhost haproxy-1.5.19]# uname -r
3.10.0-693.el7.x86_64
【查看内核,如果大于2.6.28则用TARGET=linux2628。小于则用TARGET=linux26】
root@localhost haproxy-1.5.19]# make TARGET=linux2628 arch=x86_64 【arch=x86_64:系统位数】
- 修改haproxy.cfg配置文件
[root@localhost haproxy-1.5.19]# mkdir /etc/haproxy
[root@localhost haproxy-1.5.19]# make install
[root@localhost haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
[root@localhost haproxy-1.5.19]# cd /etc/haproxy/
[root@localhost haproxy]# vim haproxy.cfg
[root@localhost haproxy]# vim haproxy.cfg
1 # this config needs haproxy-1.1.28 or haproxy-1.2.1
2
3 global 【全局配置参数】
4 log 127.0.0.1 local0 【配置日志记录,local0为日志设备,默认存放到系统日志】
5 log 127.0.0.1 local1 notice
6 #log loghost local0 info
7 maxconn 4096 【最大连接数,修改时需考虑ulimit -n限制】
8 # chroot /usr/share/haproxy 【chroot运行路径,为该服务自设的根目录,一般需将此行注释】
9 uid 99 【用户UID】
10 gid 99 【用户GID】
11 daemon 【守护进程模式】
12 #debug
13 #quiet
14
15 defaults
16 log global 【定义日志为global配置中的日志定义】
17 mode http 【模式为http】
18 option httplog 【采用http日志格式记录日志】
19 option dontlognull 【不记录健康检查日志信息】
20 retries 3 【检查节点服务器失败次数,连续达到三次失败则认为节点不可用】
21 redispatch 【当服务器负载很高时,自动结束当前队列处理比较久的连接】
22 maxconn 2000 【最大连接数】
23 contimeout 5000 【连接超时时间】
24 clitimeout 50000 【客户端超时时间】
25 srvtimeout 50000 【服务器超时时间】
【将下面所有的listen项删除并添加】
26 listen webcluster 0.0.0.0:80 【定义一个名为webcluster的应用】
27 option httpchk GET /test.html 【检查服务器的test.html文件(POST和GET都是向服务器提交数据/请求的方式)】
28 balance roundrobin
【负载均衡调度算法使用轮询算法】
【roundrobin:轮询算法】
【leastconn: 最小连接数算法】
【source: 来源访问调度算法,类似于nginx的ip_hash轮询 加权】
【定义在线节点】
29 server inst1 192.168.131.11:80 check inter 2000 fall 3
30 server inst1 192.168.131.12:80 check inter 2000 fall 3
【check inter 2000:表示haproxy服务器和节点之间的一个心跳频率】
【fall 3: 表示连续三次检测不到心跳频率则认为该节点失效】
【若节点配置后带有“backup”表示该节点只是个备份节点,只有主节点失效该节点才会用】
【不携带“backup”则表示为主节点,和其他主节点共同提供服务】
3.3 Haproxy配置文件解析
- haproxy配置中分成五部分内容
- global:设置全局配置参数,属于进程的配置,通常是和操作系统相关
- defaults:配置默认参数,属于公共配置,这些参数可以被引用到frontend,backend,listen组件
- frontend:接收客户端请求的虚拟节点(配置实体frontend),frontend可以添加规则直接指定需要使用的后端服务器backend;
- backend:用于配置后端服务器集群,是一组真实服务器,用来处理前段传来的请求,一个Backend对应一个或者多个实体服务器
- listen:frontend和backend的组合体。在frontend和backend部分能使用的所有选项参数,该部分都可以支持(option stop-check除外)
3.3.1 global部分
- global部分的参数通常与操作系统有关,只需要设置一次
参数 | 说明 |
---|---|
log | 日志配置,可设置rsyslog服务地址、日志设备、日志级别等 |
chroot | Haproxy的工作目录 |
pidfile | PID文件路径 |
maxconn | 每个进程可接受的最大并发连接数 |
user | 运行Haproxy的用户,可设置用户名或uid |
group | 运行Haproxy的组,可设置组名或gid |
nbproc | 启动Haproxy时创建的进程数,默认只启动一个进程 |
deamon | 以后台形式运行Haproxy,默认启用 |
3.3.2 defaults部分
选项 | 说明 |
---|---|
mode | 设置实例的运行模式:tcp、http、health,默认是http |
log | 设置启用的日志配置,默认是global |
maxconn | 最大并发连接数 |
retries | 设置连接后端服务器时失败重试的次数,默认是3次 |
timeout | 超时时间,单位毫秒,可以重复出现,定义时以“timeout”关键字开始且另起一行 timeout的常用选项如下7行 |
http-request | http请求的超时时间 |
queue | 队列的超时时间 |
connect | 成功连接后端服务器的超时时间 |
client | 客户端发送数据的超时时间 |
server | 后端服务器响应数据的超时时间 |
http-keep-alive | 持久连接的超时时间 |
check | 心跳检测的超时时间 |
option | 定义选项,可以出现多次,每配置一个选项值,则需要另起一行,以“option”开始 option的常用选项如下5行 |
httplog | 启用日志记录http请求 |
dontlognull | 不记录健康检查的日志信息 |
http-server-close | 收到后端响应后,关闭连接,但是不会关闭客户端与haproxy的连接 |
forwardfor | 启动X-Forwarded-For,将客户端的真实IP写入其中 |
redispatch | 在连接失败的情况下启用或禁用会话重新分发,默认值是1 |
3.3.3 frontend部分
选项 | 说明 |
---|---|
acl | 定义acl规则 |
use_backend | 指定直接使用的后端(需要先在backend部分定义),一般与ACL配合使用 |
default_backend | 指定默认后端(需要先在backend部分定义),在use_backend规则不匹配时使用 |
3.3.4 backend部分
选项 | 说明 |
---|---|
balance | 指定调度算法。 可以是roundrobin、static-rr、leastconn、first、source、uri、url_param、hdr()、random、rdp_cookie、rdp_cookie() |
server | 定义后端真实服务器,可以重复出现,定义时需要以“server”关键字开始且另起一行 |
3.4 添加haproxy系统服务
[root@localhost haproxy-1.5.19]# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@localhost haproxy-1.5.19]# cd /etc/init.d/
[root@localhost init.d]# ls
functions haproxy netconsole network README
[root@localhost init.d]# chmod +x haproxy
[root@localhost init.d]# chkconfig --add /etc/init.d/haproxy
[root@localhost init.d]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@localhost init.d]# service haproxy start
3.5 配置节点服务器
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx-1.12.0.tar.gz rh
[root@localhost opt]# yum install -y pcre-devel.x86_64 zlib-devel.x86_64 gcc gcc-c++ make
[root@localhost opt]# tar zxvf nginx-1.12.0.tar.gz
[root@localhost opt]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure \\
> --prefix=/usr/local/nginx \\
> --user=nginx \\
> --group=nginx
[root@localhost nginx-1.12.0]# make -j2 install
[root@localhost nginx-1.12.0]# echo "192.168.131.11" > /usr/local/nginx/html/test.html
[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.12.0]# nginx 【启动nginx服务】
3.6 客户端(Win10)测试
- 在192.168.131.7的客户端上访问haproxy测试轮询
四、haproxy日志定义
- 默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,所以为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来
- 需要将haproxy的info及notice日志分别记录到不同的日志文件中
[root@localhost init.d]# vim /etc/haproxy/haproxy.cfg
global
log /var/log local0
log /var/log local1 notice
[root@localhost init.d]# service haproxy restart
- 需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog(系统日志管理工具)启动时会自动加载此目录下的所有配置文件
[root@localhost init.d]# vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&̲~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
【这部分是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下】
【&~:表示当日志写入到日志文件后,rsyslog停止处理这个信息】
[root@localhost init.d]# mkdir /var/log/haproxy
[root@localhost init.d]# systemctl restart rsyslog.service
[root@localhost init.d]# tail -f /var/log/haproxy/haproxy-info.log 【查看haproxy的访问请求日志信息】
五、haproxy优化建议与总结
5.1 优化
参数 | 说明 | 优化建议 |
---|---|---|
timeout http-server-close | 长连接超时时间 | 此选项设置长时间连接超时时间,具体可参考应用自身特点设置,可以设置为 10s |
timeout http-request | http 请求超时时间 | 建议将此事件设置为 5~10s,增加 http 连接释放速度 |
timeout client | 客户端超时时间 | 如果访问量过大,节点响应慢,可以将此事件设置短一些,建议设置为 1min 左右即可 |
maxconn | 最大连接数 | 此参数根据应用的实际使用情况进行调整,推荐使用 10 240 |
daemon | 守护进程模式 | Haproxy 可以使用非守护进程模式启动,生产环境建议使用守护进程模式启动 |
nbproc | 负载均衡的并发进程数 | 建议与当前服务器 CPU 核数相等或为其 2 倍 |
retries | 重试次数 | 此参数主要用于对群集节点的检查,如果节点多且并发量大,设置为 2 次或 3 次;而在服务器节点不多的情况下,可以设置为 5 次或 6 次 |
option http-server-close | 主动关闭 http 请求选项 | 建议在生产环境中使用此选项,避免由于 timeout 时间设置过长导致 http 连接堆积 |
5.2 总结
- Haproxy特别适用于负载大的Web站点,支持虚拟主机,可以工作在4、7层
- 支持很多均衡算法。例如:Round-robin(轮询)、Weight-round-robin(加权轮询)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
- haproxy日志是输出到系统的syslog中,查看起来不是非常方便,所以为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来
以上是关于Web群集搭建——Haproxy(理论+搭建实操+配置文件详解及优化方案)的主要内容,如果未能解决你的问题,请参考以下文章