APP下载

LVS集群调度算法的实现分析

2011-04-13王雪莲曹青媚

科技传播 2011年4期
关键词:层次结构内核集群

王雪莲,曹青媚

1.内蒙古师范大学公共管理学院,内蒙古 呼和浩特 010022

2.内蒙古农业大学职业技术学院,内蒙古 呼和浩特 010022

0 引言

网络的快速发展和网络用户的日益增加,致使服务器面临着巨大的挑战。单台服务器即使有再好的性能也很难满足当前日益增加的客户并发访问的需求。而集群的出现缓解了这一问题,它不再是单一的服务器,而由多个服务器共同分担多个客户的请求。集群系统具有可伸缩性、高性价比、高可用性的特点,因此得到了广泛的应用[1]。而负载均衡是集群性能提高的关键因素之一,具有较高的研究价值和应用前景。

1 LVS集群体系结构及软件层次结构

LVS(Linux Virtual Server)全称虚拟服务器,LVS集群由国防科技大学章文嵩博士研发的,主要解决的是集群的负载均衡。

1.1 体系结构

LVS集群体系结构一般采用三层结构,由前端调度器层、中间服务器集群层和后端存储系统层组成[2]。调度器是整个集群的前端机,是集群的唯一入口。当有客户请求时,首先要经过调度器,它根据调度算法负责将客户请求分配到服务器集群中的某一台。客户感觉好像服务是来自一个集群IP地址,即所谓的虚拟IP,集群内部对客户是透明的。该集群中某一台服务器执行完请求后将数据返回给客户。多台服务器结构缓减了集群的负载,体现了集群的可伸缩性。后端存储系统为服务器集群提供相同的服务,使得服务器集群有相同的内容。

1.2 软件层次结构

图1是调度器上的内部软件层次结构,在应用层装有一个ipvsadm管理软件,该软件由管理员进行设置,以达到对LVS集群的管理。对该软件管理员可以设置LVS的工作模式、在内核虚拟服务器表中增加或减少服务器IP地址、增加或删除虚拟服务,可以设置服务器的固定权值,配置要选择的调度算法,然后将管理员设置的信息传到内核层。ipvsadm管理软件主要通过ipvsadm.c文件经过编译后生成可执行文件。该文件通过getopt_long()函数,获取管理员从终端输入的命令,并对输入的命令进行解析,根据不同情况,将输入的值赋给一个变量,通过变量将输入命令传到内核,如果不设置权值,默认的权值是1。

图1 软件层次结构

在调度器的Linux内核层有IPVS调度模块,本文选取ipvs-1.0.9作为内核调度补丁软件[3],调度模块中有十种调度算法,分别是轮转法(RR)、加权轮转(WRR)、最小连接(LC)、加权最小连接(WLC)、基于局部性的最少链接调度(LBLC)、带复制的基于局部性最少链接调度(LBCR),最短预期延时调度(SED)、源地址散列调度(SH),目标地址散列调度(DH)、不排队调度(NQ)。在ipvs-1.0.9中十种调度算法分别存在于十个.c文件中。这些调度算法都是以连接为粒度的。

2 内核调度算法的实现

在调度模块中每一种调度算法都存储在一个结构体类型相应的变量中,10种调度算法有10个调度变量。本文介绍常用的4种调度算法:轮转法(RR)、加权轮转(WRR)、最小连接(LC)、加权最小连接(WLC)[4]。

轮转法、加权轮转、最小连接、加权最小连接调度算法开始以动态模块加载到内核,四个模块分别是ip_vs_rr_init, ip_vs_wrr_init,ip_vs_lc_init,ip_vs_wlc_init,它们通过register_ip_vs_scheduler函数分别注册到相应调度算法的全局变量ip_vs_rr_scheduler、ip_vs_wrr_scheduler、ip_vs_lc_scheduler、ip_vs_wlc_scheduler中。这些都是ip_vs_scheduler结构体类型的变量,为调度做准备。ip_vs_scheduler数据结构如表1所示:

