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

haproxy七层代理详解之-完整安装部署流程及负载均衡实现-及热更新方法

一.负载均衡

1.1负载均衡时什么

  • 负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了衡将特定的业务(web服务、公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展

1.1.1四层负载均衡

1.1.1.1介绍

1.四层负载均衡是基于ip+port的负载均衡。

2.四层是基于三层负载均衡,发布三层的ip地址(虚拟ip),再加上四层的端口号,从而决定哪些流量需要做负载均衡。

3.四层负载均衡器也称为四层交换机,分析IP层及TCP/UDP层,但是无法解析应用层协议。

1.1.1.2原理

1.通过ip+port决定负载均衡的去向。

2.对流量请求进行NAT处理,转发至后台服务器

3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。

1.1.1.3支持4层代理的软件

1.F5:硬件负载均衡器,成本较高。

2.Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)

3.Haproxy:模拟四层转发。

4.lvs:重量级四层负载均衡器。

1.1.2七层负载均衡

1.1.2.1介绍

1.七层负载均衡器是基于虚拟的url或主机ip的负载均衡。

2.七层负载均衡在于内容的交换,即应用层报文内容的交换解析。

3.七层负载均衡器也称为七层交换机,支持四层负载均衡器的功能,且可分析应用层信息,如HTTP协议、URI、Cookie等信息

1.1.2.2原理

1.通过虚拟url或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。

2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接,

1.1.2.3支持7层代理的软件
  • Nginx:基于http协议(nginx七层是通过proxy_pass)

  • Haproxy:七层代理,会话保持、标记、路径转移等

 1.2.3四层和七层的区别

1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下

2.性能:四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用层报文消息内容,识别URL、Cookie、HTTP header等信息。

3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。

4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。

5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击

三.haproxy简介

  • HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计

haproxy安装(负载均衡软件)

实验环境

功能ip
haproxyeth0:172.25.254.100
RSeth0:172.25.254.10
RSeth0:172.25.254.20

3.1三台主机部署

webserver1

[root@webserver1 ~]# dnf install nginx -y[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.

webserver2

[root@webserver22 ~]# dnf install nginx -y[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并编辑配置文件

# 安装
[root@haproxy ~]# dnf install haproxy -y[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
frontend webcluster                # 设置前端bind *:80                      # 监听端口mode http                      # 七层use_backend webcluster-host    # 使用的后端backend webcluster-host            # 定义后端名称balance roundrobin             # 调度规则(使用的算法)server web1 172.25.254.10:80   # 后端server的ipserver web2 172.25.254.20:80#    第二种写法
#    listen webcluster
#        bind *:80
#        mode http
#        balance roundrobin
#        server web1 172.25.254.10:80
#        server web2 172.25.254.20:80[root@haproxy ~]# systemctl enable haproxy.service 
[root@haproxy ~]# systemctl restart haproxy.service

测试

后端检测

[root@webserver1 ~]# systemctl stop nginx.service 

 

 四.haproxy的基本配置信息

4.1global配置

globallog         127.0.0.1 local2        # 日志级别为2 记录在本机chroot      /var/lib/haproxy        # 设定haproxy运行目录pidfile     /var/run/haproxy.pid    # PID文件maxconn     100000                  # 最大链接数user        haproxy                 # 运行的用户group       haproxy                 # 运行的组daemon                              # 运行在后台# turn on stats unix socketstats socket /var/lib/haproxy/stats    # 状态接口# utilize system-wide crypto-policiesssl-default-bind-ciphers PROFILE=SYSTEM # 支持ssl的加密认证ssl-default-server-ciphers PROFILE=SYSTEM

4.1.1多进程和线程

