当前位置: 首页 > news >正文

haproxy是什么?以及haproxy基础实验

目录

一、什么是负载均衡?

二、为什么要用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全局锁定运行目录defaultsproxies默认配置项,针对以下的frontend、backend和listen生效, 可以多个name也可以没有name
deamon全局以守护进程运行frontendproxies前端servername,类似于Nginx的一个虚拟主机server和LVS服务集群。
user, group, uid, gid全局运行haproxy的用户身份backendproxies#后端服务器组,等于nginx的upstream和LVS中的RS服务器作用
stats socket全局套接字文件listenproxies#将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博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Shiro-721 分析
  • 利用数据库编码特性绕过
  • vue 打包时候的分包
  • 告别手写CRUD通过Springboot+mybatis-plug 实现任意表Crud从Controller开始不需要手写一行代码
  • sql注入实战——thinkPHP
  • Unity入门3——脚本入门
  • 基于SpringBoot+Vue社团管理系统的设计与实现
  • cisp-pte考试复盘
  • C# 根据MySQL数据库中数据,批量删除OSS上的垃圾文件
  • Linux(离线)内网部署 thingsboard-gateway 网关实战modbus通讯
  • 【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库
  • Python | Leetcode Python题解之第329题矩阵中的最长递增路径
  • 手写Redis缓存系统,第三章:持久化-增加可靠性
  • SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)
  • Linux-Shell入门-05
  • 分享一款快速APP功能测试工具
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Gradle 5.0 正式版发布
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java方法详解
  • Java深入 - 深入理解Java集合
  • Java-详解HashMap
  • java中的hashCode
  • LintCode 31. partitionArray 数组划分
  • oldjun 检测网站的经验
  • 初探 Vue 生命周期和钩子函数
  • 工作中总结前端开发流程--vue项目
  • 机器学习中为什么要做归一化normalization
  • 数组的操作
  • Hibernate主键生成策略及选择
  • # Redis 入门到精通(七)-- redis 删除策略
  • #define,static,const,三种常量的区别
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (04)odoo视图操作
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)hibernate配置管理
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (接口封装)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • ***监测系统的构建(chkrootkit )
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Standard 的管理策略
  • .NET 快速重构概要1
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .net中应用SQL缓存(实例使用)
  • [2018-01-08] Python强化周的第一天
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [AIGC 大数据基础]hive浅谈
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Android 数据通信] android cmwap接入点
  • [BJDCTF 2020]easy_md5
  • [C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波
  • [C++]Leetcode17电话号码的字母组合