struct ip_vs_scheduler struct list_head n_list; 所有负载调度算法链表头char *name ; 调度算法名称atomic_t refcnt; 引用计数struct module *module; 调度算法模块int (*init_service)(struct ip_vs_service *svc);调度算法初始化虚拟服务int (*done_service)(struct ip_vs_service *svc); 调度算法终止服务int (*update_service)(struct ip_vs_service *svc); 调度算法更新服务struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc, struct iphdr *iph);从所有目的服务器链表中选择一个要执行任务的服务器

注册的4种调度算法变量的对应值如表2所示:

结构体类型 变量1 变量2 变量3 变量4 ip_vs_scheduler ip_vs_rr_scheduler ip_vs_wrr_scheduler ip_vs_lc_scheduler ip_vs_wlc_scheduler n_list {0} {0} {0} {0}name "rr" "wrr" "lc" "wlc"refcnt ATOMIC_INIT(0)ATOMIC_INIT(0)ATOMIC_INIT(0)ATOMIC_INIT(0)module THIS_MODULE THIS_MODULE THIS_MODULE THIS_MODULE init_service() ip_vs_rr_init_svc ip_vs_wrr_init_svc ip_vs_lc_init_svc ip_vs_wlc_done_svc update_service() ip_vs_rr_update_svc ip_vs_wlc_init_svc done_service() ip_vs_rr_done_svc ip_vs_wrr_done_svc ip_vs_lc_done_svc ip_vs_wlc_update_svc schedule() ip_vs_rr_schedule ip_vs_wrr_update_svc ip_vs_lc_update_svc ip_vs_wrr_schedule ip_vs_lc_schedule ip_vs_wlc_schedule

从表1和表2中可以看出四种调度算法中关键的是init_service(),done_service(),update_service(),schedule()几个分量对应算法的函数,算法的核心思想一般体现在schedule()分量。在调度模块中有一个关键ip_vs_ctl.c文件,该文件用于控制各种调度算法,该文件中do_ip_set_ctl()函数主要用于添加、删除虚拟服务和真实服务器。在do_ip_set_ctl()函数中有一个svc是ip_vs_service结构体类型的变量,通过svc变量的操作实现对服务或服务器的管理。当管理员进行设置,添加某个虚拟服务时,ipvs_add_service函数通过svc-> scheduler ->init_service()调用某个算法对应分量函数;编辑ip_vs_edit_service()或删除ip_vs_edit()服务时,通过svc-> scheduler ->done_service()调用某个算法对应分量函数。添加新的服务器ip_vs_add_dest或修改服务器ip_vs_edit_dest时,通过svc-> scheduler->update_service()调用某个算法对应分量函数。当有请求时,调度器调用ip_vs_schedule()函数选择某个算法,即通过该函数里的svc-> scheduler ->schedule()选择已配置好的调度算法处理请求。

3 结论

本文就LVS集群的体系结构、软件层次结构做了介绍,分析了内核调度模块 IPVS-1.0.9源代码中四种常用调度算法的实现过程,为研究LVS调度模块提供了一些参考。

[1]朱璇,郑纬民,汪东升,杨广文.单一系统映象在机群管理中的实现.计算机工程与应用,2002.

[2]黄曦.Web服务器集群负载均衡技术的应用研究[D].重庆大学,2004.

[3]章文嵩.http://www.linuxvirtualserver.org/.

[4]王霜,修保新,肖卫东.Web服务器集群的负载均衡算法研究[J].计算机工程与应用,2004,40(25):78-80.

猜你喜欢

层次结构内核集群
强化『高新』内核 打造农业『硅谷』
基于级联网络和语义层次结构的图像自动标注方法
海上小型无人机集群的反制装备需求与应对之策研究
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
一种无人机集群发射回收装置的控制系统设计
Python与Spark集群在收费数据分析中的应用
论立法修辞功能的层次结构
勤快又呆萌的集群机器人
微生物内核 生态型农资