理解UDP负载均衡器原理(by quqi99)

作者:张华  发表于:2015-11-13
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
(http://blog.csdn.net/quqi99 )

  • 四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。所以四层的负载均衡器更像是一个NAT路由器
  • 七层的负载均衡,就是在四层的基础上,再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。负载均衡如果要真正理解七层应用层的内容,只能先代理最终的服务器和客户端建立三次握手连接后,才可能接受到客户端发送的真正应用层内容的报文,所以七层的负载均衡更像是代理服务器

随着TCP越来越复杂,很多应用程序在UDP之上自已处理连接状态、数据序列等来自行控制复制度,比较典型的就是DTLS协议(SSL的UDP版本)以及OpenVPN。但UDP一般是来一个请求服务完了就结束了,它能做到你TCP一样维护一个连接池来利用多CPU的处理能力吗?

一个套接字由相关五元组构成(协议、本地地址、本地端口、远程地址、远程端口),不能破坏五元组的唯一性。

  • SO_REUSEADDR仅仅表示可以客户端socket可以重用本地地址、本地端口,整个相关五元组还是唯一确定的。在对于UDP无连接状态没有办法通过“将新的连接匹配保存下来的已有的五元组连接”来判断是否五元组唯一。于是它就是简单地基于目标IP与目标端口查找UDP socket链表结构,找到第一个就返回。SO_REUSEADDR只是重用本地IP与端口,所以你可以在在一个进程或者多个线程里绑定相同的远程IP与端口的UDP连接,但只有最后一个(或者其他固定位置,依算法而定)UDP连接可以接收到数据。
  • SO_REUSEPORT, 于是,从Linux3.9内核开始有了SO_REUSEPORT这个socket选项,它支持多个客户端套接字(多个进程或者线程)绑定到同一端口, 这样每一个线程拥有了自己的服务器套接字,从而在服务器套入字上没有了锁的竞争提升了性能。它的算法在查找UDP socket链表结构时,不仅使用了目标IP与端口,也使用了源IP与端口,这样就会找到多个,最后再通过Hash选择一个,这样实现了内核层面的负载均衡。这样在服务端创建多个udp socket并绑定相同的IP和端口,不同源IP与端口的客户端socket会自动负载到不同的服务端socket上去。这样,想利用多CPU的话,可以预先创建多个进程,每一个进程分配一个UDP socket来处理数据的收发(代码实现可以在主进程中预先fork多个进程,每一个进程只处理一个UDP socket)。如果有一个UDP socket死掉的话,就会改变socket链表的位置,所以办法是使用CLOEXEC参数保证UDP不被关闭。

Haproxy目前不支持上述的UDP方式在每一个进程上启动一个UDP socket来给客户端作负载均衡。corosync支持使用udpu方式作各节点间的心跳检查,但前提是配置host列表。

参考:
1, http://kb.cnblogs.com/page/188170/
2, http://blog.csdn.net/dog250/article/details/17061277

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 19:27:18

理解UDP负载均衡器原理(by quqi99)的相关文章

LVS之原理篇--深入全面理解LVS工作原理

一.介绍 LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统.该项目由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. 使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能.高可用的服务器群集,它具有良好可靠性.可扩展性和可操作性.从而以低廉的成本实现最优的服务性能. 负载均衡技术有很多实现方案,如基于DNS域名轮流解析的方法.基于客户端调度访问的方法.基于应用层系统负载的调度方法,还有基于IP

Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理

Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 图3 将.s文件中的链接语句删除,获得最后的汇编代码 二.分析堆栈变化情况 三.总结 阐明对“计算机是如何工作的”的理解. ①计算机是依据冯诺依曼体存储结构,依据其核心思想——存储程序计算机工作模型,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作. ②从硬件的角度看,是通过总线连接C

第82课:Spark Streaming第一课:案例动手实战并在电光石火间理解其工作原理

本期内容: 1.Spark Streaming 动手实战演示 2.闪电般理解Spark Streaming原理 案例动手实战并在电光石火间理解其工作原理 流(Streaming),在大数据时代为数据流处理,就像水流一样,是数据流:既然是数据流处理,就会想到数据的流入.数据的加工.数据的流出. 日常工作.生活中数据来源很多不同的地方.例如:工业时代的汽车制造.监控设备.工业设备会产生很多源数据:信息时代的电商网站.日志服务器.社交网络.金融交易系统.黑客攻击.垃圾邮件.交通监控等:通信时代的手机.

理解js闭包原理

各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂.我的理解是,闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数". 所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁. 闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中. 怎么来理解这句话呢?请看下面的

Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理

Linux内核设计(第一周)--从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 从2月22日起,本学期的linux课程开始了.通过这两天的学习,觉得孟宁老师讲的真不错,条理清晰,举例适当.本周从计算机工作原理出发,回顾了冯诺依曼计算机结构,也回顾了汇编寄存器.汇编指令.C语言程序的汇编分析技巧,很

记事本写c#代码编译并理解编译执行原理

1.在记事本里编写c#代码,将文件保存为ProgramTest.cs: namespace huangxiangTestDemo { class ProgramTest { static void Main() { System.Console.WriteLine("hello world"); System.Console.ReadKey(); } } } 2.在控制台编译,使用csc命令编译: 注意完整写法:csc.exe /out:ProgramTest.exe /t:exe /

深度理解Android InstantRun原理以及源码分析

深度理解Android InstantRun原理以及源码分析 @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代

第82讲:Spark Streaming第一讲:案例动手实战并在电光石火间理解其工作原理

本期内容: 1.Spark Streaming 动手实战演示 2.闪电般理解Spark Streaming原理 3.案例动手实战并在电光石火间理解其工作原理 流(Streaming),在大数据时代为数据流处理,就像水流一样,是数据流:既然是数据流处理,就会想到数据的流入.数据的加工.数据的流出. 日常工作.生活中数据来源很多不同的地方.例如:工业时代的汽车制造.监控设备.工业设备会产生很多源数据:信息时代的电商网站.日志服务器.社交网络.金融交易系统.黑客攻击.垃圾邮件.交通监控等:通信时代的手

深入理解MySQL优化原理

说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图