24小时365天不间断服务1.2 实现Web服务器的冗余……DNS轮询_24小时365天不间断服务1.2 实现Web服务器的冗余……DNS轮询试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > web > 24小时365天不间断服务 > 1.2 实现Web服务器的冗余……DNS轮询

24小时365天不间断服务——1.2 实现Web服务器的冗余……DNS轮询

1.2.1 DNS轮询 DNS轮询 (DNS Round Robin)是指,利用DNS把一台服务器需要处理的内容,分配到多台服务器来进行。如图1.2.1所示为DNS轮询的行为。假定有两名想要访问www.example.cn网站的用户:A先生与B先生,这两人分别向DNS服务器询问了www.example.cn网站的IP地址,其后DNS服务器分别向两人解析返回了“x.x.x.1”与“x.x.x.2”两个不同的IP地址,于是A先生便通过x.x.x.1访问,B先生则通过x.x.x.2访问。 在DNS服务器中,若同一个域名上提交了多个记录(Record),则每次访问时DNS服务器都会解析到不同的IP地址。如果能够利用好这一特性,就能把需要处理的内容分配到多台服务器上进行处理。这是相对比较简易的负载分发的实现方式,但还存在以下问题: ● ●必须取得需要轮询的目标服务器的全局地址 为了实现多台服务器的负载分发,取得这些服务器的IP地址是利用服务(线路)的前提 ● ●并不一定能实现均等的分发 在手机站点中,这个问题被逐渐暴露了出来。通常来自手机的访问会经由称为行业网关的代理服务器,由于代理服务器会将域名解析的结果缓存一段时间,所以经由该代理服务器的访问请求就会被解析到同一台服务器上,因此就可能无法实现均等分配需要处理的请求,而只令某台服务器集中处理。另外在PC平台上的网页浏览器也会缓存这些DNS解析的结果,这就令均等分配更加不可能。虽说将DNS记录的TTL(Time To Live,DNS记录的缓存时间)修改得短一些多少可以改善这个问题,但这并不说只要修改TTL,令DNS缓存频繁释放,就能解决根本问题 ● ●无从得知服务器宕机 DNS服务器不能知晓Web服务器的负载或连接数等信息,因此无法根据服务器的反馈调节分配。当Web服务器的负载逐步加重,响应时间也变得很慢时,DNS也无从得知连接数是否已经超出服务器能够处理的范围。也就是说,即便服务器已经因为某种原因宕机,DNS服务器也不会注意到这些问题,只会继续进行负载分发处理。万一用户被分配到已经宕机的服务器,那么该用户要面对的将是出错的页面。DNS轮询始终只是机械地做着负载分发的操作,而这并不属于冗余的操作,因此很有必要安装其他软件来进行健康检查、故障转移等工作 1.2.2 DNS轮询的冗余拓扑结构示例 在如图1.2.2所示的拓扑结构中,两台Web服务器都被分配了VIP(虚拟IP)。万一Web1停止工作,VIP1就会映射到Web2,其后所有的访问都将由Web2处理。相反,万一Web2停止工作,VIP2就会映射到Web1,自然其后所有的访问都将由Web1处理。正是因为Web服务器彼此之间互相协调,所以只要有能够正常工作的服务器,VIP就会进行映射操作以维持服务的正常提供。 如果直接使用上文介绍的代码清单1.1.1(failover.sh)来搭建这个拓扑结构,就可能会出现以下问题: ● ●必须修改Web1与Web2的VIP设定值 ➡ 无法在两台服务器上使用同样的脚本 ● ● 由于使用了ICMP监控,因此即便Web服务(Apache等)停止,也无法触发故障转移 于是,我们将代码清单1.1.1的脚本修改成代码清单1.2.1的脚本。 代码清单1.2.1 failover2.sh #!/bin/sh DEV="eth0" VIP="10.0.0.1 10.0.0.2" healthcheck() { for i in $VIP;do if [ -z "`ip addr show $DEV | grep $i`" ]; then if [ "200" -ne "`curl -s -I 'http://$i/' | head -n 1 | cut -f 2 -d ' '" ]; then CIP="$i" return 1 fi fi done return 0 } ip_takeover() { MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1 | tr -d :` ip addr add $CIP/24 dev $DEV send_arp $CIP $MAC 255.255.255.255 ffffffffffff } while healthcheck; do echo "health ok!" sleep 1 done echo "fail over!" ip_takeover 这样两台服务器就能使用同样内容的脚本了。这里并没有使用ping指令,而是通过使用curlA来进行健康检查,所以即使Web服务停止,也能启动故障转移,但是这样做仍会留下两个问题: ● ● 由于即使Web服务停止也无法释放VIP,因此可能会造成IP地址冲突 ● ● 一旦启动故障转移,该脚本就会停止运行 考虑到以上两点,还需要对脚本做些修改,如代码清单1.2.2所示。 代码清单1.2.2 failover3.sh #!/bin/sh DEV="eth0" VIP="10.0.0.1 10.0.0.2" ip_add() { MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1 | tr -d :` ip addr add $1/24 dev $DEV send_arp $i $MAC 255.255.255.255 ffffffffffff } ip_del() { ip addr del $1/24 dev $DEV } healthcheck() { for i in $VIP;do if [ "200" -ne "`curl -s -I 'http://$i/' | head -n 1 | cut -f 2 -d ' '" ]; then if [ -z "`ip addr show $DEV | grep $i`" ]; then ip_add $i else ip_del $i fi fi done } while true; do healthcheck;sleep 1;done A 命令行的HTTP客户端软件。 URL http://curl.haxx.se/ 代码清单1.2.2的修改增加了以下内容:在VIP的健康检查失败的情况下,若为自行分配的地址,则可视为本机的Web服务发生了异常,其后释放VIP;相反,若不是自行分配的地址,则可视为对方的Web服务发生了异常,从而自行将VIP映射。另外,在本脚本中,无论如何映射VIP,脚本都不会停止运行。 1.2.3 还想更轻松地扩充系统 ……负载均衡器 根据以上介绍,无论哪方服务器的Web服务发生了异常,都能够正确地启动故障转移。而要想使用DNS轮询在实现负载分发的同时也实现冗余,就需要花费很多心力。随着服务器数量的增加,系统会越来越复杂,设置DNS轮询的冗余搭建也会变得越来越难。如果在3台服务器上使用代码清单1.2.2的脚本,就会出现以下问题: ● ●在某个服务器宕机后无法确定具体要交接到哪个服务器 ● ● 根据启动故障转移的时机,有时可能会让两台服务器分配到同样的IP地址 ● ●一旦服务器停止运行,修复这台服务器的工作会变得很困难 虽说通过进一步完善脚本或者配合使用其他的软件应该也能解决这些问题,但我们还是希望可以更轻松地扩充系统。另外,在Web服务器的拓扑结构中还是尽量不要运行其他软件。在下面一节中,我们将介绍 负载均衡器 ,通过引入负载均衡器,以上问题就会迎刃而解。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《24小时365天不间断服务》其他试读目录

• 1.1 冗余的基础
• 1.2 实现Web服务器的冗余……DNS轮询 [当前]
• 1.3 实现Web服务器的冗余……基于IPVS的负载均衡器
• 1.4 路由器及负载均衡器的冗余