目录
一、什么是负载均衡?
二、为什么要用haproxy?
三、haproxy的基本部署实验:
3.1 基本配置实验
环境准备:
详细步骤:
3.2 haproxy-多进程与多线程实验:
多进程:
多线程:
四、haproxy的全局global配置实验:
五、haproxy的proxies配置实验:server
环境准备:
实验步骤:
haproxy的工具及其算法:haproxy的工具及其算法-CSDN博客
haproxy 高级功能及配置:haproxy 高级功能及配置-CSDN博客
一、什么是负载均衡?
负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。
1.1 负载均衡的特点:
1. Web服务器的动态水平扩展
2. 增加业务并发访问及处理能力
3. 节约公网IP地址:节约成本
4. 隐藏內部服务器IP:提高内部服务器安全性
5. 配置简单
6. 功能丰富:支持四层和七层
7. 性能较强
1.2 四层负载均衡:
客户端访问服务器:修改报文头部的目标地址,修改源地址(NAT不改源地址)。
1. 通过 ip+port 决定负载均衡的去向。
2. 对流量请求进行 NAT 处理,转发至后台服务器。
3. 记录 tcp、udp 流量分别是 由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4. 支持四层的软件:
Ivs:重量级四层负载均衡器。
Nginx:轻量级四层负载均衡器,可缓存。 (nginx四层是通过upstream模块)
Haproxy:模拟四层转发。
1.3 七层负载均衡:
1. 通过虚拟 url 或主机 ip 进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2. 代理后台服务器与客户端建立连接,如 nginx 可代理前后端,与前端客户端 tcp 连接,与后端服务器建立tcp连接
3. 支持七层代理的软件:
Nginx:基于http协议(nginx七层是通过proxy_ pass)
Haproxy:七层代理,会话保持、标记、路径转移等。
1.4 四层和七层的对比:
同样性能的前提下,不涉及后端检测或者七层,选择四层更快。如果涉及到动静分离,url分析等,选择七层。
1. 分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下。
2. 性能:四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用层报文消息内容,识别URL、Cookie、HTTP header等信息。
3. 原理:四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。
4. 功能类比:四层负载均衡类似于路由器;七层类似于代理服务器(正向和反向代理)。
5. 安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击。
正向和反向代理
正向代理:翻墙,不同国家之间的请求,国家之间有防火墙,可通过其他地域的代理进行请求。
反向代理:类似于LVS。不同地点的服务器,请求可通过所在地的LVS代理,有则返回,没有则代理向服务器请求。
mode http #7层
mode tcp #4层
二、为什么要用haproxy?
LVS:没有后端检测,当后端出现问题时,LVS仍然会去访问服务停止的主机。
优点:速度快,体积小
缺点:没有后端检测,不能实现七层负载
haproxy:可以实现当后端出现问题时,会把所以流量达到正常的主机上。即可实现四层负载也可实现七层负载。
配置文件及基本参数:
HAProxy的配置文件 haproxy.cfg 由两大部分组成,分别是:
1. global:全局配置段
① 进程及安全配置相关的参数
② 性能调整相关参数
③ Debug参数
2. proxies:代理配置段
① defaults:为frontend, backend, listen提供默认配置
② frontend:前端,相当于nginx中的server {}
③ backend:后端,相当于nginx中的upstream {}
④ listen:同时拥有前端和后端配置,配置简单,生产推荐使用
global参数 | 类型 | 作用 | proxies参数 | 类型 | 作用 |
---|---|---|---|---|---|
chroot | 全局 | 锁定运行目录 | defaults | proxies | 默认配置项,针对以下的frontend、backend和listen生效, 可以多个name也可以没有name |
deamon | 全局 | 以守护进程运行 | frontend | proxies | 前端servername,类似于Nginx的一个虚拟主机server和LVS服务集群。 |
user, group, uid, gid | 全局 | 运行haproxy的用户身份 | backend | proxies | #后端服务器组,等于nginx的upstream和LVS中的RS服务器作用 |
stats socket | 全局 | 套接字文件 | listen | proxies | #将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用 |
nbproc N | 全局 | 开启的haproxy worker进程数,默认进程数是一个 | |||
nbthread 1 (和nbproc互斥) | 全局 | 指定每个haproxy进程开启的线程数,默认为每个进程一个线程 | |||
cpu-map 1 0 | 全局 | 绑定haproxy worker进程至指定CPU,将第1个work进程绑定至0号CPU | |||
cpu-map 2 1 | 全局 | 绑定haproxy worker进程至指定CPU,将第2个work进程绑定至1号CPU | |||
maxconn N | 全局 | 每个haproxy进程的最大并发连接数 | |||
maxsslconn N | 全局 | 每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下 | |||
maxconnrate N | 全局 | 每个进程每秒创建的最大连接数量 |
三、haproxy的基本部署实验:
3.1 基本配置实验
环境准备:
需要三台虚拟机
rhel9克隆:haproxy(172.25.254.100)、webserver1(172.25.254.10)、webserver2(172.25.254.20)
详细步骤:
vmset.sh为设置IP及解析
[root@haproxy ~]# cat /bin/vmset.sh
#!/bin/bash
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
address1=$2/24,172.25.254.2
method=manual
dns=114.114.114.114;
EOFchmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1hostnamectl hostname $3cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$2 $3
EOF
haproxy部分
#haproxy部分:
#vmset.sh eth0 172.25.254.100 haproxy.company.org
[root@haproxy ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:0c:29:cc:d6:59 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::e9d9:e029:7f5a:84bf/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@haproxy ~]#
#此处是在下面的webserver1和webserver2的nginx部分做完后,进行测试的
[root@haproxy ~]# curl 172.25.254.10
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.20
webserver2 - 172.25.254.20#haproxy实现LVS轮询调度
[root@haproxy ~]# dnf install haproxy -y
Complete!
[root@haproxy ~]# rpm -qc haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
[root@haproxy ~]#
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl enable haproxy.service
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
编写配置文件:
vim /etc/haproxy/haproxy.cfg
大约在69行左右,添加以下内容,选择其中一种方式,即可实现haproxy的轮询效果
webserver1部分
#webserver1部分:
#vmset.sh eth0 172.25.254.10 webserver1.company.org
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:0c:29:03:5f:47 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 172.25.254.10/24 brd 172.25.254.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::b947:4cf:357d:b67e/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@webserver1 ~]#
[root@webserver1 ~]# dnf install nginx -y
Complete!
[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
#之后进出haproxy进行curl测试
webserver2部分
#webserver2部分:
#vmset.sh eth0 172.25.254.20 webserver2.company.org
[root@webserver2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:0c:29:f6:d1:9e brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 172.25.254.20/24 brd 172.25.254.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::d9bf:66c4:33ab:9efa/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@webserver2 ~]#
[root@webserver2 ~]# dnf install nginx -y
Complete!
[root@webserver2 ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
#之后进出haproxy进行curl测试
3.2 haproxy-多进程与多线程实验:
多进程:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# pstree -p | grep haproxy|-haproxy(1586)-+-haproxy(1588)| `-haproxy(1589)
多线程:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# pstree -p | grep haproxy|-haproxy(1569)---haproxy(1571)---{haproxy}(1572)
四、haproxy的全局global配置实验:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# vim /etc/rsyslog.conf
[root@haproxy ~]# ll /var/log/haproxy.log
-rw------- 1 root root 5436 Aug 7 16:34 /var/log/haproxy.log
五、haproxy的proxies配置实验:server
环境准备:
上面实验的基础上完成该实验
10与20:
systemctl stop nginx #测试sorry提示是否出现
systemctl start nginx #测试能否访问
100:
dnf install httpd -y
实验步骤:
haproxy 部分
[root@haproxy ~]# dnf install httpd -y
[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf #将监听Listen端口改为8080
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg #见图一
[root@haproxy ~]# systemctl restart haproxy.service #首先需停止webserver1和webserver2的nginx服务
[root@haproxy ~]# curl 172.25.254.100
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
[root@haproxy ~]# echo sorry, this is down > /var/www/html/index.html
[root@haproxy ~]# systemctl restart httpd
[root@haproxy ~]# curl 172.25.254.100
sorry, this is down[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# curl 172.25.254.100
sorry, this is down
#启动webserver2的nginx服务
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# [root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
#启动webserver1和webserver2的nginx服务
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# [root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
#之后去网页测试
webserver1 部分
[root@webserver1 ~]# systemctl stop nginx.service
[root@webserver1 ~]# systemctl start nginx.service
[root@webserver1 ~]# while true; do curl 172.25.254.100; sleep 0.1; done
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
...
webserver2 部分
[root@webserver2 ~]# systemctl stop nginx.service
[root@webserver2 ~]# systemctl start nginx.service
[root@webserver2 ~]# while true
> do
> curl 172.25.254.100
> sleep 0.1
> done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
...
vim /etc/haproxy/haproxy.cfg
增加 redirect prefix http://www.baidu.com/
之后去网站访问就会自动跳转到百度了!
haproxy的工具及其算法
haproxy的工具及其算法-CSDN博客
haproxy 高级功能及配置
haproxy 高级功能及配置-CSDN博客