启用查询多进程
# 默认为单进程
[root@haproxy ~]# pstree -p | grep haproxy|-haproxy(1925)---haproxy(1927)---{haproxy}(1928)[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg global
###省略### nbproc 2    # 启用多线程 cpu-map 1 0 # 进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗cpu-map 2 1 # 2 表示第二个进程,1表示第二个cpu核心[root@haproxy ~]# systemctl restart haproxy.service [root@haproxy ~]# pstree -p | grep haproxy|-haproxy(2042)-+-haproxy(2045)|               `-haproxy(2046)# 查看多进程
[root@haproxy ~]# pstree -p | grep haproxy|-haproxy(2030)-+-haproxy(2032)|               `-haproxy(2033)
多线程对比
[root@haproxy ~]# cat /proc/2045/status | grep -i thread
Threads:	1  # 未开启多线程
Speculation_Store_Bypass:	thread vulnerable[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg global
###省略###nbthread 2 # 开启多线程[root@haproxy ~]# systemctl restart haproxy.service [root@haproxy ~]# pstree -p | grep haproxy|-haproxy(2066)---haproxy(2068)---{haproxy}(2069)[root@haproxy ~]# cat /proc/2068/status | grep -i thread
Threads:	2
Speculation_Store_Bypass:	thread vulnerable

4.2proxies配置

4.2.1proxies参数说明

参数类型作用
defaults[]proxies默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontendproxies前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backendproxies后端服务器组,等于nginx的upstream和LVS中的RS服务器
listenproxies将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用
 4.2.1.1defaults
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg defaultsmode                    http                # 使用七层log                     global              # 日志 根据global的设定option                  httplog             # 记录http的日志option                  dontlognull         # 空链接的日志不记录option http-server-close                    # 等待客户端完整HTTP请求的时间,此处为等待10soption forwardfor       except 127.0.0.0/8  # 透传客户端真实IP至后端web服务器# 在apache配置文件中加入:<br>%{x-Forwarded-For}i# 后在webserer中看日志即可看到地址透传信息option                  redispatch          # #当server ID对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发retries                 3                   # 连接后端服务器失败次数timeout http-request    10s                 # 等待客户端请求完全被接收和处理的最长时问timeout queue           1m                  # 设置删除连接和客户端收到503或服务不可用等提示信息前的等待时问timeout connect         10s                 # 设置等待服务器连接成功的时间timeout client          1m                  # 设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间timeout server          1m                  # 设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间timeout http-keep-alive 10s                 # session会话保持超时时间,此时问段内会转发到相同的后服务器timeout check           10s                 # 对后端服务器的默认检测超时时间maxconn                 3000                # 最大能够承受的并发链接
backup使用案例 
web1
[root@webserver1 ~]# systemctl stop nginx.service web2
[root@webserver2 ~]# systemctl stop nginx.service 
###  backup 示例
[root@haproxy ~]# dnf install httpd -y[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf 
# 定位47行,修改端口号46 #Listen 12.34.56.78:8047 Listen 8080[root@haproxy ~]# systemctl enable --now  httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.[root@haproxy ~]# echo sorry 下班了 > /var/www/html/index.html[root@haproxy ~]# vim /etc/haproxy/haproxy.cfglisten webclusterbind *:80mode httpbalance roundrobinserver web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1server web_s 172.25.254.100:8080 backup
# web1和web2没有被调用的时候,调用web_s[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# curl 172.25.254.100
sorry 下班了
[root@haproxy ~]# curl 172.25.254.100
sorry 下班了
# 开启其中一台
[root@webserver2 ~]# systemctl start nginx.service # 检测
[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
 server配置
# 针对一个server配置
check #对指定rea1进行健康状态检査,如果不加此设置,默认不开启检査,只有check后面没有其它配置也可以启用检查功能# 默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查
addr <IP>             # 可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num>            # 指定的健康状态监测端口
inter <num>           # 健康状态检查间隔时间,默认2000ms
fa11 <num>            # 后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num>            # 后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight>       # 默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连
接
backup                # 将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry
Server
disabled              # 将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求redirect prefix http://www.baidu.com/ # 将请求临时(302)重定向至其它URL,只适用于http模式
redir http://www.baidu.com # 将请求临时(302)重定向至其它URL,只适用于http模式maxconn <maxconn>     # 当前后端server的最大并发连接数

4.3socat工具

  • 对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等
利用工具socat 对服务器动态权重调整
# 动态调整haproxy里面的参数
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg # turn on stats unix socketstats socket /var/lib/haproxy/stats mode 600 level admin
# mode 600:stats文件权限是600
# level admin 表示管理员权限,通过stats文件来控制haproxy文件的配置,不加admin只能看不能写[root@haproxy ~]# systemctl restart haproxy.service [root@haproxy ~]# ll /var/lib/haproxy/stats 
srw------- 1 root root 0  8月  9 11:55 /var/lib/haproxy/stats# 安装socat动态调整haproxy的参数
[root@haproxy ~]# dnf install socat -y# 查看当前集群的权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 
2 (initial 2)# 设置权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 "| socat stdio /var/lib/haproxy/stats # 查看修改成功
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 
1 (initial 2)
[root@haproxy ~]# for i in {1..10}
> do 
> curl 172.25.254.100
> done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10# 设置一台主机下线
[root@haproxy ~]# echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats [root@haproxy ~]# for i in {1..10}; do  curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20# 重新启用
[root@haproxy ~]# echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats [root@haproxy ~]# for i in {1..10}; do  curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10

针对多进程处理方法

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg global
###省略#### turn on stats unix socketstats socket /var/lib/haproxy/stats1 mode 600 level admin process 1 # haproxy多进程热处理stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2# utilize system-wide crypto-policiesssl-default-bind-ciphers PROFILE=SYSTEMssl-default-server-ciphers PROFILE=SYSTEMnbproc 2 # 多进程cpu-map 1 0cpu-map 2 1[root@haproxy ~]# systemctl restart haproxy.service [root@haproxy ~]# ll /var/lib/haproxy
总用量 0
srw------- 1 root root 0  8月 11 19:22 stats
srw------- 1 root root 0  8月 11 19:25 stats1
srw------- 1 root root 0  8月 11 19:25 stats2
http://www.lryc.cn/news/421046.html

相关文章:

  • C++11 bind
  • LeetCode199 二叉树的右视图
  • 数据赋能(172)——开发:数据挖掘——影响因素、直接作用、主要特征
  • Vue:Vue3-TypeScript-Pinia-Vite-pnpm / 基础项目 / 20240807
  • windows Qt 录屏 录音
  • AAC中的ADTS格式分析
  • iOS内存管理---MRC vs ARC
  • 【数学分析笔记】第1章第1节:集合(2)
  • 大话设计模式:七大设计原则
  • 利用多商家AI智能名片小程序提升消费者参与度与个性化体验:重塑零售行业的忠诚策略
  • Scala 闭包
  • 前端JS总结(中)
  • elasticsearch的match_phrase匹配及其可能导致的查询问题
  • C++快速理解之继承
  • Node.JS - 基础(Express)
  • I/O复用
  • 【验证可用】解决安装SQL Server数据库时,报错“启用 windows 功能 NetFx3 时出错,错误代码:-2146498298......“的问题
  • STM32的SDIO接口详解
  • docker容器常用指令,dockerfile
  • C语言学习笔记 Day11(指针--下)
  • (24)(24.2) Minim OSD快速安装指南(二)
  • GD32 MCU碰到IIC总线卡死怎么办?
  • 算法——动态规划:0/1 背包问题
  • 又是奇瑞,“统一下班时间”过去不久,最近又整新活了...
  • ubuntu24.04lts cmake编译 opencv4.5.4 contrib的一些问题
  • 大数据面试SQL(三):每分钟在线直播人数
  • python中执行mysql操作并将python脚本共享
  • HTTP、HTTPS、SOCKS5三种协议特点
  • 在ubuntu、centos、openEuler安装Docker
  • 公共命名空间的例子3