HAProxy的理解专栏

10,472 阅读10分钟

MedusaSorcerer的博客


专栏目录

专栏详情

OSI模型讲解

OSI模型(Open System Interconnection Model )是由国际化组织提出来的概念模型, 试图提供一个能让各种不相同的计算机和世界范围内的网络实现互联的标准框架。 它将计算机网络体系结构划分为七层, 每层都可以提供抽象良好的接口。 了解OSI模型有助于理解实际上互联网络的工业标准 —— TCP/IP 协议。 OSI模型各层间关系和通讯时的数据流向如图所示:

模型名称模型介绍
物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输
链路层通过物理网络链路提供数据传输, 不同的数据链路层定义了不同的网络和协议特征, 其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控, 可以简单的理解为规定了0和1的分包形式确定了网络数据包的形式
网络层负责在源和终点之间建立连接, 可以理解为使用IPv4/IPv6确定计算机的位置
传输层向高层提提供可靠的端到端的网络数据流服务, 可以理解为每一个应用程序都会在网卡注册一个端口号, 该层就是端口与端口的通信
会话层建立、管理和终止表示层与实体之间的通信会话
表示层提供多种功能用于应用层数据编码和转化, 以确保以一个系统应用层发送的信息可以被另一个系统应用层识别, 可以理解为解决不同系统之间的通信
应用层OSI的应用层协议包括文件的传输、访问及管理协议(FTAM)以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等

常见的应用层协议:

协议端口说明
HTTP80超文本传输协议
HTTPS443HTTP+SSL认证
FTP20/21/990文件传输协议
POP3110邮局协议
SMTP25邮件传输协议
Telnet23远程终端协议

理论中OSI七层模型, 在实际系统应用中, 往往有一些被整合, 或者功能被分散到其他层中, 如TCP/IP就没有照搬OSI模型, 也没有一个公认的TCP/IP层级模型, 一般划分为三层到五层模型来描述TCP/IP协议。 每一层都和OSI模型有较强的相关性但是又可能会有交叉。

TCP/IP的设计,是吸取了分层模型的精华思想: 封装, 每层对上一层提供服务的时候, 上一层的数据结构是黑盒, 直接作为本层的数据, 而不需要关心上一层协议的任何细节。

TCP/IP分层模型以以太网上传输UDP数据包流程:

广泛意义上数据包包含两个基本元素:

名称功能
标头包含本数据包的一些说明
数据数据包的内容

而四层模型就如下所示:

模型名称模型介绍
网络接口层网络接口层包括用于协作IP数据在已有网络介质上传输的协议
它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议
提供 TCP/IP 协议的数据结构和实际物理硬件之间的接口
可以理解为:确定了网络数据包的形式
网间层网间层对应于OSI七层参考模型的网络层
本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议)
负责数据的包装、寻址和路由
同时还包含网间控制报文协议(Internet Control Message Protocol,ICMP)用来提供网络诊断信息
可以理解为:该层时确定计算机的位置
传输层传输层对应于OSI七层参考模型的传输层
它提供两种端到端的通信服务
其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务
UDP 协议(Use Datagram Protocol)提供不可靠的用户数据报服务
TCP:三次握手、四次挥手
UDP:只发不管别人收不收得到
应用层应用层对应于OSI七层参考模型的应用层和表达层

高并发负载均衡HAProxy

HAProxy是一个使用C语言编写的自由及开放源代码且可以提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层) 应用的负载均衡软件, 支持虚拟主机, 它是免费、快速并且可靠的一种解决方案, 并且适用于那些负载特大且需要持久连接或四层和七层处理机制的web站点。 作为专业的负载均衡软件, 它有如下的显著优点:

  • 单位时间内处理的最大请求数和最大数据处理能力都很大
  • 支持8中负载均衡算法, 同时也支持session会话保持
  • 从1.3版本以后, 支持连接拒绝、全透明代理等功能,而这些功能其他负载均衡器不具备
  • 拥有强大的服务器状态监控页面
  • 拥有强大的ACL支持, 支持虚拟主机

包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站, 及亚马逊网络服务系统都使用了HAProxy。

HAProxy可以通过修改balance字段的值从而修改其调度算法, balance字段应用于default, frontend, backend配置块中。

algorithm:

