《大型网站技术实践》借助LVS+Keepalived实现负载均衡

1、负载均衡:必不可少的基础手段

1.1 找更多的牛来拉车吧

  当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群总体对外提供服务,这些集群能够是Web应用服务器集群,也能够是数据库服务器集群,还能够是分布式缓存服务器集群等等。 html

古人有云:当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛来拉车前端

load balance

  在实际应用中,在Web服务器集群以前总会有一台负载均衡服务器,负载均衡设备的任务就是做为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器做为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不须要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。 linux

1.2 负载均衡的类型

  负载均衡能够采用硬件设备(例如经常听见的F5),也能够采用软件负载。 web

  商用硬件负载设备成本一般较高(一台几十万上百万很正常),因此在条件容许的状况下咱们会采用软件负载; 算法

  软件负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)。 数据库

传送门->关于负载均衡的实现方式类型等介绍请浏览个人另外一篇博文:《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构 vim

2、初识LVS:Linux Virtual Server

2.1 LVS是神马东西

  LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。如今LVS已是 Linux标准内核的一部分,在Linux2.4内核之前,使用LVS时必需要从新编译内核以支持LVS功能模块,可是从Linux2.4内核之后,已经彻底内置了LVS的各个功能模块,无需给内核打任何补丁,能够直接使用LVS提供的各类功能。 后端

2.2 LVS有神马做用

  LVS主要用于服务器集群的负载均衡。它工做在网络层,能够实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一块儿造成一个超级服务器。它易用,配置很是简单,且有多种负载均衡的方法。它稳定可靠,即便在集群的服务器中某台服务器没法正常工做,也不影响总体效果。另外可扩展性也很是好。 浏览器

  LVS自从1998年开始,发展到如今已是一个比较成熟的技术项目了。能够利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。 缓存

2.3 LVS的体系结构

  使用LVS架设的服务器集群系统有三个部分组成:

  (1)最前端的负载均衡层,用Load Balancer表示;

  (2)中间的服务器集群层,用Server Array表示;

  (3)最底端的数据共享存储层,用Shared Storage表示;

  在用户看来,全部的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

传送门->关于体系结构的详细介绍,请浏览南飞蚂蚁的blog:http://ixdba.blog.51cto.com/2895551/552947

2.4 LVS负载均衡机制

  (1)LVS是四层负载均衡,也就是说创建在OSI模型的第四层——传输层之上,传输层上有咱们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。由于LVS是四层负载均衡,所以它相对于其它高层负载均衡的解决办法,好比DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是很是高的。

  (2)LVS的转发主要经过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。

  ①NAT模式:网络地址转换

NAT

  NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要通过LVS的处理。LVS须要做为RS(真实服务器)的网关。当包到达LVS时,LVS作目标地址转换(DNAT),将目标IP改成RS的IP。RS接收到包之后,仿佛是客户端直接发给它的同样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包经过网关(LVS)中转,LVS会作源地址转换(SNAT),将包的源地址改成VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端没法感知到后端RS的存在。

  ②DR模式:直接路由

DR

  DR模式下须要LVS和RS集群绑定同一个VIP(RS经过将VIP绑定在loopback实现),但与NAT的不一样点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不通过LVS。详细来看,一个请求过来时,LVS只须要将网络帧的MAC地址修改成某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是作了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是本身的,到上面的网络层,发现IP也是本身的,因而这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回便可,再也不通过LVS。

  (3)DR负载均衡模式数据分发过程当中不修改IP地址,只修改mac地址,因为实际处理请求的真实物理IP地址和数据请求目的IP地址一致,因此不须要经过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。所以,DR模式具备较好的性能,也是目前大型网站使用最普遍的一种负载均衡手段。

3、构建实战:LVS+Keepalived实现负载均衡

3.1 实验结构总览

  (1)本次基于VMware Workstation搭建一个四台Linux(CentOS 6.4)系统所构成的一个服务器集群,其中两台负载均衡服务器(一台为主机,另外一台为备机),另外两台做为真实的Web服务器(向外部提供http服务,这里仅仅使用了CentOS默认自带的http服务,没有安装其余的相似Tomcat、Jexus服务)。

  (2)本次实验基于DR负载均衡模式,设置了一个VIP(Virtual IP)为192.168.80.200,用户只须要访问这个IP地址便可得到网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。

3.2 基础准备工做

  如下工做针对全部服务器,也就是说要在四台服务器中都要进行配置:

  (1)绑定静态IP地址

  命令模式下能够执行setup命令进入设置界面配置静态IP地址;x-window界面下能够右击网络图标配置;配置完成后执行service network restart从新启动网络服务;

  验证:执行命令ifconfig

  (2)设定主机名

  ①修改当前会话中的主机名,执行命令hostname xxxx (这里xxxx为你想要改成的名字)

  ②修改配置文件中的主机名,执行命令vi /etc/sysconfig/network (√通常须要进行此步凑才能永久更改主机名)

  验证:重启系统reboot

  (3)IP地址与主机名的绑定

  执行命令vi /etc/hosts,增长一行内容,以下(下面的从节点以你本身的为主,本实验搭建了两个从节点):

  192.168.80.100 lvs-master

  192.168.80.101 lvs-slave

  #下面是本次试验的两个真实服务器节点

  192.168.80.102 lvs-webserver1

  192.168.80.103 lvs-webserver2

  保存后退出

  验证:ping lvs-master

  (4)关闭防火墙

  ①执行关闭防火墙命令:service iptables stop

      验证:service iptables stauts

  ②执行关闭防火墙自动运行命令:chkconfig iptables off

  验证:chkconfig --list | grep iptables

