haproxy是一款高性能的负载均衡软件,主要做七层负载均衡使用,也支持四层负载均衡。
七层负载均衡:使用的是7层http协议;
四层负载均衡:使用的是tcp协议加端口的方式。
因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。
①支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
②支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在③的负载均衡算法,适用各种需求。
④性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。
⑤拥有一个功能出色的监控页面,实时了解系统的当前状况。
功能强大的ACL支持,给用户极大的方便。
①LVS基于Linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡
②LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和Http应用的负载均衡综合解决方案
③LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态监测方式
④Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡
⑤Nginx主要用于web服务器或缓存服务器
去官方文档查看haproxy的负载均衡调度算法
算法有很多,这里介绍常用的几种:
基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
新的连接请求被派发至具有最少连接数目的后端服务器.
将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器.
共需四台虚拟机:
虚拟机1,虚拟机2:安装nginx,作为真正的web服务器。
虚拟机3:安装haproxy,实现haproxy的负载均衡。
虚拟机4:客户端,用于测试整个集群,无需任何配置。
虚拟机1进行如下操作:
安装并开启nginx,并在nginx默认发布目录中写入测试内容
[root@web-1 ~]# yum -y install nginx
[root@web-1 ~]# systemctl start nginx
[root@web-1 ~]# echo web-1 > /usr/share/nginx/html/index.html
虚拟机2进行如下操作:
同虚拟机1 的操作一样
[root@web-2 ~]# yum -y install nginx
[root@web-2 ~]# systemctl start nginx
[root@web-2 ~]# echo web-2 > /usr/share/nginx/html/index.html
虚拟机4进行如下操作
虚拟机3做如下操作:
1)安装haproxy
[root@localhost ~]# yum -y install haproxy
2)修改haproxy的配置文件
[root@localhost ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
#先做备份
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
配置文件内容和解释如下:
global #全局配置
log 127.0.0.1 local3 #日志配置
maxconn 4096 #最大连接限制
uid nobody
gid nobody
daemon #守护进程模式
nbproc 1 #haproxy进程数
defaults #默认配置
log global #日志使用全局配置
mode http #使用七层负载均衡时指定为http
maxconn 2048 #最大连接数
retries 3 #健康检测。3次连接失败就认为服务不可用
option redispatch #服务不可用后的操作,重定向到其他健康服务器
stats uri /haproxy #web页面状态模块功能开启,
stats auth zzyy:123 #状态模块认证,设置用户和密码
contimeout 5000 #定义haproxy将客户端!!!请求!!!转发至后端服务器,所等待的超时时长
clitimeout 50000 #haproxy作为客户,和后端服务器之间!!!空闲连接!!!的超时时间,到时候发送fin指令
srvtimeout 50000 #haproxy作为服务器,和用户之间空闲连接的超时时间,到时候发送fin指令
#timeout connect 5000 #上面三条超时设置,也可以替换为下面这三条,作用相同。
#timeout client 50000
#timeout server 50000
frontend http-in #前端配置块。面对用户侧
bind 0.0.0.0:80 #面对用户监听地址和端口
mode http #http模式的负载均衡
log global #日志使用全局配置
option httplog #默认日志格式非常简陋,仅包括源地址、目标地址和实例名称,而“option httplog参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
option httpclose #每次请求完毕后,关闭http通道
acl html url_reg -i \.html$ #1. acl访问控制列表的名称设置为html。url_reg -i 指定规则:要求访问以html结尾的url时
use_backend html-server if html #2.如果满足acl html规则,则推送给后端服务器 html-server
default_backend html-server #3:默认的后端服务器是 html-server
backend html-server #后端服务器名称为html-server
mode http #设置为七层的负载均衡http
balance roundrobin #调度算法,rr轮叫调度
option httpchk GET /index.html #允许用http协议检查server 的健康
cookie SERVERID insert indirect nocache #轮询的同时,根据插入的cookie SERVERID 的值来做会话保持,将相同的用户请求,转发给相同的真实服务器。
server html-A 192.168.58.155:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server html-B 192.168.58.162:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5 #cookie 3 服务器ID,避免rr算法将客户机请求转发给其他服务器 ,对后端服务器的健康状况检查间隔为2000毫秒,连续2次健康检查成功,则认为是有效的,连续5次健康检查失败,则认为服务器宕机
3)开启haproxy
[root@localhost ~]# systemctl start haproxy
4)验证
使用虚拟机4进行验证
访问haproxy负载均衡服务器的IP地址,循环显示了两台web服务器的内容,说明haproxy负载均衡成功。
①在haproxy的配置文件中定义日志对象,语法:log 127.0.0.1(接收方IP)local3(对象),上面的配置文件中已经定义过了
②修改日志配置文件/etc/rsyslog.conf(开启UDP和TCP接口,并添加日志规则:对象.级别 存放位置)
③重启日志服务和haproxy
[root@localhost ~]# systemctl restart rsyslog [root@localhost ~]# systemctl restart haproxy
使用Keepalived实现haproxy负载均衡的高可用
共需五台虚拟机
虚拟机1,虚拟机2:安装nginx,作为真正的web服务器。
虚拟机3、虚拟机4:1、安装haproxy,实现haproxy的负载均衡。2、安装keepalived,实现负载均衡的高可用
虚拟机5:客户端,用于测试整个集群,无需任何配置。
在虚拟机1、虚拟机2中配置真正的web服务器,与第五部分实战中的配置相同。
虚拟机3与第五部分实战中的配置相同,虚拟机4的配置与虚拟机3相同。
虚拟机3,虚拟机4在上述基础上,再安装keepalived实现haproxy负载均衡的高可用。虚拟机3,虚拟机4进行操作如下,
1)安装keepalived
[root@haproxy-master ~]# yum -y install keepalived
2)编写配置文件
[root@haproxy-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
#先备份
[root@haproxy-master ~]# vim /etc/keepalived/keepalived.conf
master服务器的配置文件内容为:
! Configuration File for keepalived
global_defs {
router_id directory1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
nopreempt
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.58.140/24
}
}
backup服务器的配置文件内容为:
! Configuration File for keepalived
global_defs {
router_id directory2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
nopreempt
virtual_router_id 80
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.58.140/24
}
}
3)开启keepalived
[root@haproxy-master ~]# systemctl start keepalived
编写健康检测脚本,脚本功能是当haproxy宕机时,关闭keepalived,实现vip的漂移。虚拟机3,虚拟机4都完成下列操作。
1)脚本编写,并赋予执行权限
[root@haproxy-master ~]# vim /etc/keepalived/check_haproxy_status.sh
[root@haproxy-master ~]# ls /etc/keepalived/check_haproxy_status.sh
脚本含义:
在haproxy宕机后,先重新启动haproxy,若不能重启,就关闭keepalived。
脚本内容为:
#!/bin/bash
count=`ps -C haproxy --no-heading | wc -l`
if [ $count -eq 0 ];then
systemctl start haproxy
count=`ps -C haproxy --no-heading | wc -l`
if [ $count -eq 0 ];then
systemctl stop keepalived
fi
fi
2)在keepalived的配置文件中引入健康检测模块
[root@haproxy-master ~]# vim /etc/keepalived/keepalived.conf
3)重启keepalived
[root@haproxy-master ~]# systemctl restart keepalived
4)验证
关闭haproxy,模拟haproxy宕机,脚本生效,重新启动了haproxy。
故意将haproxy的配置文件改错,模拟haproxy不能重启的情况。
健康检测脚本生效,当haproxy宕机,并且不能重新启动时,master关闭keeplaived服务,实现vip的漂移。