算法名称算法详解
roundrobin基于权重进行轮询
在服务器的处理时间保持均匀分布时, 这是最平衡, 最公平的算法
此算法是动态的, 这表示其权重可以在运行时进行调整
不过在设计上, 每个后端服务器仅能最多接受4128个连接
static-rr基于权重进行轮叫
roundrobin类似, 但是为静态方法
在运行时调整其服务器权重不会生效
不过,其在后端服务器连接数上没有限制
leastconn新的连接请求被派发至具有最少连接数目的后端服务器
在有着较长时间会话的场景中推荐使用此算法: 如LDAP、SQL等
其并不太适用于较短会话的应用层协议: 如HTTP
此算法是动态的,可以在运行时调整其权重
first第一个具有可用连接槽的服务器得到连接
这些服务器将从最小到最大的id选择
一旦一个服务器到达它的最大连接数, 下一个服务器将被使用
如果不定义每个服务器的maxconn参数, 这个算法是无意义的
使用这个算法的目的是尽量使用最小数量的服务器以便于其他服务器可以在非密集时段待机
这个算法将忽略服务器权重
source将请求的源地址进行hash运算, 并由后端服务器的权重总数相除后派发至某匹配的服务器
这可以使得同一个客户端IP的请求始终被派发至某特定的服务器
不过, 当服务器权重总数发生变化时, 如某服务器宕机或添加了新的服务器,
许多客户端的请求可能会被派发至与此前请求不同的服务器
常用于负载均衡无cookie功能的基于TCP的协议
其默认为静态, 不过也可以使用hash-type修改此特性
uri对URI的左半部分(“?”标记之前的部分)或整个URI进行hash运算
并由服务器的总权重相除后派发至某匹配的服务器
这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化
此算法常用于代理缓存或反病毒代理以提高缓存的命中率
需要注意的是, 此算法仅应用于HTTP后端服务器场景
其默认为静态算法, 不过也可以使用hash-type修改此特性
url_param通过< argument>为URL指定的参数在每个HTTP GET请求中将会被检索
如果找到了指定的参数且其通过等于号=被赋予了一个值
那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器
此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器
除非服务器的总权重发生了变化
如果某请求中没有出现指定的参数或其没有有效值
则使用轮叫算法对相应请求进行调度
此算法默认为静态的
不过其也可以使用hash-type修改此特性
hdr(< name>)对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索
如果相应的首部没有出现或其没有有效值
则使用轮询算法对相应请求进行调度
其有一个可选选项use_domain_only
可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.baidu.com来说
仅计算baidu字符串的hash值)以降低hash算法的运算量
此算法默认为静态的
不过其也可以使用hash-type修改此特性

针对每个进行hash运算的算法,都可以指定一个hash-type:

hash-type < method> < function> < modifier>

method 从function中计算的hash中选择服务器的方法:

可选参数参数说明
map-based哈希表是一个包含所有活跃服务器的静态数组
哈希将非常流畅, 将考虑权重, 但它是静态的
当服务器处于启用状态, 哈希表将忽略服务器权重的变化
此外, 由于服务器是通过在阵列中的位置来选择的
因此当服务器数量发生变化时, 大多数映射都会发生更改
这意味着当服务器启动或关闭时, 或者当服务器添加到服务器池时
大多数连接将被重新分配到不同的服务器
例如, 这对缓存会造成很大的影响
consistent一致性哈希算法
0~2^32-1构成一个环, 每个后端服务器生成大量节点平均分配在环的不同位置
将url哈希后的数值以2^32为被除数进行取模
计算后的数值一定在该环的不同位置
数值顺时针旋转遇到的第一个服务器便是选定的服务器
这个散列是动态的, 它支持在服务器启动时更改权重
它具有的优点是, 当服务器启动或关闭时,只有其关联被移动
将服务器添加到池中时, 只有少部分映射被重新分配, 使其成为高速缓存的理想方法
但是, 由于其原理, 分配永远不会很顺畅, 有时可能需要调整服务器的权重或ID以获得更均衡的分配
为了在多个负载均衡器上获得相同的分配, 重要的是所有服务器都具有完全相同的ID
注意: 如果未指定散列函数, 则一致散列使用sdbmavalanche

function 被使用的hash函数:

可选参数
sdbm
djb2
wt6
crc32

modifier 将键哈希后的可选方法:

可选参数
avalanche

HAProxy丰富的配置使其可以轻松实现 会话绑定 url绑定 hdr绑定 动静分离 等功能


参考文章 :
https://blog.csdn.net/erix1991/article/details/76090885
https://blog.csdn.net/varyall/article/details/80423037
https://blog.csdn.net/eddie_cm/article/details/79796883