科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>服务器频道>X86-zhiding>负载均衡实战之三:cdn缓存服务器攻略

负载均衡实战之三:cdn缓存服务器攻略

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在cdn的某个区域,需要部署多个缓存服务器,以集群方式来应对大量用户的访问请求,提高系统的高可用性。在机器数量较少的时候,我曾用dns轮训的方式把访问负载分担给服务器,效果不佳,因为DNS不会做健康检查。

来源:IT168 2009年09月28日

关键字:服务器 负载均衡 CDN

  (接上篇)在cdn的某个区域,需要部署多个缓存服务器,以集群方式来应对大量用户的访问请求,提高系统的高可用性。在机器数量较少的时候,我曾用dns轮训的方式把访问负载分担给服务器,效果不佳,因为DNS不会做健康检查。后来增加机器,做成lvs集群,就很安心了。

  一、cdn缓存服务器集群场景

  6个服务器,2个服务器为lvs负载均衡器,4个服务器为真实服务器。另外为了方便远程管理,还购置了一个KVM OVER IP设备。

  申请到8个公网ip地址,6个服务器用去6个,KVM OVER IP设备用掉1个,剩下1个作为VIP.

  4个真实服务器已经部署好应用(Varnish),并且只要修改本地windows的hosts文件,把域名指向这些ip,就可以通过这些缓存服务器访问到网站内容。关于缓存服务器的具体部署,请参照本书第7章"简单cdn"。

  为了方便阅读和理解,我把上述信息做成一个汇总表,如下表。

  

  缓存服务器集群信息汇总

  二、cdn缓存服务器集群部署

  尽管部署cdn缓存服务器集群没有先后顺序之分,但为了部署顺利进行,我们可以先从简单的部分开始,即先从lvs客户端开始,然后再到负载均衡器这边。

  ● 真实服务器上的操作(每个服务器都是一样的操作)

  1、 编写lvs客户端配置脚本,保存后给予执行权限。其完整的内容如下:

  [root@huludao-2 ~]# more /usr/local/bin/lvs_real

  #!/bin/bash

  #description : start realserver

  VIP=125.38.38.64

  /etc/rc.d/init.d/functions

  case "$1" in

  start)

  echo " start LVS of REALServer"

  /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

  echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

  echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

  echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

  echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

  ;;

  stop)

  /sbin/ifconfig lo:0 down

  echo "close LVS Directorserver"

  echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

  echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

  echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

  echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

  ;;

  *)

  echo "Usage: $0 {start|stop}"

  exit 1

  esac

  2、 运行和验证这个配置脚本,其具体方法如前所叙,不再赘述。

  ● 负载均衡器上的操作

  MASTER和BACKUP上安装ipvsadm及keepalived的方法都是一样的(具体步骤参见"上篇"内容),两者之间的主要差异在于其配置文件keepalived.conf 。

  1、 MASTER的配置文件/etc/keepalived/keepalived.conf.

  #writed by sery , contact sery@163.com

  #guration File for keepalived

  #global define

  global_defs {

  router_id LVS_CNC_1

  }

  vrrp_sync_group VGM {

  group {

  VI_CACHE

  }

  }

  ################################################################

  # vvrp_instance define #

  ################################################################

  vrrp_instance VI_CACHE {

  state MASTER

  interface eth0

  lvs_sync_daemon_inteface eth0

  virtual_router_id 51

  priority 180

  advert_int 5

  authentication {

  auth_type PASS

  auth_pass 1111

  }

  virtual_ipaddress {

  125.38.38.64

  }

  }

  ##############################################################

  # virtual machine setting #

  ##############################################################

  # setting port 80 forward

  virtual_server 125.38.38.64 80 {

  delay_loop 6

  lb_algo wlc

  lb_kind DR

  # persistence_timeout 20

  protocol TCP

  real_server 125.38.38.101 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  real_server 125.38.38.102 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  real_server 125.38.38.104 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  real_server 125.38.38.99 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  }

  2、 BACKUP配置文件/etc/keepalived/keepalived.conf

  #writed by sery , contact sery@163.com

  #guration File for keepalived

  #global define

  global_defs {

  router_id LVS_CNC_2

  }

  vrrp_sync_group VGM {

  group {

  VI_CACHE

  }

  }

  ################################################################

  # vrrp_instance setting #

  ################################################################

  vrrp_instance VI_CACHE {

  state BACKUP

  interface eth1

  lvs_sync_daemon_inteface eth1

  virtual_router_id 51

  priority 150

  advert_int 5

  authentication {

  auth_type PASS

  auth_pass 1111

  }

  virtual_ipaddress {

  125.38.38.64

  }

  }

  ##############################################################

  # virtual server setting #

  ##############################################################

  # setting port 80 forward

  virtual_server 125.38.28.64 80 {

  delay_loop 6

  lb_algo wlc

  lb_kind DR

  # persistence_timeout 50

  protocol TCP

  real_server 125.38.38.101 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  real_server 125.38.38.102 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  real_server 125.38.38.104 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  real_server 125.38.38.99 80 {

  weight 100

  TCP_CHECK {

  connect_timeout 3

  nb_get_retry 3

  delay_before_retry 3

  connect_port 80

  }

  }

  }

  在这样只有一个vrrp_instance 的环境里,主负载均衡器(MASTER)与备份负载均衡器(BACKUP)配置文件的差异一共只有3处: 全局定义的route_id、vrrp_instance state已经vrrp_instance的优先级priority。

  三、 负载均衡服务的启用和验证

  前面我们也提过,keepalived启动过程不会检查配置文件的语法,因此在启动keepalived以前,需要人工对/etc/keepalived/keepalived.conf文件做全面的语法检查。一个比较容易犯的错误就是把花括号"}"写漏了,不成对!

  当lvs客户端都正常启动并且配置文件经检查无误后(当然有错误也无妨,随时可以修改嘛!),执行命令 /usr/local/keepalived/sbin/keepalived -D ,然后我们查看系统进程,看是否是3个keepalived进程。如果配置文件的路径不是/etc/keepalived/keepalived.conf则需要在启动时用选项-f指定。

  最能反映keepalived启动情况的地方当属系统日志。手动执行启动操作后,使用命令 tail -f /var/log/messages 滚动查看输出,就能详细了解其运行情况。下图为某个lvs环境的keepalived启动输出:

  

  启动keepalived时系统日志的输出(截取)

  另外一个反映keepalived正常运行状态的地方是网络接口vip的启用。通过执行ip add 即可看见vip已经被绑定在制定的网络接口(注意:ifconfig 不能显示 vip)。需要注意的是,BACKUP的vip暂时不绑定。下图显示了这种比较。

  

  主负载均衡器(MASTER) 与备份负载均衡器(BACKUP)输出对比

  主负载均衡器(MASTER)和备份负载均衡器(BACKUP)的keepalived 都把它运行起来,然后我们进行功能测试。

  ● 测试前的准备

  1、 保证所有服务器的网络服务正常。这可以通过ping 所有机器的ip地址已经ping vip 来检查。

  2、 修改本地计算机的hosts文件,把域名跟vip绑定起来。然后再 ping 一下域名,看是否正常。如 125.38.38.64 www.sery.com

  ● 转发功能测试

  1、 在本地机器执行命令 telnet www.sery.com 80 ,检查访问是否正常。

  2、 在本地计算机的浏览器地址栏输入 http://www.sery.com ,看网站默认页是否能正常访问。

  3、 登录主负载均衡器,察看转发情况。Lvs的转发情况,是不能通过netstat -an这样的方式来察看的。这时,前面我们安装的ipvsadm终于上场了。执行不带任何选项的 ipvsadm指令,即可察看tcp连接情况。下图为主负载均衡器的转发情况:

  

  负载均衡器转发状态

  如果想知道当前测试机的访问请求被转发到那个服务器去了,可以在ipvsadm命令后带一个选项,其完整形式为:ipvsadm -lcn | grep 159.226.240.63 。

  [root@hld081028-mk ~]# ipvsadm -lcn | grep 159.226.240.63

  TCP 14:56 ESTABLISHED 159.226.240.63:39783 125.38.38.64:80 125.38.38.99:80

  ● 健康检查功能(故障隔离)测试

  通过手工的方法,使真实服务器提供的服务实效,然后再从客户端发起访问请求,检验lvs提供的服务是否可用。这种测试,有两种方式:停止某个真实服务器的服务(本例为varnish)、关闭网络服务。

  1、 关闭真实服务器125.38.38.99的varnish服务。先 telnet 125.38.38.99 80 ,不能访问为正常。然后再从本地计算机执行 telnet 125.38.38.64 80,如访问正常,再检查负载均衡器的输出。这时停止服务的机器125.38.38.99 将被lvs从转发列表中删除,系统日志也会有被删除的消息打印出来,如下图所示:

  

  服务停止,真实服务器从转发队列删除

  2、 关闭主机的网络。可以关闭网络接口或关闭服务器,然后再按第"1"步的方法测试,检查客户端的访问请求是否不受影响;转发队列是否把关闭网络服务的对象删除。下图为某个真实服务器网络启停时ipvsadm输出对比。

  

  关闭服务器前后ipvsadm输出对比

  3、 关闭lvs的客户端配置脚本/usr/local/bin/lvs_real。这个测试不会成功,关闭真实机器的vip以后,负载均衡器依然会把用户请求转发过来,可是tcp连接却不能成功,部分用户的访问失败。因此在部署和运维lvs环境时,要特别注意这一点。

  从上面的测试可知,关闭或停止服务,负载均衡器通过健康检查自动把实效的机器从转发队列删除掉,实现故障隔离,保证用户的访问不受影响。

  ● 失败切换(FailOver)测试

  关闭主负载均衡器(MASTER)的keepalived进程,然后从客户端访问vip地址及本地绑定的域名。方法是telnet 125.38.38.64 80 及用浏览器访问 http://www.sery.com . 检查访问是否正常。这是最直观的表现方法。

  正常情况下,当主负载均衡器(MASTER)实效时,备份负载均衡器(BACKUP)能立即接替转发任务(接替时间由keepalived.conf文件的advert_int指定)。在确认主负载均衡器(MASTER)的keepalived进程关闭后,我们来看看备份负载均衡器的运行情况。这里我们观察两个地方:ipvsadm的输出及系统日志的输出。

  1、 ipvsadm输出变化。未接替转发任务前,ipvsadm的输出字段ActionConn、InActionConn对应的值皆为"0"(因为没有请求转发);接替转发任务后,这两个字段的值立即发生变化。

  2、 系统输出日志将记录备份负载均衡器从BACKUP向MASTER切换过程,下面截取系统日志关于keepalived输出的部分:

  Jul 6 21:04:32 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Transition to MASTER STATE

  Jul 6 21:04:32 telcom-dl-1 Keepalived_vrrp: VRRP_Group(VGM) Syncing instances to MASTER state

  Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Entering MASTER STATE

  Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) setting protocol VIPs.

  Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Sending gratuitous ARPs on eth1 for 218.24.35.105

  Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: Netlink reflector reports IP 125.38.38.64 added

  Jul 6 21:04:37 telcom-dl-1 Keepalived_healthcheckers: Netlink reflector reports IP 125.38.38.64 added

  Jul 6 21:04:42 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Sending gratuitous ARPs on eth1 for 125.38.36.64

  现在再回来启动主负载均衡器(MASTER)的keepalived进程,接着察看辅助负载均衡器(BACKUP)的系统日志,截取一段输出如下:

  Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Received higher prio advert

  Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CAHCE) Entering BACKUP STATE

  Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) removing protocol VIPs.

  Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Group(VGM) Syncing instances to BACKUP state

  Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: Netlink reflector reports IP 125.38.38.64 removed

  Jul 6 21:18:12 telcom-dl-1 Keepalived_healthcheckers: Netlink reflector reports IP 125.38.38.64 removed

  这段输出显示,备份服务器尽管曾经行使了一段MASTER的职权,一旦原来的MASTER复活,它就得把控制权乖乖地交给原MASTER,自己打回原形BACKUP。是什么东西在起作用呢?是配置文件里设置的那个优先级"priority"。为了保证FailOver正常发挥作用,应确保主负载均衡器的"priority"值大于备份负载均衡器的"priority"值。同样,辅助负载均衡器的ipvsadm的输出也会发生变化,这里不再多做说明。

  下篇文章,介绍多负载均衡应用攻略,敬请关注。

邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅ZDNet技术邮件将是您的最佳途径之一。