文章目录
- 一、HAProxy介绍
- 二、HAProxy的特点
- 三、HAProxy与LVS、Nginx的比对
- 四、HAProxy调度算法
- 五、实验
- 1.架构图
- 2.简要分析
- 3.实验步骤
- 4.日志管理
- 总结
一、HAProxy介绍
HaProxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件,它适用于负载流量大的Web站点,当HAProxy运行在硬件上时,可支持数以万计的并发连接的连接请求。
二、HAProxy的特点
HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。
HAProxy非常适用于并发流量大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
HAProxy的主要特性:
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美
- 支持TCP协议的负载均衡转发
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s
- 支持多达8种负载均衡算法
- 支持Session会话保持,Cookie的引导
- 支持通过获取指定的url来检测后端服务器的状态
- 支持虚机主机功能,从而实现web负载均衡更加灵活
- 支持连接拒绝、全透明代理等独特的功能
- 拥有强大的ACL支持,用于访问控制
- 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
三、HAProxy与LVS、Nginx的比对
- LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
- LVS是可实现4层的ip负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCp和HTTP应用的负载均衡综合解决方案;
- LVS因为工作在Iso模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式
- HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。但整体性能低于4层模式的LVS负载均衡;
- Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好。
四、HAProxy调度算法
- rr(轮询):通俗的讲,就是轮流询问,跟网易云音乐的按顺序播放一样
- static-rr(加权轮询):表示根据web服务器的权重来分配前端请求。权重越大,分配给的流量就越多
- LC(最小连接):根据后端的节点连接数大小动态分配前端请求
- SH(源地址哈希):类似nginx的ip hash算法,基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度,简单来说,可以理解为ip绑定,比如A访问了服务器1,那么在服务器重启之前,A每次访问,都会被分配给服务器1。
- uri(目的地址哈希):表示根据用户请求的URI做hash,做cdn时需要使用。
- url_ param:根据请求的URl参数’balance url_ param’ requires an URL parameter name
- hdr (name):根据HTTP请求头来锁定每一次HTTP请求
- rdp-cookie (name):根据cookie (name)来锁定并哈希每一次TCP请求
HAProxy三种会话保持的方式:
- 源地址hash
- 设置cookie
- 会话粘性表stick-table
五、实验
1.架构图
客户端:centos7,192.168.41.43
HAProxy服务器:centos7,192.168.41.44
nginx1:centos7,192.168.41.45
nginx2:centos7,192.168.41.46
2.简要分析
客户端发起访问请求,数据包发送到HAproxy上,由HAProxy的调度算法决定将请求调度到Web集群中的哪一台Web服务器上,Web服务器接收到转发来的请求,将回包发送给HAProxy,再由HAProxy回复给客户端。
3.实验步骤
-------------------45、46服务器(nginx)--------------------
这个已经搭建无数遍了,就不再赘述,仅罗列命令集合,45、46操作一模一样
yum install -y epel-release
yum install -y nginx
echo "this is45's nginx" > /usr/share/nginx/html/index.html #45服务器操作
echo "this is 46's nginx" > /usr/share/nginx/html/index.html #46服务器操作
systemctl start nginx
访问测试
-------------------44服务器(HAProxy)--------------------
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make #安装HAProxy所需依赖包
uname -r #查看内核参数,如果内核版本是大于2.6.28的,需要在编译的时候声明
cd /opt #将包上传到opt,切换到opt目录
tar zxvf haproxy-1.5.19.tar.gz #解压
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64 #make编译,TARGET参数根据内核版本进行配置,大于2.6.28就用linux2628,小于2.6.28就用linux26,ARCH参数表示系统架构,x86_64为64位
make install #编译安装
mkdir /etc/haproxy #创建配置文件的目录
cp examples/haproxy.cfg /etc/haproxy/ #将模板文件复制到配置文件目录
cd /etc/haproxy/
vim haproxy.cfg #修改配置文件
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
log /dev/log local0 info #该参数定义日志输出设备和日志级别,将原先的127.0.0.1修改为/dev/log
log /dev/log local0 notice #同上
#log loghost local0 info
maxconn 4096 #每个进程最大连接数,需考虑"ulimit -n"限制,推荐使用10240
#chroot /usr/share/haproxy 该参数注释
uid 99 #用户ID
gid 99 #用户组ID
daemon #守护进程模式
nbproc #该参数是需要手动添加的,其作用是设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
#debug
#quiet
defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件
log global #日志,采用全局配置中的设置
mode http #模式,有tcp(四层)和http(七层)两种,我们这里使用http模式
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 连接超时时间,默认单位为ms,这是老版本的配置,我们选择注释掉,添加新版本写法
#clitimeout 50000 客户端超时时间,同上
#srvtimeout 50000 服务端超时时间,同上
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s #默认持久连接超时时间
timeout check 10s #设置心跳检查超时时间
---删除之后的所有listen项,手动添加以下配置---
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
option httpchk GET /index. html #检查服务器的index.html文件。option指定健康检查的方式为 httpchk, 发送http的GET请求检查index.html文件,返回2xx、3xx表示正常;返回4xx/5xx表示异常,则会将该web服务器隔离起来,不会将访问请求分配给它。
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.41.45:80 check inter 2000 rise 2 fall 3 #定义在线节点
server inst2 192.168.41.46:80 check inter 2000 rise 2 fall 3 #定义在线节点
#server inst2 192.168.41.47:80 check inter 2000 rise 2 fall 3 backup #定义备份节点
配置完毕,保存退出
ln -s /usr/local/sbin/haproxy /usr/sbin/ #做个软链接,将haproxy的可执行文件放入环境PATH的目录下
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy #将haproxy.init文件复制到/etc/init.d/目录下,并改名为haproxy
cd /etc/init.d/
chmod +x haproxy #增加文件的执行权限
chkconfig --add /etc/init.d/haproxy #把haproxy加入系统服务管理中
service haproxy start 或 /etc/init.d/haproxy start #启动haproxy
访问测试
4.日志管理
默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,要将haproxy的info及notice日志分别记录到不同的日志文件中。(其他级别的日志仍记录在系统日志/var/log/messages中;因为error日志较少,故一般不做分离)
修改rsyslog配置,将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
cd /var/log/
mkdir haproxy #创建haproxy日志文件的存放目录/var/log/haproxy
vim /etc/rsyslog.d/haproxy.conf #在rsyslog.d目录下自定义haproxy.conf配置文件,在文件中写入日志管理的操作,在rsyslog服务工作时,会自动加载rsyslog.d目录中的文件
if ($programname == 'haproxy' and $syslogseverity-text == 'info') #该文件中的变量均为系统变量
then -/var/log/haproxy/haproxy-info.log
&~ #"&~"表示当日志写入到日志文件后,rsyslog停止处理这个信息。
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
:wq保存退出
systemctl restart rsyslog.service #重启日志服务
访问查看,同时tail -f /var/log/haproxy/haproxy-info.log 追踪日志文件(可以不断刷新页面,查看日志记录信息)
总结
- 防火墙(当访问不到页面,第一时间检查防火墙)
- haproxy.cfg文件的参数配置,global和default共有的参数,其在default中的设置不能超出global中的设置
- 各参数需要稍微上点心去记一记其代表的含义,尤其是失败重试、超时时间等参数信息
- 日志分离管理中,对日志消息的级别的控制,可以参考我以前的文章有写