负载均衡haproxy配置安装以及使用详解
实验准备:基于Centos7.4 mini
HAProxy:192.168.31.77
WEB1:192.168.31.55
WEB2:192.168.31.66
HAProxy简介
(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
(2)HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
Haproxy高性能负载均衡优点:
1)HAProxy是支持虚拟主机的,可以工作在4、7层;
2)能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3)支持url检测后端的服务器;
4)它跟LVS一样,只是一款负载均衡软件,单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5)HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,HAProxy的支持多种算法。
Haproxy+Keepalived企业高性能WEB能够支持千万级并发网站,实现Haproxy高性能WEB网站架构配置步骤如下:
1、HAProxy安装
[root@localhost ~]# yum list |grep haproxy
1
[root@localhost ~]# yum -y install haproxy
2、配置HAProxy
编辑/etc/haproxy/haproxy.cfg配置文件,配置内容如下:global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon 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 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 3000 frontend main *: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 static balance roundrobin server static 127.0.0.1:4331 check backend web balance roundrobin server web1 192.168.31.66:80 check server web2 192.168.31.55:80 check
保存退出
3、启动haproxy
启动之前检查语法是否有问题,命令如下
[root@localhost ~]# haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
[root@localhost ~]# systemctl start haproxy
4、查看端口
[root@localhost ~]# netstat -lntup
2
部署后端服务器
WEB1
安装httpd服务
[root@localhost ~]# yum -y install httpd httpd-devel
写入测试页面
[root@localhost ~]# echo “192.168.31.55” >/var/www/html/index.html
启动httpd服务
[root@localhost ~]# systemctl start httpd
WEB2
安装httpd服务
[root@localhost ~]# yum -y install httpd httpd-devel
写入测试页面
[root@localhost ~]# echo “192.168.31.66” >/var/www/html/index.html
启动httpd服务
[root@localhost ~]# systemctl start httpd
访问192.168.31.77,效果如下
3
刷新两次的效果
4
默认模式为roundrobin(轮询)
5、HAProxy配置文件详解
根据功能、用途不同,其配置文件主要由5部分组成,分别为global部分,defautls部分,frontend部分、backend部分、listen部分
1)global部分:用于设置全局配置参数,属于进程级的配置,通常用操作系统配置相关
2) defaults部分:默认参数的配置部分。在些部分设置的参数,默认会自动引用到下面的frontend, backend和listen部分
3) frontend部分:用于设置接收用户请求的前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端backend
4) backend部分:用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求
5) listen部分:此部分是frontend和backend部分的结合体
配置项说明:
1) global部分
global
log 127.0.0.1 local1 info #全局的日志配置,local0是日志设备,info表示日志级别。其中日志级别有err, warning, info, debug 4种。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info
maxconn 4096 #设置每个HAProxy进程可接受的最大并发连接数
user nobody #设置启动HAProxy进程的用户和组
group nobody
daemon #设置HAProxy进程进入后台运行,这是推荐的运行模式
nbproc 1 #设置HAProxy启动时可创建的进程数,此参数要求将HAProxy运行模式设置为daemon,默认只启动一个进程;建议该值设置时小于CPU核数
pidfile
/usr/local/haproxy/logs/haproxy.pid #指定HAProxy进程ID的存放位置
2) defaults部分
defaults
mode http #设置HAProxy实例默认的运行模式,有tcp, http, health三个可选值。tcp模式:在此模式下,客户端和服务器端间将建立一个全双工的连接,不会对七层报文做任何检查,为默认的模式;经常用于SSL, SSH, SMTP等应用;http模式:在此模式下,客户端请求在转发至后端服务器前将会被深度分析,所有不与RFC格式兼容的请求都会被拒绝;
retires 3 #设置连接后端服务器的失败重试次数,如果连接失败的次数超过该数值,HAProxy会将对应的后端服务器标记为不可用
timeout connect 10s #设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他时间单位作后缀
timeout client 20s #设置连接客户端发送数据时最长等待时间,默认单位是毫秒,但也可以使用其他时间单位作后缀
timeout server 30s #设置服务器端回应客户端数据发送的最长等待时间,默认单位是毫秒,但也可以使用其他时间单位作后缀
timeout check 5s #设置对后端服务器的检测超时时间,默认单位是毫秒,但也可以使用其他时间单位作后缀
3) frontend部分
frontend www #通过frontend关键字定义了一个名为”www”的前端虚拟节点
bind *:80 #此选项用于定义一个或者几个监听的套接字,只能在frontend和listen中定义,格式如下:bind [<address>:[port_range]] [interface]
mode http
option httplog #默认情况下,HAProxy日志是不记录HTTP请求的,此选项的作用是启用日志记录HTTP请求
option forwardfor #此选项的作用是保证后端服务器可记录客户端真实的IP
option httpclose #此选项表示客户端和服务端完成一次连接请求后,HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数
log global #表示使用global段中定义的日志格式
default_backend htmpool #此选项用于指定后端默认的服务器池
4) backend部分
backend htmpool
mode http
option redispatch #此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入cookie中,以保证会话的session持久性。而如果后端服务器出现故障,客户端的cookie是不会刷新的,这就会造成无法访问。此时,如果设置了此参数,就会将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常
option abortonclose #此参数可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接
balance roundrobin #负载均衡算法
cookie SERVERID #表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义
option httpchk GET /index.php #此选项表示启用HTTP的服务状态检测功能
server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 10.1.1.2:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3#server用于定义多台后端真实服务器,不能用于frontend和listen段
5) listen部分
listen admin_status #listen部分用于配置HAProxy监控页面相关的参数
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s #设置HAProxy监控统计页面自动刷新的时间
stats uri /haproxy-status #设置HAProxy监控页面访问的URI路径
stats realm Welcome login #设置登录监控页面时,密码框上的提示信息
stats auth admin:admin #设置登录监控页面的用户名,密码。用户密码用冒号隔开,可以设置多个,每行一个
stats hide-version #设置在监控页面上隐藏HAProxy的版本号
stats admin if TRUE #设置此选项,可在监控页面上启用、禁用后端服务器,仅在1.4.9版本以后生效
6、HAProxy支持的负载均衡算法:
roundrobin:基于权重进行轮叫调度的算法
static-rr:基于权重进行轮叫调度的算法,不过此算法为静态算法,在运行时调整其服务器权重不会生效
source:基于请求源IP的算法。此算法先对请求的源IP进行HASH运算,然后将结果与后端服务器的权重总数相除后转发至某台匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终转发到某特定的后端服务器
leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法 ,例如数据库负载均衡
uri:此算法会对部分或整个URI进行HASH运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上
uri_param:此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数据不变时,同一个用户的请求始终分发到同一台机器上
hdr:此算法根据HTTP头进行转发,如果指定的HTTP头名称不存在,则使用roundrobin算法 进行策略转发。