3.3 配置两台Web服务器

  如下操做须要在角色为Web服务器的两台中进行,不须要在负载均衡服务器中进行操做:

  (1)开启http服务

  命令:service httpd start

  补充:chkconfig httpd on -->将httpd设为自启动服务

  (2)在宿主机访问Web网页,并经过FTP工具上传自定义网页:这里上传一个静态网页,并经过更改其中的html来区别两台Web服务器,如下图所示为例,其中一台显示from 192.168.80.102,而另外一台显示from 192.168.80.103;

  (3)编辑realserver脚本文件

  ①进入指定文件夹:cd /etc/init.d/

  ②编辑脚本文件:vim realserver

复制代码
SNS_VIP=192.168.80.200 /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP /sbin/route add -host $SNS_VIP dev lo:0 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 sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 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 "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
复制代码

  这里咱们设置虚拟IP为:192.168.80.200

  ③保存脚本文件后更改该文件权限:chmod 755 realserver

  ④开启realserver服务:service realserver start

3.4 配置主负载服务器

  (1)安装Keepalived相关包

yum install -y keepalived

  在CentOS下,经过yum install命令能够很方便地安装软件包,可是前提是你的虚拟机要联网;

  (2)编辑keepalived.conf配置文件

  ①进入keepalived.conf所在目录:cd /etc/keepalived

  ②首先清除掉keepalived原有配置:> keepalived.conf

  ③从新编辑keepalived配置文件:vi keepalived.conf

复制代码
global_defs { notification_email { edisonchou@hotmail.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.80.1 smtp_connection_timeout 30 router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是惟一的 } vrrp_instance VI_1 { state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 interface eth1 #指定Keepalived的角色,MASTER为主,BACKUP为备 virtual_router_id 51 #虚拟路由编号,主备要一致 priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR advert_int 1 #检查间隔,默认为1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.200 #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个 } } # 定义对外提供服务的LVS的VIP以及port virtual_server 192.168.80.200 80 { delay_loop 6 # 设置健康检查时间,单位是秒 lb_algo wrr # 设置负载调度的算法为wlc lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式 nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.80.102 80 { # 指定real server1的IP地址 weight 3 # 配置节点权值,数字越大权重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.80.103 80 { # 指定real server2的IP地址 weight 3 # 配置节点权值,数字越大权重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } 
复制代码

  (3)开启keepalived服务

service keepalived start

3.5 配置从负载服务器

  从负载服务器与主负载服务器大体相同,只是在keepalived的配置文件中须要改如下两处:

  (1)将state由MASTER改成BACKUP

  (2)将priority由100改成99

复制代码
vrrp_instance VI_1 { state BACKUP # 这里改成BACKUP interface eth1 virtual_router_id 51 priority 99 # 这里改成99,master优先级是100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.200 } } 
复制代码

3.6 验证性测试

  (1)指定请求的均衡转发:由于两个Web服务器的权重都同样,因此会依次转发给两个Web服务器;

  (2)Web服务器发生故障时:

  ①A发生故障后,只从B获取服务;

  这里模拟192.168.80.102发生故障,暂停其http服务:service httpd stop

  再来看看这时从外部访问VIP时,便会只从192.168.80.103获取网页:

  ②A故障修复后,又从A获取服务;

  这里模拟192.168.80.102修复完成,重启其http服务:service httpd start

  再来看看这时从外部访问VIP,又能够从192.168.80.102获取网页:

  (3)主负载均衡服务器发生故障时,备机当即充当主机角色提供请求转发服务:

  这里模拟192.168.80.100发生故障,暂停其keepalived服务:service keepalived stop

  再来看看这时从外部访问VIP,仍是能够正常获取网页:

学习小结

  LVS是目前广为采用的软件负载均衡解决方案,在一些大型企业级系统及互联网系统中应用。本次,简单地了解了一下LVS,并在Linux下搭建了一个小小的测试环境,借助Keepalived实现了一个最小化的负载均衡测试环境。LVS是一个能够工做在网络第四层的负载均衡软件,所以它相对于Nginx一类工做在第七层的负载均衡软件有着无可比拟的性能优点,并且它仍是我国的章文嵩博士(如今阿里的副总裁,淘宝的技术专家)做为创始人发起的,现已经成为Linux内核的组成部分。

  固然,目前流行的LVS解决方案中,在Web服务器端也有采用了Nginx+Tomcat这样的搭配类型,静态文件和动态文件分开进行处理,也不失为一种有效的尝试。

参考资料

(1)王晨纯,《Web基础架构:负载均衡和LVS》:http://www.importnew.com/11229.html

(2)win_xp,《LVS简介及使用》:http://www.cnblogs.com/codebean/archive/2011/07/25/2116043.html

(3)jiwang1980,《LVS+Keepalived》:http://7567567.blog.51cto.com/706378/578289

(4)南飞蚂蚁的BLOG,《Linux负载均衡软件LVS之概念篇》:http://ixdba.blog.51cto.com/2895551/552947

(5)AKing王国,《四层和七层负载均衡的区别》:http://kb.cnblogs.com/page/188170/

相关文章
相关标签/搜索