【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

news/2024/5/9 14:29:38/文章来源:https://blog.csdn.net/dreamboycx/article/details/85071815

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

1.1 找更多的牛来拉车吧

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

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

load balance

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

1.2 负载均衡的类型

  负载均衡可以采用硬件设备(例如常常听见的F5),也可以采用软件负载。

  商用硬件负载设备成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软件负载;

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

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

二、初识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模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

三、构建实战: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:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announcesysctl -p >/dev/null 2>&1echo "RealServer Start OK";;
stop)ifconfig lo:0 downroute del $SNS_VIP >/dev/null 2>&1echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "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 30router_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  #检查间隔,默认为1sauthentication {  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 # 这里改为BACKUPinterface eth1  virtual_router_id 51  priority 99 # 这里改为99,master优先级是100advert_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这样的搭配类型,静态文件和动态文件分开进行处理,也不失为一种有效的尝试。在以后的日子里,我还会尝试下在Linux下借助Jexus跑ASP.NET MVC项目,试试.NET项目在Linux下的运行效果,希望到时也可以做一些分享。好了,今天就到此停笔。

参考资料

(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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_870709.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客网站终于可以上线了 www.cnopenblog.com

最近一直在忙于开发自己的博客网站,现在终于可以和大家见面了!http://www.cnopenblog.com 欢迎大家访问拍砖

非常炫的网页,可以用于制作漂亮的网站!

Juqery特效模板网站:http://www.17sucai.com/tags/1/4/0/208 模板一 下载地址: http://www.17sucai.com/pins/626.html 预览地址: http://www.17sucai.com/pins/demoshow/626 实际网站: http://www.ruifox.com/ 模板二 下载地址&a…

开源jQuery插件推荐 帮你快速构建单页网站!

单页网站将成为网站设计的主要趋势之一。其将设计元素减为最少,将访问者关心的核心内容放在最显眼位置,提高了网站效率。有一些jQuery插件可大大提高单页网站的开发效率,如Single Page Nav、Ascensor.js等。 单一页面网站(单一页面…

Mozilla开源TogetherJS:让网站拥有实时协作功能!

TogetherJS是一款免费开源的JavaScript库,开发者可以利用它给网站添加实时协作功能,并且内置许多功能,如视频、语音聊天、内容实时同步、获取用户实时焦点等。 TogetherJS是由Mozilla打造的一款可以给网站添加实时协作功能的JavaScript库&…

Squid代理服务器介绍-网站加速技术

http://os.51cto.com/art/201009/225813.htm 巧用Squid的ACL和访问列表实现高效访问控制 Squid代理服务器是一个缓存Internet数据的软件,可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议,提高用户下载页面的速度,并设置过滤。使用Squid可以通过访…

Squid代理服务器介绍-网站加速技术

巧用Squid的ACL和访问列表实现高效访问控制 Squid代理服务器是一个缓存Internet数据的软件,可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议,提高用户下载页面的速度,并设置过滤。使用Squid可以通过访问控制特性来灵活的控制用户访问时间、站点等…

李平:大型网站的灵魂——性能

在前一篇随笔 大型网站系统架构的演化中,介绍了大型网站的演化过程,期间穿插了一些技术和手段,我们可以从中看出一个大型网站的轮廓,但想要掌握设计开发维护大型网站的技术,需要我们一步一步去研究实践。所以我打算写一…

周末入手一台公测版M8,连夜为它改了网站,帆船书会M8版

周末入手一台公测版M8,用起来感觉非常好,我女朋友有台iPhone,我感觉M8跟iPhone相比各有千秋, 希望大家支持国货,相信魅族! 我是帆船书会的站长,M8入手后我连夜修改帆船书会,改了个M8…

【docsify】为网站写一个说明文档

【docsify】为网站写一个说明文档 !官方部署文档 全局安装 npm i docsify-cli -g初始化项目 在项目文件夹下,初始化 docsify init ./docs会生成三个文件 ./docs 下 index.html作为入口文件README.md作为主页.nojekyll防止 GitHub Pages 忽略以下…

Java开源建站工具

2011-08-12 09:22 | 4162次阅读 | 【已有12 条评论】发表评论 来源:阮一峰的网络日志 | 收藏到我的网摘 美国程序员Jon Scott Stevens,公布了他的创业公司所使用的开发工具清单 。 他的语言平台是Java,开发项目是一个网站(还…

转:有了这些网站,英文论文再也不难写了(15个英文论文写作辅助网站介绍和使用技巧)

大家在写英文论文的时候,都会遇到这样一些情况:句子写不出来想找一个例句参考,想搜索一下单词的搭配和习惯用法、想核对自己写的句子是否正确等等。 下面给大家介绍的网站主要在写英文论文的时候,可以提供例句参考、单词搭配和用…

IIS - 自动申请、部署Let’s Encrypt的免费SSL证书(让网站实现HTTPS协议)

IIS - 自动申请、部署Let’s Encrypt的免费SSL证书(让网站实现HTTPS协议) 一、HTTPS 协议介绍 1,什么是 HTTPS 协议? HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)&am…

React+flask 搭建网站---React 环境搭建

系统环境: mac 搭建过程: 1、安装node.js : 安装任何包时一定要取官网查看安装方法(因网络中每个人安装的环境和版本有差异,尽量安装官网指导进行安装).官网地址:https://nodejs.org/zh-cn/ 现在后,进行安装.安装完成后,进行后续操作. 2、安装React 创建应用的工具(脚…

小白学习React+flask 搭建网站-Flask 环境搭建

电脑系统: mac 安装过程如下: 1、新建文件夹用来存储需要创建的应用:(参照官网地址:http://flask.pocoo.org/docs/1.0/installation/) mkdir backend01 (backed01 是我创建的文件夹名称,这个名称可以自行定义).安装环境创建包:virtualenv virtualenv venv 2、创建环境:进…

网站开发工具、技术

前端开发 require.js 首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.…

网站首页抓取和收录情况分析(个人见解)

求职类网站的实效性比较重要,提供最新的职位信息,对网站和求职者都有帮助。我们网站的PR值还可以,但是采用的是静态首页,也就是更新的内容不会体现在首页上,那么搜索引擎对首页的蜘蛛爬行和更新都会比较慢。 下面是我们…

php+redis+python网站部署方案

1 采用原web总数据库,后端直接采用php。 2 采用原web总数据库,后端采用python/phpredis数据优化方案。 3 采用新的数据库,即将原有数据库拷贝,后端采用python/phpredis数据优化方案。 采用redis数据库可以大幅度提高查询性能。 部…

利用Python进行电商网站用户行为分析

电商网站用户行为分析 项目需求 1.用户整体购物情况怎样? 统计数据集中总的用户数,商品数,商品类别数,用户行为数。核心指标如PV,UV,跳出率,复购率,留存率等分别是多少? 2.用户…

win7 IIS7 发布网站 出现 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误

windows7下发布web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 原因: vs2010默认的是4.0框架,4.0的框架是独立的CLR&…

UI应遵循的三大网站设计原则

触摸优先设计、响应式设计、移动优先设计是UI设计师设计网站应遵循的三大原则,以使网站最大范围地适应各种设备。外文《Designing The Well-Tempered Web》中详细阐述了这三大原则。CSDN对该文进行了编译,内容如下: 随着技术的进化&#xff…