haproxy的简述
HAProxy(High Availability Proxy)是一个高性能、高可靠性的负载均衡器和代理服务器,广泛应用于Web和TCP应用中。在七层(应用层)代理模式下,HAProxy主要负责将客户端的HTTP请求分发到后端服务器池中的各个服务器,从而实现负载均衡和服务高可用性。七层模型指的是OSI(开放式系统互联)模型,它将网络通信分为七个层次。HAProxy作为七层代理,主要涉及其中的最高三层,即传输层(第四层)、会话层(第五层)和应用层(第七层)。下面是主要三层的简要介绍:
传输层(Layer 4 - Transport Layer):
在传输层,HAProxy可以作为TCP代理,负责建立和维护与客户端和后端服务器之间的TCP连接。在这个层次上,HAProxy主要关注连接的建立和数据的可靠传输,而不关心具体的应用协议(如HTTP、FTP等)。
会话层(Layer 5 - Session Layer):
在会话层,HAProxy可以进行会话管理和会话持久化。例如,它可以使用Cookie或其他标识符来跟踪客户端的会话,确保同一个会话的所有请求都被定向到同一台后端服务器。这在需要保持会话状态的应用中非常重要,如在线购物车、用户登录等。
应用层(Layer 7 - Application Layer):
在应用层,HAProxy主要处理HTTP/HTTPS协议的请求和响应。它可以解析HTTP报文,进行URL重写、内容修改、SSL卸载等操作。HAProxy还可以根据HTTP头部信息(如Host、User-Agent等)进行智能路由,实现虚拟主机和内容分发等功能。
虽然HAProxy主要在第四层和第七层发挥作用,但它也支持跨层的功能,如TCP和HTTP混合模式,以满足不同应用场景的需求。通过这些层次的处理,HAProxy能够提供高效、可靠的负载均衡和代理服务,帮助运维人员构建高可用、高性能的网络应用。
整体架构流程
HAProxy(High Availability Proxy)作为七层代理,其基本架构主要包括以下几个核心组件:
-
前端(Frontend):前端定义了HAProxy监听的网络接口和端口,以及接收的客户端请求。前端可以配置多个监听地址和端口,支持SSL/TLS加密通信。
-
后端(Backend):后端定义了一组服务器(即后端服务器),这些服务器共同处理来自前端的请求。每个后端可以包含多台服务器,支持负载均衡和健康检查功能。
-
服务器(Server):服务器是指具体的后端服务器,它们负责处理实际的业务请求。每台服务器都有自己的IP地址和端口,并可以配置权重、健康检查参数等。
-
负载均衡算法:HAProxy支持多种负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)、IP哈希(IP Hash)等,用于决定将请求分发到哪一台后端服务器。
-
健康检查:HAProxy支持对后端服务器进行定期的健康检查,确保只有健康的服务器才能接收请求。健康检查可以通过TCP、HTTP等方式进行。
-
会话持久化:为了保证某些需要会话状态的应用的正常工作,HAProxy支持会话持久化功能,确保同一个客户端的请求能够被定向到同一台后端服务器。
-
日志和监控:HAProxy提供了详细的日志记录和监控功能,可以通过日志文件、统计数据页面等方式查看系统的运行状态和性能指标。
配置文件结构
HAProxy的配置文件通常分为三个部分:
- 全局配置(Global Configuration):定义全局参数,如日志级别、日志文件位置、运行用户和组等。
- 前端配置(Frontend Configuration):定义监听的网络接口和端口,以及相关的安全策略和负载均衡参数。
- 后端配置(Backend Configuration):定义后端服务器池,以及负载均衡算法、健康检查参数等。
示例配置
以下是一个简单的HAProxy配置示例:
global
log /dev/log local0
log /dev/log local1 notice
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend my_frontend
bind *:80
default_backend my_backend
backend my_backend
balance roundrobin
server server1 192.168.1.10:80 check
server server2 192.168.1.11:80 check
在这个示例中,HAProxy监听所有网络接口的80端口,并将请求分发到两台后端服务器(192.168.1.10和192.168.1.11),采用轮询算法进行负载均衡,并进行健康检查。
总之,HAProxy的七层代理架构通过灵活的配置和强大的功能,实现了高效的负载均衡和高可用性,是运维中不可或缺的工具。
技术介绍(理论)
负载均衡
1.1.什么是负载均衡
负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均
衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了
公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
1.2.为什么用负载均衡
Web服务器的动态水平扩展–>对用户无感知
增加业务并发访问及处理能力–>解决单服务器瓶颈问题
节约公网IP地址–>降低IT支出成本
隐藏内部服务器IP–>提高内部服务器安全性
配置简单–>固定格式的配置文件
功能丰富–>支持四层和七层,支持动态下线主机
性能较强–>并发数万甚至数十万
四层负载均衡
七层负载均衡
四层和七层的区别
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决
定怎么样转发流量
四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负
载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪
台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理
七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比
如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的
URL、浏览器类别、语言来决定是否要进行负载均衡。
1.分层位置: 四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2.性能 : 四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用 层报文消息内容,识别URL、Cookie、HTTP header等信息。、
3.原理 : 四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。
4.功能类比 :四层负载均衡类似于路由器;七层类似于代理服务器。
5.安全性: 四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击
总结: 四层负载均衡(TCP/UDP)主要基于源IP地址和源端口进行会话持久化,而七层负载均衡(HTTP/HTTPS)则可以根据请求的URL、HTTP头部等更细粒度的信息进行负载均衡和会话跟踪。
haproxy的基本配置信息
HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置 frontend:前端,相当于nginx中的server
{} backend:后端,相当于nginx中的upstream {} listen:同时拥有前端和后端配置,配置简单,生产推荐使用
基本配置参数
多进程和socket文件配置
在HAProxy中,多进程和socket文件的配置是关键的性能和管理优化手段。
-
多进程配置:
HAProxy可以通过配置nbproc
参数来指定启动的HAProxy进程数量。多进程模式可以提高HAProxy处理并发连接的能力,特别是在多核CPU环境下。每个进程独立运行,共享相同的配置文件,但拥有各自的内存空间和文件描述符。这样可以充分利用多核处理器的计算能力,同时降低单点故障的风险。在HAProxy的配置文件中,可以在
global
段落中设置nbproc
参数:global nbproc 4 # 指定启动4个HAProxy进程
-
Socket文件配置:
Socket文件是HAProxy用于与外部管理工具通信的一种方式。通过Unix域套接字,HAProxy可以接收来自客户端的管理指令,比如查看状态、统计信息、更改配置等。配置stats socket
参数可以指定socket文件的路径和权限。在HAProxy的配置文件中,可以在
global
或特定的listen
段落中设置stats socket
参数:global stats socket /var/run/haproxy.sock # 指定socket文件路径 stats socket mode 600 # 设置socket文件权限为600 stats socket level admin # 设置访问socket文件所需的权限级别为admin
通过配置
stats socket
,可以实现对HAProxy的监控和管理,比如通过haproxy
命令行工具或其他监控系统来获取实时的统计数据和健康状况。
综上所述,多进程配置和socket文件配置都是HAProxy中非常重要的配置选项,它们分别用于提升性能和提供管理接口。通过合理配置这两个参数,可以有效提高HAProxy的可靠性和管理效率。
大致配置如下:
vim /etc/haproxy/haproxy.cfg
...上面内容省略...
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 100000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1 #
启用多个sock文件
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
nbproc 2 #启用多进程
cpu-map 1 0 #进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗
cpu-map 2 1 #2 表示第二个进程,1表示第二个cpu核心
nbthread 2 # # 启用多线程
保存退出之后可以使用
pstree -p | grep haproxy
来查看更多的进程
易混淆点nbthread 与 nbproc
nbthread和nbproc是两个重要的参数,它们分别用于控制HAProxy进程中的线程数和进程数。
nbthread:
这个参数用来设置每个HAProxy工作进程中的线程数量。当设置为2时,表示每个HAProxy工作进程会有两个线程来处理网络连接和数据传输。多线程可以在多核CPU上更好地并行处理任务,提高效率。nbproc:
这个参数用来设置HAProxy工作的进程数量。当设置为2时,表示HAProxy会启动两个工作进程。多进程可以提高系统的可靠性和性能,特别是在多核CPU环境下,每个进程可以绑定到不同的CPU核心上。总结:
nbthread关注的是每个HAProxy进程内部的并行处理能力。
nbproc关注的是HAProxy整体的并发处理能力,以及进程间的隔离和容错。
在实际配置中,根据系统的CPU核心数和业务负载情况合理设置这两个参数,可以有效提升HAProxy的性能和稳定性。
haproxy的状态界面简介
vim /etc/haproxy/haproxy.cfg
在这里插入代码片listen stats # 定义一个名为 "stats" 的监听块,用于提供统计信息
mode http # 设置此监听块的模式为 HTTP,适用于处理 HTTP 请求
bind 0.0.0.0:8888 # 绑定到所有网络接口的 8888 端口,允许外部访问
stats enable # 启用统计页面的功能
log global # 使用全局定义的日志格式和目标
stats uri /haproxy-status # 设置统计页面的 URI 为 "/haproxy-status"
stats auth lee:lee # 设置统计页面的认证信息,用户名为 "lee",密码也为 "lee"
proxies配置
理论
大致参数如下
socat 工具
概念:
socat
是一个多功能的网络工具,其名称来源于“Socket CAT”。它可以看作是netcat
的增强版本,具