目录
Haproxy
Haproxy和LVS的区别
LVS
Haproxy
代理和调度的区别
Haproxy调度算法原理
案例
拓扑图
Web服务器配置
Haproxy配置
安装Haproxy
Haproxy初步设置
Haproxy配置
配置文件各行说明
监听项配置
启动Haproxy
测试
配置Haproxy日志
Haproxy
Haproxy是一种集群调度工具,可以提供高可用性、负载均衡、基于TCP和HTTP应用的代理软件
Haproxy和LVS的区别
-
LVS
- LVS在企业应用中抗负载能力强,但存在缺陷
- LVS不支持健康状态检查和动静分离
- 对于大型网站,LVS的实施配置复杂,维护成本相对较高
- 支持4层代理
-
Haproxy
- 适用于负载大的Web站点
- 运行在硬件上可支持数以万计的并发连接请求
- 支持4层和7层代理
代理和调度的区别
Haproxy是代理,而LVS是调度
- 代理:代替后端服务器接收客户端的请求,并不解析,而是转交给后端服务器
- 调度:调度器收到客户端的请求调度给后端服务器,后端服务器把结果直接返回给客户端
Haproxy调度算法原理
- RR(Round Robin)
- 轮询调度,轮流分配请求给每个后端服务器
- 适用于每个后端服务器性能差别不大的情况
- LC(Least Connections)
- 最小连接数,根据后端服务器建立连接的数量动态分配前端请求
- 适用于每个后端服务器性能差别大的情况
- SH(Source Hashing)
- 基于源IP、Cookie等的进行调度
- 适用于一些有Session会话记录在服务器端的场景,可以基于源IP和Cookie等属性做集群调度
- 每次调度器收到请求后,检测源地址生成哈希值,根据哈希值辨别该地址上次请求连接的服务器,分配该请求给上次连接的服务器(会话保持)
会话:会话是客户端登录服务器后,服务器向客户端发送的cookie,短时间内再访问该服务器就无需进行身份验证
案例
拓扑图
操作系统 | IP 地址 | 角色 |
CentOS | 192.168.10.101 | Haproxy服务器 |
CentOS | 192.168.10.102 | Web服务器 |
CentOS | 192.168.10.102 | Web服务器 |
CentOS或Windows | 192.168.10.104 | 访问网站测试 |
Web服务器配置
打开所有主机并连接上XShell
两个Web服务器的配置基本一致,因此先开启全部会话同步,然后单独关闭101(Haproxy)的会话同步
在102(Web服务器①)操作
关闭防火墙和内核安全机制,安装Apache网站服务
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
关闭会话同步
在102(Web服务器①)操作
先关闭会话同步,然后为两个Web服务器添加不同的网页内容
[root@localhost ~]# echo "Test Web 01" > /var/www/html/index.html
在102(Web服务器①)操作
[root@localhost ~]# echo "Test Web 02" > /var/www/html/index.html
Haproxy配置
安装Haproxy
在101(Haproxy服务器)操作
这里我们使用源码包安装Haproxy,导入Haproxy源码包
在安装Haproxy之前需要先提供开发环境
为了方便实验关闭防火墙和内核安全机制,安装Haproxy所需的开发环境
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc*
解压源码包,进入解压目录
Haproxy的源码包在安装时,编译的时候需要指定当前系统的内核版本,可以先使用uname -r查看当前内核版本,然后make编译,make install安装
[root@localhost ~]# tar zxvf haproxy-1.5.19.tar.gz
[root@localhost ~]# cd haproxy-1.5.19
[root@localhost haproxy-1.5.19]# uname -r
6.9.1-1.el7.elrepo.x86_64
[root@localhost haproxy-1.5.19]# make TARGET=linux26
[root@localhost haproxy-1.5.19]# make install
# Haproxy的命令放到了/usr/local/sbin/
- linux26:内核的版本为2.6或更高
Haproxy初步设置
然后进入解压目录下的example子目录,在/etc下新建一个目录,用来存放Haproxy的配置文件。拷贝配置文件
[root@localhost haproxy-1.5.19]# cd examples/
[root@localhost examples]# mkdir /etc/haproxy
[root@localhost examples]# cp haproxy.cfg /etc/haproxy/
为了方便在系统中使用Haproxy,拷贝服务脚本到管理服务的目录下,并且重命名把后缀去掉,然后为该脚本添加执行权
使用chkconfig命令将Haproxy添加为系统服务,注意--add选项指定的服务名称对应的是/etc/init.d/目录下服务脚本的名称
[root@localhost examples]# cp haproxy.init /etc/init.d/haproxy
[root@localhost examples]# chmod +x /etc/init.d/haproxy
[root@localhost ~]# chkconfig --add haproxy
[root@localhost ~]# chkconfig haproxy on # 开机自启
拷贝命令文件,使其他程序也能找到Haproxy的命令
[root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/
Haproxy配置
打开Haproxy配置文件
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
配置文件各行说明
先删除26行以下的内容,然后这里讲解一下配置文件中的参数
global # 全局配置项,如果与default的冲突了,应用default的参数
log 127.0.0.1 local0 # 配置日志记录,local0为日志设备,默认是系统日志
log 127.0.0.1 local1 notice # 日志级别为notice
#log loghost local0 info
maxconn 4096 # 最大连接数
chroot /usr/share/haproxy # 禁锢目录,存放Haproxy运行时的数据目录,需要创建出来或把该行注释掉才能启动Haproxy
uid 99 # 用户uid
gid 99 # 用户gid
daemon # 以守护进程的方式运行
#debug # 调试模式,输出启动信息到标准输出
#quiet # 安静模式,启动时无输出
defaults # 默认配置项
log global # 使用globle中定义的日志
mode http # 模式为http
option httplog # 采用http的格式记录日志
option dontlognull # 保证Haproxy不记录上级负载均衡发送过来的用于检测状态数据的心跳包
retries 3 # 检查节点连接失败的次数,超过3次认为节点不可用
#redispatch # 当负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 # 最大连接数
contimeout 5000 # 连接超时时间ms
clitimeout 50000 # 客户端超时时间ms
srvtimeout 50000 # 服务器超时时间ms
listen webcluster 0.0.0.0:80 # 定义群集和监听的端口号
option httpchk GET /index.html # 检查服务器的index.html文件,心跳检测URL设置
balance roundrobin # 调度算法为轮询
server inst1 192.168.1.61:80 check inter 2000 fall 3 # 定义在线节点
server inst2 192.168.1.62:80 check inter 2000 fall 3
# check inter 2000是检测心跳频率(每2000ms检测一次),fall 3是3次失败认为服务器不可用
在新版本中,超时的设置做了调整,具体如下
contimeout 被 timeout connect取代:定义haproxy将客户端请求转发至后端服务器所等待的超时时长
clitimeout 被 timeout client取代:客户端非活动状态的超时时长,是 app 连接 haproxy的时间
srvtimeout 被 timeout server取代:客户端与服务器端建立连接后,等待服务器端的超时时长,是haproxy 连接后端web服务器的时间
监听项配置
在Haproxy配置文件中,分为全局配置选项,默认配置选项,还有监听项
因为刚才我们删除了Haproxy提供的监听项模板,这里我们添加自己的监听项参数
在第26行之后添加以下内容,保存退出
listen myweb 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.10.102:80 check inter 2000 fall 3 weight 1
server inst2 192.168.10.103:80 check inter 2000 fall 3 weight 2
Haproxy的特点包含了能够给后端服务器做健康状态检查
如果检测的类型是网站(httpchk),就是给该网站发送请求,这里指定为GET请求,然后指定想要访问的网页文件
roundrobin:指定的调度算法,轮询
inst1:实例名,可以自由定义
check inter 2000:心跳频率检查,单位是毫秒 (ms)
weight:指定权重值,请求分发的次数
fall:检测次数
启动Haproxy
注意配置文件中的参数:chroot /usr/share/haproxy:存放Haproxy运行时的数据目录,需要创建出来或把该行注释掉
启动服务
[root@localhost ~]# systemctl start haproxy
测试
在104(客户端)操作
使用curl命令测试,这里使用Haproxy服务器的IP来访问(代理)
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 01
配置Haproxy日志
在102(Web服务器①)操作
此时如果去查看某个Web服务器的访问日志就可以发现访问的IP都是代理服务器的IP
[root@localhost httpd]# tail /var/log/httpd/access_log
192.168.10.101 - - [07/Aug/2024:10:22:07 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
192.168.10.101 - - [07/Aug/2024:10:22:09 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
192.168.10.101 - - [07/Aug/2024:10:22:11 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
在101(Haproxy服务器)操作
Haproxy的日志需要手动配置才能生成
修改配置文件,在全局配置选项添加下方内容
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
log 127.0.0.1 local3 # 添加该行
新建Haproxy配置日志的文件,添加下方内容
使用rsyslog服务的udp-514端口接收local3的日志,存放在/var/log/haproxy.log文件中
[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
imudp:用于接收日志
因为修改了配置文件,重启rsyslog和Haproxy服务
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy
在104(客户端)操作
来到客户端访问几次,让日志生成信息
[root@localhost ~]# curl 192.168.10.101
Test Web 01
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 01
在101(Haproxy服务器)操作
最后来到在rsyslog配置文件中指定local3的位置就可以看到生成的文件,文件内也生成了日志信息了
[root@localhost ~]# cd /var/log/
[root@localhost log]# ls
haproxy.log
[root@localhost log]# cat haproxy.log
Aug 7 16:27:00 localhost haproxy[12499]: Proxy myweb started.
Aug 7 16:27:13 localhost haproxy[12500]: 192.168.10.104:49790 [07/Aug/2024:16:27:13.957] myweb myweb/inst1 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Aug 7 16:27:14 localhost haproxy[12500]: 192.168.10.104:49796 [07/Aug/2024:16:27:14.644] myweb myweb/inst2 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Aug 7 16:27:14 localhost haproxy[12500]: 192.168.10.104:49808 [07/Aug/2024:16:27:14.904] myweb myweb/inst1 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"