Linux系统中LVS的实现剖析_第1页
Linux系统中LVS的实现剖析_第2页
Linux系统中LVS的实现剖析_第3页
Linux系统中LVS的实现剖析_第4页
Linux系统中LVS的实现剖析_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2002年12月第13卷第6期装备指挥技术学院学报Journal of the Academy of Equipment Command &Technology December 2002Vol.13No 16收稿日期:2002204209作者简介:李新洪(1972-,男,讲师,硕士.Linux 系统中L VS 的实现剖析李新洪张永乐(装备指挥技术学院试验工程系,北京101416摘要:介绍了Linux 系统中LVS 的基本概念;论述了如何利用LVS 实现集群和负载均衡;通过对2.4版本内核中的LVS 源代码分析,阐述了LVS 的实现机理;最后对LVS 的实现提出了改进意见。关键词:netfil

2、ter ;Linux 虚拟服务器(LVS ;内核模块;网络地址转换(NA T ;负载均衡中图分类号:TP 391文献标识码:A 文章编号:CN1123987/G3(20020620073203集群系统(cluster 在计算机应用领域已经开始发挥越来越重要的作用,主要包括:高可靠性(HA 。利用集群管理软件,当主服务器发生故障时,备份服务器能够及时切换自动接管主服务器的工作,实现对用户的不间断服务;高性能计算(HP 。充分利用集群中每台计算机的资源,实现复杂运算的并行处理。比如基因分析,化学分析等;负载平衡。即把负载压力合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器硬件

3、和软件要求。实际应用中,常用集群解决负载平衡问题,比如提供WWW 服务。各种操作系统对集群的实现方法不尽相同,Linux 系统中的LVS (Lin 2ux Virtual Server 是目前较常用的一种集群解决方案。本文主要论述在2.4内核中如何实现LVS 。1Linux 2.4内核的netf ilter 框架Linux 的2.4内核中,防火墙和LVS的实现都是基于netfilter 框架。Netfilter 提供了一个抽象、通用化的框架,定义了一个子功能的实现就是包过滤子系统。该框架包含以下3部分:1为每种网络协议(IPv4、IPv6等定义一套钩子函数。这些钩子函数在数据包流过协议栈的几个

4、关键点时被调用;2内核模块可对多个钩子函数进行注册,实现挂接。当某个数据包被传递给netfilter 框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若是,则调用该模块注册时使用的回调函数,该模块就有机会检查(可能还会修改该数据包、丢弃该数据包及指示netfilter 将该数据包传入用户空间的队列;3排队的数据包被传递给用户空间异步地进行处理。用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数注入到内核中。所有的包过滤/NAT 等都基于该框架。当前net 2filter 框架中采用了IPv4、IPv6网络协议栈的实现。2N etf ilter 在

5、IPv4中的结构数据包通过Netfilter 系统的过程如图1。图1中IPv4共有5个钩子函数:N F -IP -PRE -ROU TIN G;N F -IP -LOCAL -IN ;N F -IP -FORWARD ;N F -IP -POST -ROU TIN G;N F -IP -LOCAL -OU T 。数据包从左边进入系统进行IP 校验后,经第1个钩子函数N F -IP -PRE -ROU TIN G 进行处理;然后进入路由代码,它决定该数据包是转发还是发给本机;若是发给本机,则该数据包经钩子函数N F -IP -LOCAL -IN 处理后传给上层协议;若该数据包需转发则被N F -

6、IP -FOR 2WARD 处理;然后,经最后一个钩子函数N F -IP -POST -ROU TIN G 处理后传到网络上。本地产生的数据经钩子函数NF -IP -LO 2CAL -OU T 处理后,进行路由选择处理,然后经N F -IP -POST -ROU TIN G 处理发送到网络上 。图1netfilter 中的数据包流程图3L VS 在L INUX 系统中的实现1,2对LVS 的分析按照从应用层到内核层的顺序进行,应用层的程序通过应用程序ipvsadm 实现。整个LVS 的核心部分作为一个独立的模块,当用户调用ipvsadm 时,若ip -vs 模块在内核空间不存在,将LVS 的模

7、块载入。LVS 根据用户指定的负载调度算法,载入对应的调度算法模块。下面以round robin 调度算法为例说明LVS 中各部分之间的关系,如图2所示 :图2LVS 中各模块关系图3.1L VS 实现负载平衡的方式LVS 有3种实现负载平衡方式:NA T (Network Address Translation ,IP Tunneling ,DR (Direct Routing 。NA T 方式的最大优点是集群中的物理服务器可以使用任何支持TCP/IP 操作系统,而最大的缺点是扩展性有限;隧道方式(IP Tunneling 的负载均衡器能处理很巨大的请求量。但是,这种方式需要所有的服务器支持

8、“IP Tunneling ”(IP encapsulation 协议;直接路由(DR 方式能大大提高虚拟服务器(virtual server 的可扩展性。DR 实现方式不需要隧道结构,但它要求负载均衡器的网卡必须与物理网卡在一个物理段上。下面分析NA T 方式的实现。3.2NAT 方式的实现LVS 的核心功能在ip -vs 模块中实现。在系统管理员使用命令ipvsadm A 添加虚拟服务时,如果ip -vs 模块不在内核中,则操作系统将ip -vs 模块载入内核。ipvsadm 的主要功能是对输入的命令行参数进行解析。被解析的命令行参数通过函数setsockopt 传递给ip -vs 模块。

9、ip -vs模块在初始化时已注册了对应的socket 结构,保证通过setsockopt 传递来的参数在ip -vs 模块中调用对应的过程处理。在2.4版本的linux 内核中,模块在初始化时调用初始化函数module -init (。3.2.1初始化处理ip -vs 模块在初始化过程中需做以下处理:1创建所需要的proc 文件。系统管理员通过对proc 文件系统的访问,了解到当前操作系统内核中ip -vs 模块的运行状态。建立的proc 文件包括ip -vs 、ip -vs -stats 、ip -vs -conn ;2对ip -vs 模块所需数据结构初始化。建立表示虚拟服务数据结构的has

10、h 表ip -vs -svc -table ,建立表示真实服务器数据结构的hash 表ip -vs -rtable ,建立表示现有连接数据结构的hash 表ip -vs -conn -tab ;3对LVS 中每个连接所对应的定时器初始化;4在netfilter 框架的不同入口点挂接处理数据包的钩子函数。5在内核中注册socket ,保证ipvsadm 对命令行参数的解析,在内核中调用对应的函数处理。3.2.2NA T 方式处理流程ip -vs 模块初始化后,对数据包的处理完全按照在netfilter 框架中已经构造好的钩子函数进行处理。所有进入负载均衡服务器的数据包,在交给Linux 核心中的

11、IP 栈处理之前,首先将数据包交给函数ip -vs -in 进行处理。ip -vs -in 对数据包进行以下处理:1若输入的数据包为ICMP 包,则ICMP 包交给函数icmp -in 处理;2在表示现有连接的hash 表中查找输入的数据包是否属于已有的连接。如果属于已有连接,则数据包由下面的第9步开始处理;3如果属于TCP 建立连接所用包或属于UDP 数据包,则要在表示虚拟服务的hash 表中47装备指挥技术学院学报2002年查找该数据包是否属于已建立的某个虚拟服务;4如果输入数据的流量过大,对数据包进行必要的丢弃;5计算real server 对应的地址和端口;6为新建立的连接分配内存空间

12、,设置cp 结构的各项值,为该连接绑定定时器;7将建立的连接绑定到dest 结构;8绑定Xmit 方法,将该连接加入到表示连接的hash 表中;9设置各种状态信息;10根据对应的协议设置定时器的超时值;11调用对应的xmit 对数据包进行转发;12重新设定连接的超时值。每个连接对应的定时器在连接超时之后就会自动的将该连接从表示连接的hash 表中摘除。其中,对TCP 连接超时的判断比较复杂,超时时间的长短和TCP 的状态有关。4现有L VS 的不足当前LVS 还不能自动判断real server 运行正常与否,应当由虚拟服务器定期检测real server 是否正常。如果有real serve

13、r 出现故障,系统自动将出现故障的real server 从列表中摘除;在出现故障的real server 恢复正常后,虚拟服务器应当重新启用该real server 。如果real server 的数目过多,运用ipvsadm 进行管理将变得非常复杂,最好在虚拟服务器和real server 之间加1个逻辑层pool 。每个pool 可以包含多个real server ,1个虚拟服务器可以有多个pool 。进行负载均衡时可以优先在1个pool 内进行调度,当1个pool 内的连接超出指定的数目时,自动的启动下一个pool 进行调度。在加入逻辑层pool 时,首先要对应用层的ipvsadm 进

14、行修改:关于pool 的各类参数可以通过该命令传递给操作系统内核。ipvs 内核模块在原有的数据结构内部需要加入与pool 对应的链表。各数据结构之间的关系也要重新组合。对所有的调度算法模块也需要进行必要的改写。以上设想作者已经通过对LVS 代码的改写而实现。5结束语整个LVS 系统的实现比较复杂,这里只作了简要介绍,希望本文可以对研究LVS 的读者起到抛砖引玉的作用。参考文献1Richard Stenven W.Unix 网络编程M .北京:清华大学出版社,1999.2Richard Stenven W.TCP/IP 详解M .北京:机械工业出版社,2000.Analysis of LVS

15、in LinuxL I Xin hong ZHAN G Y ong le(Department of Test Engineering ,The Academy of Equipment Command &Technology ,Beijing 101416,China Abstract :This paper introduces the concept of LVS and analyses the source code of LVS.The archi 2tecture of LVS is discussed.LVS on kernel 2.4is based on netfilter.The

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论