LVS系列教程02-LVS体系结构
目录
前言
人类社会正在进入以网络为中心的信息时代,人们需要更快捷、更可靠、功能更丰富的网络服务。万维网的流行促进互联网使用的指数级增长,现在很多站点收到前所未有的访问负载,经常担心系统如何被扩展来满足不断增长的性能需求,同时系统如何保持 7x24
的可用性。未来的应用将需要更高的吞吐率、更好的交互性、更高的安全性,这要求服务平台具有更强的处理能力和更高的可用性。所以,如何给出合理的框架和有效的设计方法,来建立高性能、高可伸缩、高可用的网络服务,这是摆在研究者和系统设计者面前极富挑战性的任务。
一、可伸缩网络服务的定义
可伸缩性
(Scalability)是在当今计算机技术中经常用到的词汇。对于不同的人,可伸缩性有不同的含义。现在,我们来定义可伸缩网络服务的含义。
可伸缩网络服务是指网络服务能随着用户数目的增长而扩展其性能,如在系统中增加服务器、内存或硬盘等;整个系统很容易被扩展,无需重新设置整个系统,无需中断服务。换句话说,系统管理员扩展系统的操作对最终用户是透明的,他们不会知道系统的改变。
可伸缩系统通常是高可用的系统。在部分硬件
(如硬盘、服务器、子网络)和部分软件
(如操作系统、服务进程)的失效情况下,系统可以继续提供服务,最终用户不会感知到整个服务的中断,除了正在失效点上处理请求的部分用户可能会收到服务处理失败,需要重新提交请求。Caching和复制是建立高可用系统的常用技术,建立多个副本会导致如何将原件的修改传播到多个副本上的问题。
实现可伸缩网络服务的方法一般是通过一对多的映射机制
,将服务请求流分而治之
(Divide and Conquer)到多个结点上处理。一对多的映射可以在很多层次上存在,如主机名上的DNS系统、网络层的TCP/IP、文件系统等。虚拟(Virtual)是描述一对多映射机制的词汇,将多个实体组成一个逻辑上的、虚拟的整体。例如,虚存(Virtual Memory)是现代操作系统中最典型的一对多映射机制,虚存建立一个虚拟内存空间,将它映射到多个物理内存上。
二、网络服务的需求
随着Internet
的飞速发展和对我们生活的深入影响,越来越多的企业把他们与顾客和业务伙伴之间的联络搬到互联网上,通过网络来完成交易,建立与客户之间的联系。例如,比较热门的Web
站点会因为被访问次数急剧增长而不能及时处理用户的请求,导致用户进行长时间的等待,大大降低了服务质量。另外,随着电子商务等关键性应用在网上运行,任何例外的服务中断都将造成不可估量的损失,服务的高可用性也越来越重要。所以,对用硬件和软件方法实现高可伸缩、高可用网络服务的需求不断增长,这种需求可以归结以下几点:
可伸缩性(Scalability)
当服务的负载增长时,系统能被扩展来满足需求,且不降低服务质量。
高可用性(Availability)
尽管部分硬件和软件会发生故障,整个系统的服务必须7*24可用。
可管理性(Manageability)
整个系统可能在物理上很大,但应该容易管理。
价格有效性(Cost-effectiveness)
整个系统实现是经济的、易支付的。
单服务器显然不能处理不断增长的负载,升级方法有下列不足:
一是升级过程繁琐,机器切换会使服务暂时中断,并造成原有计算资源的浪费。 二是越往高端的服务器,所花费的代价越大。 三是一旦该服务器或应用软件失效,会导致整个服务的中断。
通过高性能网络或局域网互联的服务器集群正成为实现高可伸缩的、高可用网络服务的有效结构。这种松耦合结构
比紧耦合的多处理器系统具有更好的伸缩性和性能价格比,组成集群的PC服务器或RISC服务器和标准网络设备因为大规模生产,价格低,具有很高的性能价格比。但是,这里有很多挑战性的工作,如何在集群系统实现并行网络服务,它对外是透明的,它具有良好的可伸缩性和可用性。
针对上述需求,我们给出了基于 IP 层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的服务器集群,我们称之为Linux虚拟服务器(Linux Virtual Server)。在LVS集群中,使得服务器集群的结构对客户是透明的,客户访问集群提供的网络服务就像访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。
三、LVS 集群的体系结构
下面先给出
LVS
集群的通用结构,讨论了它的设计原则和相应的特点,然后将LVS集群应用于建立可伸缩的Web
、Media
、Cache
和
3.1 LVS 集群的通用结构
LVS集群采用IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。
为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。LVS
集群的体系结构如图所示,它有三个主要组成部分:
负载调度器(load balancer)
负载调度器是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP 负载均衡技术的负载调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。
服务器池(server pool)
服务器池是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
后端存储(backend storage)
后端存储为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
调度器
采用 IP 负载均衡技术、基于内容请求分发技术或者两者相结合。在IP 负载均衡技术
中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据负载情况从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术
中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容和服务器的情况选择服务器执行请求。因为所有的操作都是在操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。
服务器池
的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。对大多数网络服务来说,结点与结点间不存在很强的相关性,所以整个系统的性能可以随着服务器池的结点数目增加而线性增长。
后端存储
通常用容错的分布式文件系统,如AFS
、GFS
、Coda
和Intermezzo
等。分布式文件系统
为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样。同时,分布式文件系统提供良好的伸缩性和可用性。然而,当不同服务器上的应用程序同时访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器
(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。
负载调度器、服务器池和分布式文件系统通过高速网络
相连,如100Mbps交换机、Myrinet、CompactNET和Gigabit交换机等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为瓶颈。
为什么使用层次的体系结构呢?
层次的体系结构可以使得层与层之间相互独立,允许在一个层次的已有软件在不同的系统中被重用。例如,调度器层提供了负载平衡、可伸缩性和高可用性等,在服务器层可以运行不同的网络服务,如Web、Cache、Mail和Media等,来提供不同的可伸缩网络服务。
为什么使用共享存储呢?
共享存储如分布式文件系统在这个LVS集群系统是可选项。当网络服务需要有相同的内容,共享存储是很好的选择,否则每台服务器需要将相同的内容复制到本地硬盘上。当系统存储的内容越多,这种不共享结构的代价越大,因为每台服务器需要一样大的存储空间,所有的更新需要涉及到每台服务器,系统的维护代价也很高。共享存储为服务器组提供统一的存储空间,这使得系统的维护工作比较轻松。
为什么需要高可用性呢?
集群系统的特点是它在软硬件上都有冗余。系统的高可用性可以通过检测节点或服务进程故障和正确地重置系统来实现,使得系统收到的请求能被存活的结点处理。通常,我们在调度器上有资源监视进程来时刻监视各个服务器结点的健康状况,当服务器对ICMP ping不可达时或者它的网络服务在指定的时间没有响应时,资源监视进程通知操作系统内核将该服务器从调度列表中删除或者失效。这样,新的服务请求就不会被调度到坏的结点。资源监测程序能通过电子邮件或传呼机向管理员报告故障,一旦监测到服务进程恢复工作,通知调度器将其加入调度列表进行调度。
现在前端的调度器有可能成为系统的单一失效点。为了避免调度器失效导致整个系统不能工作,我们需要设立调度器的备份。两个心跳进程(两个心跳进程)分别在主、从调度器上运行,它们通过串口线和UDP等心跳线来相互汇报各自的健康情况。当从调度器不能听得主调度器的心跳时,从调度器会接管主调度器的工作来提供负载调度服务。这里,一般通过ARP 欺骗来接管集群的虚拟 IP 地址。
当主调度器恢复时,这里有两种方法,一是主调度器自动变成从调度器,二是从调度器释放虚拟 IP 地址,主调度器收回虚拟 IP 地址并提供负载调度服务。然而,当主调度器故障后或者接管后,会导致已有的调度信息丢失,这需要客户程序重新发送请求。
Graphic Monitor
是为系统管理员提供整个集群系统的监视器
,它可以监视系统中每个结点的状况。Graphic Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS
协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。
3.2 可伸缩 Web 和媒体服务
基于LVS
可伸缩Web和媒体服务的体系结构所示:在前端是一个负载调度器
,一般采用IP负载均衡技术来获得整个系统的高吞吐率;在第二层是Web 服务器池
,Web服务和媒体服务分别运行在每个结点上;第三层是数据存储
,通过分布式文件系统使得每个服务器结点共享相同的数据。集群中节点间是通过高速网络相连的。
分布式文件系统
提供统一的存储空间,这使得系统的维护工作比较方便,且系统运行比较高效。当所有服务器结点超载时,管理员可以很快地加入新的结点来处理请求,而无需将Web文档等复制到结点的本地硬盘上。Webmaster可以看到统一的文档存储空间,维护和更新页面比较方便,对分布式文件系统中页面的修改对所有的服务器都有效。大的媒体文件(如视频文件)分段存储在分布式文件系统的多个结点上,可以提高文件系统的性能和文件服务器间的负载均衡。
IP 负载调度器
(即VS/DR方法)可以分别将Web服务和媒体服务负载均衡地分发到各个服务器上,服务器将响应数据直接返回给客户,这样可以极大地提高系统的吞吐率。
3.3 可伸缩 Cache 服务
有效的网络Cache
系统可以大大地减少网络流量、降低响应延时以及服务器的负载。但是,若Cache
服务器超载而不能及时地处理请求,反而会增加响应延时。所以,Cache服务的可伸缩性很重要,当系统负载不断增长时,整个系统能被扩展来提高Cache服务的处理能力。尤其,在主干上的Cache服务可能需要几个Gbps的吞吐率,单台服务器远不能达到这个吞吐率。可见,通过PC服务器集群实现可伸缩Cache服务是很有效的方法,也是性能价格比最高的方法。
基于LVS
可伸缩Cache集群的体系结构如图所示:在前端是一个负载调度器
,一般采用IP负载均衡技术来获得整个系统的高吞吐率;在第二层是Cache 服务器池
,一般Cache服务器放置在接近主干Internet连接处,它们可以分布在不同的网络中。调度器可以有多个,放在离客户接近的地方,可实现透明的Cache服务。
Cache 服务器
采用本地硬盘来存储可缓存的对象,因为存储可缓存的对象是写操作,且占有一定的比例,通过本地硬盘可以提高I/O的访问速度。Cache服务器间有专用的多播通道,通过ICP协议(Internet Cache Protocol)来交互信息。当一台Cache服务器在本地硬盘中未命中当前请求时,它可以通过ICP查询其他Cache服务器是否有请求对象的副本,若存在,则从邻近的Cache服务器取该对象的副本,这样可以进一步提高Cache服务的命中率。
3.4 可伸缩邮件服务
随着Internet
用户不断增长,很多ISP
面临他们邮件服务器超载的问题。当邮件服务器不能容纳更多的用户帐号时,有些ISP买更高档的服务器来代替原有的,将原有服务器的信息(如用户邮件)迁移到新服务器是很繁琐的工作,会造成服务的中断;有些ISP设置新的服务器和新的邮件域名,新的邮件用户放置在新的服务器上,如上海电信现在用不同的邮件服务器public1.sta.net.cn
、public2.sta.net.cn
到public9.sta.net.cn
放置用户的邮件帐号,这样静态地将用户分割到不同的服务器上,会造成邮件服务器负载不平衡,系统的资源利用率低,对用户来说邮件的地址比较难记。
可以利用LVS
框架实现可伸缩邮件服务。它的体系结构如图所示:在前端是一个采用 IP 负载均衡技术的负载调度器
;在第二层是服务器池,有LDAP(Light-weight Directory Access Protocol)服务器和一组邮件服务器。第三层是数据存储,通过分布式文件系统来存储用户的邮件。集群中结点间是通过高速网络相连的。
用户的信息如用户名、口令、主目录和邮件容量限额等存储在LDAP服务器中,可以通过HTTPS让管理员进行用户管理。在各个邮件服务器上运行SMTP、POP3、IMAP4和HTTP服务。SMTP接受和转发用户的邮件,SMTP服务进程查询LDAP服务器获得用户信息,再存储邮件。POP3和IMAP4通过LDAP服务器获得用户信息,口令验证后,处理用户的邮件访问请求。SMTP、POP3和IMAP4服务进程需要有机制避免用户邮件的读写冲突。HTTP服务是让用户通过浏览器可以访问邮件。负载调度器将四种服务请求负载均衡地调度到各个服务器上。
系统中可能的瓶颈是LDAP
服务器,对LDAP服务中B+树
的参数进行优化,再结合高端的服务器,可以获得较高的性能。若分布式文件系统没有多个存储结点间的负载均衡机制,则需要相应的邮件迁移机制来避免邮件访问的倾斜。
这样,这个集群系统对用户来说就像一个高性能、高可靠的邮件服务器。当邮件用户不断增长时,只要在集群中增加服务器结点和存储结点。
四、地理分布 LVS 集群的体系结构
由于互联网用户分布在世界各地,通过地理分布的服务器让用户访问就近的服务器,来节省网络流量和提高响应速度。以下,我们给出地理分布的LVS集群系统,通过BGP路由插入使得用户访问离他们最近的服务器集群,并提供服务器集群之间的负载平衡。
4.1 体系结构
地理分布LVS
集群的体系结构如图所示:有三个LVS集群系统分布在Internet
上,他们一般放置在不同区域的Internet数据中心中,例如他们分别放在中国、美国和德国的三个不同的IDC
中。三个LVS集群系统都有自己的分布式文件系统,它们的内容是相互复制的,提供相同的网络服务。它们共享一个Virtual IP Address
来提供网络服务。当用户通过Virtual IP Address访问网络服务,离用户最近的LVS集群提供服务。例如,中国的用户访问在中国的LVS集群系统,美国的用户使用美国的LVS
集群系统,这一切对用户来说是透明的。
地理分布LVS集群系统可以带来以下好处:
使得用户访问离他们最近的系统,对用户来说体验到更快的响应速度,对服务提供商来说节约网络带宽,降低成本。
避免灾难导致系统中止服务。当一个地点发生地震、火灾等使得系统或者网络连接瘫痪时,所有的用户访问可以很快由其他地点的 LVS 集群来提供。除了已建立的连接中断以外,这一切对用户来说都是透明的。
4.2 基于 BGP 的集群调度
基于 BGP 的地理分布服务器集群调度
BGP
(Border Gateway Protocol)是用于自治系统之间交换路由信息的协议,BGP可以设置路由策略,如政策、安全和经济上的考虑。
我们可以利用BGP
协议在Internet
的BGP路由器插入到Virtual IP Address
的路由信息。在不同区域的LVS集群向它附近的BGP路由器广播到Virtual IP Address的路由信息,这样就存在多条到Virtual IP Address的路径,Internet的BGP路由器会根据评价函数选出最近的一条路径。这样,我们可以使得用户访问离他们最近的LVS集群。当一个LVS集群系统失效时,它的路由信息自然不会在Internet的BGP路由器中交换,BGP
路由器会选择其他到Virtual IP Address的路径。这样可以做到抗灾害性。
下面我们举一个基于BGP的地理分布服务器集群调度例子。测试的例子如图所示,R11、R22分别在不同自治系统AS1和AS2中的Internet服务提供商,R31和R32表示在自治系统AS3中两个ISP。两个LVS集群系统分别放置在两个不同数据中心IDC1和IDC2中,LB1和LB2分别是两个LVS集群系统的负载调度器,它们对外提供网络服务的IP地址为10.101.4.1。在第一个集群中,请求被调度到服务器10.101.5.11和10.101.5.12执行。在第二个集群中,请求被调度到服务器10.101.6.11和10.101.6.12。10.101.4.1是在自治系统AS5的网络10.101.4.0/24中。LB1上的BGP服务进程将网络10.101.4.0/24的路由信息广播到邻近的AS1,LB2上的BGP服务进程将网络10.101.4.0/24的路由信息广播到邻近的AS2中。
我们在R31端口10.101.3.1相连的BGP路由器上查到AS5的自治系统路径为3→1→5
。在与R32端口10.101.3.9相连的BGP路由器上查到AS5的自治系统路径为3→2→5
,并在该路由器上访问10.101.4.1上提供的Web服务,是由服务器10.101.6.11处理的。当我们关掉LB2后,在该BGP路由器上查到AS5的自治系统路径变为3→1→5
。
4.3 服务器集群间的负载均衡
通过BGP
插入路由信息的方法可以使得用户访问邻近的服务器集群,但是用户访问存在突发性,在某个区域的访问高峰可能会导致该区域的服务器集群系统超载,而其他服务器集群系统可能处于低负载状态,这时与其将请求在超载系统上排队等候,不如将请求送到远处的低负载系统上执行,可以提高响应速度。例如,中国用户在白天时间的一段访问高峰使得在中国的镜像服务器集群系统超载,而此时美国是晚上时间其镜像服务器集群系统处于低负载状态。
我们提出通过IP 隧道
的方法将请求从一个调度器转发到另一个调度器,再调度到真实服务器上执行。下面将详细描述如何通过 IP 隧道作 IP 负载均衡调度。在通过 IP 隧道转发请求前,各个服务器集群需要定时交换负载信息(如 2 分钟交换一次),当确信远处的集群系统处于低负载状态,再转发请求。例如,当本地集群系统的综合负载大于1.1和远处集群系统的负载小于0.7时,调度器通过 IP 隧道将新的请求转发到远处的集群系统。若远处集群系统的负载超过0.7时,停止转发请求。当本地集群系统的负载降至1.0时,也停止转发请求,由本地服务器处理。这样,基本上可以避免两个调度器间相互转发一个请求。即使两个调度器间相互转发一个请求报文的例外情况发生,报文的TTL会降到零,报文被丢掉。
五、总结
我们分析了现在和将来网络服务的需求,提出可伸缩网络服务的体系结构,分为负载调度器、服务器池和后端存储三层结构。负载调度器采用 IP 负载均衡技术和基于内容请求分发技术。它的实现将在Linux操作系统进行,将一组服务器组成一个高可伸缩的、高可用的服务器,故称之为Linux Virtual Server。它提供了负载平衡、可伸缩性和高可用性,可以应用于建立很多可伸缩网络服务,如Web、Cache、Mail和Media等服务。
在此基础上,我们给出了地理分布的LVS集群系统,通过BGP
插入路由信息的方法可以使得用户访问邻近的服务器集群,通过 IP 隧道实现服务器集群间的负载均衡,进一步提高响应速度。地理分布的LVS
集群系统可以节约网络带宽,改善网络服务质量,有很好的抗灾害性。
文章作者: Escape
链接: https://escapelife.github.io/posts/e26b997c.html
往期推荐
关注「开源Linux」加星标,提升IT技能