探索服务器端的局域网——通过分配请求来平衡负载

1、性能不足时需要负载均衡:

当服务器的访问量上升时,增加服务器线路的带宽是有效的,但并不是网络变快了就可以解决所有问题。高速线路会传输大量的网络包,这会导致服务器的性能跟不上。尤其是CGI等应用程序动态生成数据的情况下,对服务器CPU的负担更重,服务器性能的问题也会表现得越明显。

在这种情况下,使用多台服务器来分担负载的方法更有效。这种架构统称为分布式架构,其中对于负载的分担有几种方法,最简单的一种方法就是采用多台Web服务器,减少每台服务器的访问量。要采用这样的方法,必须有一个机制将客户端发送的请求分配到每台服务器上。具体的做法有很多种,最简单的一种是通过DNS服务器来分配。

当访问服务器时,客户端需要先向DNS服务器查询服务器的IP地址,如果在DNS服务器中填写多个名称相同的记录,则每次查询时DNS服务器都会按顺序返回不同的IP地址。例如:对于域名www.lab.glasscom.com,如果我们给它分配如下3个IP地址:

192.0.2.60、192.0.2.70、192.0.2.80

当第1次查询这个域名时,服务器会返回如下内容:

192.0.2.60、192.0.2.70、192.0.2.80

当第2次查询这个域名时,服务器会返回如下内容:

192.0.2.70、192.0.2.80、192.0.2.60

当第3次查询这个域名时,服务器会返回如下内容:

192.0.2.80、192.0.2.60、192.0.2.70

当第4次查询时就又回到第1次查询的结果。这种方式称为轮询(round-robin),通过这种方式可以将访问平均分配给所有的服务器。

但这种方式是有缺点的。假如多台Web服务器中有一台出现了故障,这时我们希望在返回IP地址时能够跳过故障的Web服务器,然而普通的DNS服务器并不能确认Web服务器是否正常工作,因此即便Web服务器宕机了,它依然可能会返回这台服务器的IP地址(如果浏览器在访问DNS服务器返回的第一个IP地址失败时,能够继续尝试第二个IP地址,就可以回避这个问题了)。

此外,轮询分配还可能会引发一些问题。在通过CGI等方式动态生成网页的情况下,有些操作是要跨多个页面的,如果这期间访问的服务器发生了变化,这个操作就可能无法继续。

2、使用负载均衡器分配访问:

为了避免出现前面的问题,可以使用一种叫作负载均衡器的设备。使用负载均衡器时,首先要用负载均衡器的IP地址代替Web服务器的实际地址注册到DNS服务器上。这样一来,客户端就会将请求发送至负载均衡器,然后由负载均衡器来判断将请求转发给哪台Web服务器。这里的关键点在如何判断将请求转发给哪台Web服务器。

判断条件有很多种,根据操作是否跨多个页面,判断条件也会有所不同。如果操作没有跨多个页面,则可以根据Web服务器的负载状况来进行判断。负载均衡器可以定期采集Web服务器的CPU、内存使用率,并根据这些数据判断服务器的负载状况,也可以向Web服务器发送测试包,根据响应所需的时间来判断负载状况。但是如果密集地去查询服务器的负载,这个查询操作本身就会增加Web服务器的负载。因此,也可以根据事先设置的服务器性能指数,按比例来分配请求。

当操作跨多个页面时,则不考虑Web服务器的负载,而是必须将请求发送到同一台Web服务器上。但是HTTP协议本身是无状态的,我们无法根据HTTP协议判断是否和之前的请求相关。于是,人们想出了一些方案来判断请求之间的关联性。例如,可以在发送表单数据时在里面加上用来表示关联的信息,或者是对HTTP规格进行扩展,在HTTP头部字段中加上用来判断相关性的信息(俗称Cookie)。这样负载均衡器就可以通过这些信息来做出判断,将一系列相关的请求发送到同一台Web服务器,对于不相关的请求则发送到负载较低的服务器了。

Guess you like

Origin blog.csdn.net/qq_38386085/article/details/104093116