本篇博客将详细介绍该实验的高性能web服务器集群架构及环境配置流程、haproxy的七层负载均衡、cookie会话保持和haproxy状态页的配置流程和方法,通过本篇博客你将会学到haproxy的七层负载均衡集群架构,以及通过haproxy实现七层负载均衡,配置haproxy状态页实现对集群的监控,并且最终可以搭建一个可监控的高性能web服务器集群。
所有实验主机所用系统为RHEL9.3
一、实验集群架构和环境配置及流程
1.1 集群架构图

1.2 主机环境清单
本次实验总共需要4台主机,分别是
- 客户机(client),提供访问请求,一张NAT网卡,IP地址为172.25.254.99/24
- 调度器(haproxy),分发访问请求,一张NAT网卡,IP地址为172.25.254.100/24,一张仅主机网卡,IP地址为192.168.0.100/24
- 服务器1(webserver1),提供http服务,一张仅主机网卡,IP地址为192.168.0.10/24
- 服务器2(webserver2),提供http服务,一张仅主机网卡,IP地址为192.168.0.20/24
注意:服务器1和2提供服务应当一致,不过为了体现负载均衡效果,本次实验将为两台服务主机配置不同的index.html以区分
二、实验主机环境配置
2.1 客户机环境配置
1、配置网络信息
bash
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.99/24,172.25.254.2
method=manual
[root@client ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:7f:85:ef brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 172.25.254.99/24 brd 172.25.254.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::1ed8:cb9:9fd6:e061/64 scope link noprefixroute
valid_lft forever preferred_lft forever

网络配置信息如上,请自行配置
2.2 调度器环境配置
1、配置网络信息
bash
[root@HA ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=172.25.254.100/24,172.25.254.2
dns=114.114.114.114;
[root@HA ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
method=manual
address1=192.168.0.100/24
[root@HA ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:0c:d4:e1 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::59b4:be7d:31f1:5ce7/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:0c:d4:eb brd ff:ff:ff:ff:ff:ff
altname enp11s0
altname ens192
inet 192.168.0.100/24 brd 192.168.0.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::c069:c48d:8bd4:77e6/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2、调度器开启内核路由功能
bash
[root@HA ~]# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@HA ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@HA ~]# sysctl -p
net.ipv4.ip_forward = 1

2.3 服务器1/服务器2环境配置
以下仅展示服务器1,服务器2与之同理
1、网络环境配置
bash
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.0.10/24
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:c4:45:a5 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::2360:d7ac:9af2:bb39/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2、配置http服务
webserver1
bash
[root@webserver1 ~]# dnf install httpd -y
[root@webserver1 ~]# echo webserver1-192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd
webserver2
bash
[root@webserver2 ~]# dnf install httpd -y
[root@webserver2 ~]# echo webserver2-192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
以上各个主机的环境均已配置完毕,接下来进行测试确保配置没有问题
2.4 测试
测试主机之间网络通信是否有问题,测试两个webserver服务器是否可以正常提供http服务

可见各个主机之间通信,以及两个webserver主机服务都没有问题
三、调度器配置haproxy实现七层负载均衡和通过cookie实现会话保持
3.1 调度器安装启动haproxy
下载安装haproxy并设置开机自启动
bash
[root@HA ~]# dnf install haproxy -y
[root@HA ~]# systemctl enable --now haproxy
3.2 调度器配置haproxy配置文件,实现七层负载均衡
配置haproxy的配置文件,将默认的负载均衡配置注释掉后添加以下配置,配置算法为动态rr,后台两台服务器,开启健康检测,每隔3秒检测一次,若连续三次检测失败则判定不健康,标记为不可用,连续5次检测成功就重新标记为可用,设置权重为1,则两台服务器依次处理访问请求
bash
[root@HA ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster-http
bind *:80
mode http
balance roundrobin
server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1
server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1
修改过配置文件后需要重启服务
bash
[root@HA ~]# systemctl restart haproxy
3.3 测试
以上流程完成了haproxy的七层负载均衡配置,接下来通过客户机进行访问测试,确保配置正确

可见客户端访问VIP可以成功获取到后台两台服务器的服务,至此haproxy的七层负载均衡配置结束。
3.4 配置cookie会话保持
1、打开配置文件进行修改
设定webserver1主机的cookie值为web1,webserver2主机的cookie值为web2
bash
[root@HA ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
balance roundrobin
hash-type consistent
cookie WEBCOOKIE insert nocache indirect
server webserver1 192.168.0.10:80 cookie web1 check inter 3s fall 3 rise 5 weight 2
server webserver2 192.168.0.20:80 cookie web2 check inter 3s fall 3 rise 5 weight 1
配置完成后重启服务
bash
[root@HA ~]# systemctl restart haproxy.service
3.5 cookie会话保持测试
使用firefox浏览器访问测试

可见访问请求一直发给10主机
使用edge浏览器访问测试

可以看见访问请求一直被调度到20主机上
以上配置完成了基于cookie实现会话保持功能,至此该流程结束
四、配置haproxy状态页实现对集群的监控
4.1 配置状态页
重新打开haproxy的配置文件编辑状态页相关配置,并添加以下内容,配置监听4321端口,设置刷新时间为30s,设置了访问状态页的URI路径为/status,设置访问的账户密码均为admin
bash
[root@HA ~]# vim /etc/haproxy/haproxy.cfg
listen stats
mode http
bind 0.0.0.0:4321
stats enable
log global
stats refresh 30s
stats uri /status
stats auth admin:admin
配置完成后重启服务
bash
[root@HA ~]# systemctl restart haproxy
4.2 测试
浏览器访问查看是否配置成功

可见状态页已经成功监控到集群,然后关闭其中一台服务器查看状态页是否更新

可见状态页可以正常更新,至此状态页配置结束。
综上,至此本实验全部圆满完成,成功通过haproxy实现了七层负载均衡,基于cookie实现会话保持,以及配置了状态页实现对集群的监控,最终成功构建了可监控的高性能web服务器集群