使用网络地址转换实现多服务器负载均衡
关键字: 负载均衡,网络地址转换,FreeBSD
1. 引言
Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,服务器的处理和I/O能力成为了提供服务的瓶颈。由于单台服务器的性能总是有限的,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。
最早的负载均衡技术是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的[1]。DNS负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态。
反向代理服务器可以将请求转发给内部Web服务器,如果代理服务器能够将请求均匀转发给多台内部服务器,就能达到负载均衡的目的[2]。反向代理方式下能应用优化的负载均衡策略,每次访问最空闲的内部服务器来提供服务。但是随着并发连接数量的增加,代理服务器本身的负载也变得非常大,最后反向代理服务器本身会成为服务的瓶颈。
支持负载均衡的地址转换网关中可以将一个外部ip地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的[3]。很多硬件厂商将这种技术集成在他们的交换机中,作为他们第四层交换的一种功能来实现,一般采用随机选择、根据服务器的连接数量或者响应时间进行选择的负载均衡策略来分配负载。然而硬件实现的负载控制器灵活性不强,不能支持更优化的负载均衡策略和更复杂的应用协议。
除了这三种负载均衡方式之外,有的协议内部支持与负载均衡相关的功能,例如HTTP协议中的重定向能力等,但它依赖于特定协议,因此使用范围有限。根据现有的这些负载均衡技术,我们选择了使用软件方式实现网络地址转换的负载均衡的方式,以弥补硬件负载均衡器的不灵活,并应用优化的均衡策略来实现后端服务器负载分担的最优状态。
2. 负载均衡策略
为了将负载均匀的分配给内部的多个服务器上,就需要应用一定的负载均衡策略。传统的负载均衡策略并没有考虑到服务请求的不同类型、后台服务器的不同能力以及随机选择造成的负载分配不均匀等问题。为了使得负载分配十分均匀,就要应用能够正确反映各个服务器CPU及I/O状态的负载均衡策略[4]。
客户发起的服务请求类型是多种多样的,按照对处理器、网络和I/O的资源要求,可以简单的将它们分为两个不同类别,以便应用不同的处理策略:
静态文档请求:例如普通的文本、图象等静态多媒体数据,它们对处理器负载影响不大,造成的磁盘I/O负载与文档的大小成正比,主要对网络I/O造成压力。
动态文档请求:更为常见的请求常常需要服务器预先进行处理,例如搜寻数据库、压缩解压缩多媒体文件等,这些请求需要相当大的处理器和磁盘I/O资源。
对于静态文档,每个服务进程占用大致相同的系统资源,因此就可以使用进程数来表示系统负载。而动态文档服务需要进行额外的处理,其占用的系统资源就超过处理静态请求,因此需要使用一个权重来表示。这样一个最简单的服务器负载表示公式就为:
其中L为服务器的负载,Ns为静态文档服务进程数,Nd为动态文档服务进程数,而a为每个动态文档服务相对于静态文档服务的权重,可以在10到100之间进行选择。
在这个公式中没有考虑服务器硬件的限制,当达到硬件限制的时候,由于资源紧张,服务器的负载就会明显增加。例如由于服务器内存大小的限制,一些进程就要被交换到硬盘上,使得系统负载迅速增加。考虑了系统硬件限制,则服务器的负载可以表示为:
新增加的参数 Ll表示这个服务器普通负荷的限度,它要根据每个服务器本身的硬件能力来设置。而b表示超出正常负载时用来限制分配给服务器任务的权重,应该设置为大于Ll的数值,以表示硬件限制作用。通常在一个服务器集群中,硬件设置越差的服务器这个权重越要设置的大,以避免在所有的服务器都超负载运行时,硬件最差的服务器反而负载最高。因此b是和本服务器硬件限制Ll成反比的,则b可以设置为:
Llmax为服务器集群中最高硬件配置的服务器的Ll值。当确定了每个服务器的负载之后,中心控制负载分配的服务器就能将负载正确的分发给最空闲的服务器,从而不会象其他的负载分配策略那样会导致负载分配不均匀的情况。
3. 实现方法及实验结果
我们的服务器系统由使用快速以太网连接起来的多台FreeBSD系统组成。每台后端服务器上运行一个守护进程来动态获得自己的负载状态,而使用FreeBSD实现的中心控制网关就通过这些守护进程刷新各个服务器的负载,以进行正确的负载分配。
3.1支持负载均衡的网关
在FreeBSD系统下,提供了divert接口以支持网络地址转换能力。IP数据包通过系统内核的ipfw过滤功能被发送到divert接口中,以便外部守护进程natd能接收原始数据包,处理之后再发回系统内核进行正常的IP分发[5]。
因此根据FreeBSD的地址转换结构,可以创建自己的网络地址转换守护进程,以支持负载均衡功能,这样就能将FreeBSD系统作为一个支持负载均衡的网关。由于它是软件实现的方式,很容易支持非标准的协议及应用优化的负载均衡策略,具备很大的灵活性。
3.2实验及分析
为测试这种实现的可用性,我们针对最常见的HTTP协议进行我们的测试实验。为了区分不同的请求种类,设计了三个不同类型的测试,以测试不同方面的性能。
CGI程序产生的动态文档:用于测试在服务器的处理能力的负载均衡状态。
小型静态文档:使用尺寸较小的静态文档,用于测试频繁连接下负载均衡的状态;
大型静态文档:使用较大的文档,测试磁盘及网络I/O的负载均衡状态;
测试结果以单台服务器每秒钟完成请求的性能为基准,显示使用多台服务器进行负载均衡时每秒种完成的请求数与基准请求次数的比率。
图1:负载均衡性能
从上图中的第一条曲线a是处理动态文档请求的,此时随着服务器数量的增加,其性能是成倍增加的;而第二条曲线b为处理小尺寸静态文档请求的,在使用三台服务器时性能改善就不明显了;而处理大尺寸静态文档请求的第三条曲线c则几乎没有发生性能变化。为了找到负载均衡系统达不到理想状态的原因,我们考察了服务器资源的利用率:
表1.服务器资源的利用率
处理类型
负载均衡网关
服务器1
服务器2
服务器3
a
53%
97%
95%
98%
b
76%
43%
39%
41%
c
94%
32%
31%
35%
从这个表中可以看出,当处理动态文档a时三台服务器都处于全速运行状态,负载被均匀分配,这是一种理想的状态。当处理静态文档类型b和c时,负载虽然被均匀分配给三台服务器,但每台服务器都没有处于全速运行状态。尤其在处理大尺寸文档时,负载均衡设备中的natd进程则占据了大部分处理资源。由于所有的网络流量都要经过它进行转换,因此在网络流量和并发连接数量相当大时,natd进程的负载就增加上去了。实验中使用不同数量的后端服务器时,流经负载均衡网关的实际网络带宽为:
表2:提供大尺寸文档时服务器集群的带宽
服务器数量
1台
2台
3台
网络速度(Kb/s)
10042.14
11015.10
11442.67
可以看出带宽限制在10MB/s左右,显然这是这个测试使用的负载均衡进程的带宽限制,事实上该程序使用了链表来维护网络地址转换的状态,这就大大限制了它的网络性能,通过提高硬件性能和改善算法,完全可以进一步提高其性能。
4.讨论
从上面的实验中可以看出,基于网络地址转换的负载均衡器可以有效的解决服务器端的CPU和磁盘I/O负载,然而负载均衡器本身的性能受网络I/O的限制,在一定硬件条件下具有一定的带宽限制,但可以通过改善算法和提高运行负载均衡程序的硬件性能,来提高这个带宽限制。同时也可以看出,不同的服务类型对不同的服务器资源进行占用,我们使用的负载衡量策略是使用同一个负载进行评估,这对于大多数条件是适合的,然而最好的办法是针对不同的资源,如CPU、磁盘I/O或网络I/O等,分别监视服务器负载,由中心控制器选择最合适的服务器分发客户请求。我们以后的工作将从这两个方面入手,完善这个负载均衡控制器。
参考文献:
[1] E.Kata,M.Butler, and R. McGrath. A scalable HTTP server: the ncsa PRototype. Computer Networks and ISDN systems. 1994. Vol 27, P155-164
[2] Ralf S.Engelschall. Load Balancing Your Web Site. Web Techniques Magazine (http://www.WebTechniques.com), May 1998. vol.3, iss.5
[3] CICSO. LocalDirector Documents. http://www.cisco.com, 1997
[4] H.Zhu. T.Yang, Q.Zheng, D.Watson, O.H.Ibarra, andT.Smith, Adaptive load sharing for clustered digital library servers. Technical Report, CS, UCSB, 1998.
[5] FreeBSD core team. natd and divert manual pages. http://www.freebsd.org. 1995
Implement a load balancing gateway by NAT
Wang, Bo
NongYe Road 70, ZhengZhou, 450002, P.R.China
wb@email.online.ha.cn
Abstract: This paper investigates load balancing techniques and strategies, and implements a load balancing gateway based NAT for our Internet servers. The Internet servers involve the high load of CPU and I/O by simultaneous access requests, the symmetrical clustered servers can distribute the server load to solve the problem. To balance the load in the best way, the gateway distributes the load according to the status of server's CPU and I/O. The gateway must monitor every server's load and apply the best scheme to delivery every request, so it can provide the high performance for Internet services.
KeyWords: load balancing, NAT, FreeBSD

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。
