Haproxy概述
ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
Haproxy的特点
haproxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。
- 支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
- 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
- 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
- 拥有一个功能出色的监控页面,实时了解系统的当前状况。
- 功能强大的ACL支持,给用户极大的方便。
Haproxy算法
1.roundrobin 基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.
2.static-rr 基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
3.leastconn 新的连接请求被派发至具有最少连接数目的后端服务器.
Haproxy Nginx环境介绍(基于Centos7.x)
Server1 | 192.168.179.101 | Haproxy |
Server2 | 192.168.179.102 | Web Server Nginx1 |
Server3 | 192.168.179.104 | Web Server Nginx2 |
Haproxy的安装
#Centos7环境下安装你的haproxy软件
[root@master ~]# yum install epel* haproxy -y
#我这里不演示keepalived,后面博客演示,这里只有一台haproxy,没有backup haproxy
[root@localhost ~]# hostnamectl set-hostname master 192.168.179.101 haproxy
Nginx安装部署
#192.168.179.103 104上部署Nginx
systemctl stop firewalld && setenforce 0
wget -c http://nginx.org/download/nginx-1.16.1.tar.gz
mv nginx-1.16.1.tar.gz /usr/src/
cd /usr/src/
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-devel
./configure --prefix=/usr/local/nginx
make && make install
/usr/local/nginx/sbin/nginx
#修改主机名
[root@localhost ~]# hostnamectl set-hostname real-server1 192.168.179.103 nginx
[root@localhost ~]# hostnamectl set-hostname real-server2 192.168.179.104 nginx
#为了负载均衡结果更加清晰展示,修改html页面内容
[root@real-server1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@real-server1 ~]# echo "this is http server nginx 192.168.179.103" > /usr/local/nginx/html/index.html
[root@real-server1 ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 0;
[root@real-server2 ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 0;
[root@real-server2 ~]# echo "this is http server nginx 192.168.179.104" > /usr/local/nginx/html/index.html
[root@real-server2 ~]# /usr/local/nginx/sbin/nginx -s reload
Haproxy配置配置文件
[root@master ~]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4096
user haproxy
group haproxy
daemon
nbproc 1
defaults
mode http
log global
retries 3
option redispatch
timeout connect 60000
timeout client 60000
timeout server 60000
listen stats
bind *:81
stats enable
stats uri /haproxy
stats auth lulei:123
log 127.0.0.1 local2 err
stats admin if TRUE
stats hide-version
stats refresh 30s
frontend web
mode http
bind *:80
option httplog
log global
option forwardfor
option httpclose
acl html url_reg -i \.html$
use_backend httpservers if html
default_backend httpservers
backend httpservers
option redispatch
option abortonclose
cookie SERVERID SERVERID insert indirect nocache
server http1 192.168.179.103:80 maxconn 2000 cookie server1 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.179.104:80 maxconn 2000 cookie server2 weight 1 check inter 1s rise 2 fall 2
Haproxy配置详解
global部分:
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4096
user haproxy
group haproxy
daemon
nbproc 1
□ log:全局的日志配置,local0是日志设备,info 表示日志级别。其中日志级别有err、warning、info、debug四种可选。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为 info
log指定收集哪个机器的log,log的收集是通过系统工具来实现的,在centos6版本之前以syslog来收集日志,6版本变为了rsysylog。这些都是用于收集系统的日志,local 0指定设备,info表示输出日志的级别,error级别是在报错的时候才会输出。info只要有正常信息都会进行输出
口 maxconn:设定每个haproxy进程可接受的最大并发连接数,此选项等同于Linux命令行选项"ulimit -n"
maxconn:可接受的最大并发连接数(不是最大连接数),注意是针对haproxy进程来说的,相当于操作系统的ulimit -n,如果设置了maxconn 4096,那么linux ulimit -n 也要设置为大于等于4096
口 user/group:设置运行haproxy进程的用户和组,也可使用用户和组的uid和gid值来替代
口 nbproc:设置HAProxy启动时可创建的进程数,此参数要求将 HAProy运行模式设
置为"daemon",默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的CPU核数。创建多个进程能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃。
nbproc 1 #工作进程数量 cpu内核是几就写几
这个参数重要,设置haproxy启动的进程数。默认值是1,默认启动一个进程,如果访问量比较大需要将该值增加,这个值大小一般建议设置小于服务器cpu的核数,这个核数是物理核不是逻辑核,如两个4核cpu那就是8个核,也就是这个值最多设置为8,而不是通过超线程来实现。
创建过多的进程并不一定会有好的效果,进程数不能太大,也不能太小,最大不要超过cpu核数
创建过多的进程并不一定会有好的效果,进程数不能太大,也不能太小,最大不要超过cpu核数
口 pidfle:指定haproxy进程的pid文件,启动进程的用户必须有访问此文件的权限
default部分:
口 mode∶设置HAPoy实例默认的运行模式,有tcp、http、heath三个可选值。
口 tcp模式∶在此模式下,客户端和服务器端之间将建立一个全双工的连接,不
会对七层报文做任何类型的检查,默认为tcp模式,经常用于sSL、SSH、SMTP 等应用。
口 http模式∶在此模式下,客户端请求在转发至后端服务器之前将会被深度分析,
所有不与 RFC格式兼容的请求都会被拒绝。
口 health模式∶目前此模式基本已经废弃,不在多说。
口 retres∶设置连接后端服务器的失败重试次数。连接失败的次数如果超过这里设置
的值,HAProy 会将对应的后端服务器标记为不可用。此参数也可在后面backend部分进行设置.
#健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
口 timeout connect∶haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间
口 timeout client∶与客户端的最长空闲时间,定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间
口 timeout server∶定义haproxy与上游服务器非活动连接的超时时间
口 timeout http-keep-alive:使用keepAlive连接
contimeout 5000:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。
clitimeout 3000:设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。
srvtimeout 3000:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。
fronted部分 :
这是HAProxy 配置文件的第三部分—fronted部分的配置
这部分通过 frortend 关键字定义了一个名为"web"的前端虚拟节点,下面介绍每个选项的含义。
口 bind *:81 监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似
口 option httplog∶option httplog默认情况下haproxy不会记录http请求的,这不便于haproxy出现问题时候的排查与监控,这个就是记录http请求的日志,这个参数比较重要建议打开。
口 option forwardfor:HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。(记录客户端IP在X-Forwarded-For头域中)如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
口 option httpclose #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
口 log global∶表示使用全局的日志配置,这里的"global"表示引用在HAPoxy配置文件global部分中定义的log选项配置格式
口defaut backend∶指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义
口 acl html url_reg -i \.html$:acl策略配置
口 use_backend httpservers if html acl策略匹配相应
backend部分:backend用于定义一个名称为htmpool的后端服务器组,根据需要可以定义多个
backend httpservers
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID SERVERID insert indirect nocache
option httpchk GET /index.html
server http1 192.168.179.103:80 maxconn 2000 cookie server1 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.179.104:80 maxconn 2000 cookie server2 weight 1 check inter 1s rise 2 fall 2
- option redispatch
此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入cookie中,以保证会话的session持久性。而如果后端服务器出现故障,客户端的cookie是不会刷新的,这就会造成无法访问。此时,如果设置了此参数,就会将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常
- option abortonclose
此参数可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接
- HAProxy支持的负载均衡算法:
roundrobin
基于权重进行轮叫调度的算法
static-rr
基于权重进行轮叫调度的算法,不过此算法为静态算法,在运行时调整其服务器权重不会生效
source
基于请求源IP的算法。此算法先对请求的源IP进行HASH运算,然后将结果与后端服务器的权重总数相除后转发至某台匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终转发到某特定的后端服务器
leastconn
此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法 ,例如数据库负载均衡
uri
此算法会对部分或整个URI进行HASH运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上
uri_param
此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数据不变时,同一个用户的请求始终分发到同一台机器上
hdr
此算法根据HTTP头进行转发,如果指定的HTTP头名称不存在,则使用roundrobin算法 进行策略转发
- cookie SERVERID
表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义
- option httpchk GET /index.html
心跳检测的文件
- server http1 192.168.179.103:80 maxconn 2000 cookie server1 weight 1 check inter 1s rise 2 fall 2
服务器定义,cookie 1表示serverid为server1,check inter 1s是检测心跳频率,rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
- server http2 192.168.179.104:80 maxconn 2000 cookie server2 weight 1 check inter 1s rise 2 fall 2
服务器定义,cookie 1表示serverid为server2,check inter 1s是检测心跳频率,rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
Haproxy 日志的配置
两台机器都配置haproxy的日志:需要打开注释并添加 (如果有backup,backup上面也需要配置)
[root@master ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
$ModLoad imudp
$UDPServerRun 514
找到 #### RULES #### 下面添加
local2.* /var/log/haproxy.log
[root@master ~]# systemctl restart rsyslog
[root@master ~]# systemctl restart haproxy
[root@master ~]# tail -f /var/log/haproxy.log #实时查看日志
Jul 15 05:00:13 master systemd: Stopping HAProxy Load Balancer...
Jul 15 05:00:13 master haproxy-systemd-wrapper: haproxy-systemd-wrapper: exit, haproxy RC=0
Jul 15 05:00:13 master systemd: Started HAProxy Load Balancer.
Jul 15 05:00:13 master systemd: Starting HAProxy Load Balancer...
Jul 15 05:00:13 localhost haproxy[16683]: Proxy stats started.
Jul 15 05:00:13 localhost haproxy[16683]: Proxy web started.
Jul 15 05:00:13 localhost haproxy[16683]: Proxy web started.
Jul 15 05:00:13 localhost haproxy[16683]: Proxy httpservers started.
Jul 15 05:00:15 localhost haproxy[16684]: Connect from 192.168.179.4:57940 to 192.168.179.101:81 (stats/HTTP)
测试是否配置成功查看结果