6.3 cdn缓存服务器的负载均衡(lvs+keepalived
      作者:田逸(sery@163.com
在cdn的某个区域,需要部署多个缓存服务器,以集群方式来应对大量用户的访问请求,提高系统的高可用性。在机器数量较少的时候,我曾用dns轮训的方式把访问负载分担给服务器,效果不佳,因为DNS不会做健康检查。后来增加机器,做成lvs集群,就很安心了。
6.3.1 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”。
为了方便阅读和理解,我把上述信息做成一个汇总表,如表6-2。
角色
所需ip
实现负载所需软件
操作
负载均衡器(MASTER)
接口ip、VIP
ipvsadm,keepalived
安装ipvsadm及keepalived
负载均衡器(BACKUP)
接口ip、VIP
ipvsadm,keepalived
安装ipvsadm及keepalived
真实服务器(server pool)
接口ip、VIP
Lvs 客户端配置脚本
按“6.1.2”节内容编写配置脚本
表6-2 缓存服务器集群信息汇总
6.3.2 cdn缓存服务器集群部署
尽管部署cdn缓存服务器集群没有先后顺序之分,但为了部署顺利进行,我们可以先从简单的部分开始,即先从lvs客户端开始,然后再到负载均衡器这边。
● 真实服务器上的操作(每个服务器都是一样的操作)
1、 照“6.1.2节”的格式编写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的方法都是一样的(具体步骤参见“6.1.1”及“6.2.2”两节的内容),两者之间的主要差异在于其配置文件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。
6.3.3 负载均衡服务的启用和验证
Lvs客户端的启用和验证在前面的“6.1.3”一节有过详细的说明,此处略过。前面我们也提过,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 滚动查看输出,就能详细了解其运行情况。图6-3为某个lvs环境的keepalived启动输出:
clip_p_w_picpath002
图6-3 启动keepalived时系统日志的输出(截取)
另外一个反映keepalived正常运行状态的地方是网络接口vip的启用。通过执行ip add 即可看见vip已经被绑定在制定的网络接口(注意:ifconfig 不能显示 vip)。需要注意的是,BACKUP的vip暂时不绑定。图6-4显示了这种比较。
clip_p_w_picpath004
图6-4 主负载均衡器(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连接情况。图6-5为主负载均衡器的转发情况:
clip_p_w_picpath006
图6-5 负载均衡器转发状态
如果想知道当前测试机的访问请求被转发到那个服务器去了,可以在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从转发列表中删除,系统日志也会有被删除的消息打印出来,如图6-6所示:
clip_p_w_picpath008
图6-6 服务停止,真实服务器从转发队列删除
2、 关闭主机的网络。可以关闭网络接口或关闭服务器,然后再按第“1”步的方法测试,检查客户端的访问请求是否不受影响;转发队列是否把关闭网络服务的对象删除。图6-7为某个真实服务器网络启停时ipvsadm输出对比。
clip_p_w_picpath010
图6-7 关闭服务器前后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的输出也会发生变化,这里不再多做说明。