Web基础架构:负载均衡和LVS

标签: web 基础 架构 | 发表时间:2014-05-16 15:24 | 作者:
出处:http://news.cnblogs.com/

作者:王晨纯

阿里巴巴 Java 开发工程师,目前负责天猫和淘宝的店铺浏览系统,长期关注系统稳定性、性能优化、Web 系统架构。(Blog: blog.hesey.net 新浪微博: Hesey 小纯纯

在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库、缓存等等)。

一、负载均衡的作用

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

一个典型的互联网应用的拓扑结构是这样的:

二、负载均衡的类型

负载均衡可以采用硬件设备,也可以采用软件负载。

商用硬件负载设备成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软负载,软负载解决的两个核心问题是:选谁、转发,其中最著名的是 LVS(Linux Virtual Server)。

三、软负载——LVS

LVS 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之上,传输层上有我们熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的负载均衡。

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

那么为什么 LVS 是在第四层做负载均衡?

首先 LVS 不像 HAProxy 等七层软负载面向的是 HTTP 包,所以七层负载可以做的 URL 解析等工作,LVS 无法完成。其次,某次用户访问是与服务端建立连接后交换数据包实现的,如果在第三层网络层做负载均衡,那么将失去「连接」的语义。软负载面向的对象应该是一个已经建立连接的用户,而不是一个孤零零的 IP 包。后面会看到,实际上 LVS 的机器代替真实的服务器与用户通过 TCP 三次握手建立了连接,所以 LVS 是需要关心「连接」级别的状态的。

LVS 的工作模式主要有 4 种:

DR

NAT

TUNNEL

Full-NAT

这里挑选常用的 DR、NAT、Full-NAT 来简单介绍一下。

1、DR

请求由 LVS 接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过 LVS。

DR 模式下需要 LVS 和绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现)。

一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。

RS 收到 LVS 转发来的包,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。

而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。

DR 模式是性能最好的一种模式。

2、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 的存在。

3、Full-NAT

无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。

这引发的两个问题是:

1、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。

2、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。

Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。

Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下:

在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。

内网 IP 之间可以通过多个交换机跨 VLAN 通信。

当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。

LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。

Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。

4、Session

客户端与服务端的通信,一次请求可能包含多个 TCP 包,LVS 必须保证同一连接的 TCP 包,必须被转发到同一台 RS,否则就乱套了。为了确保这一点,LVS 内部维护着一个 Session 的 Hash 表,通过客户端的某些信息可以找到应该转发到哪一台 RS 上。

5、LVS 集群化

采用 Full-NAT 模式后,可以搭建 LVS 的集群,拓扑结构如下图:

6、容灾

容灾分为 RS 的容灾和 LVS 的容灾。

RS 的容灾可以通过 LVS 定期健康检测实现,如果某台 RS 失去心跳,则认为其已经下线,不会在转发到该 RS 上。

LVS 的容灾可以通过主备+心跳的方式实现。主 LVS 失去心跳后,备 LVS 可以作为热备立即替换。

容灾主要是靠 KeepAlived 来做的。

更多参考资料: 吴佳明 – LVS 在大规模网络环境下的应用 – O’Reilly Velocity China 2012

本文链接

相关 [web 基础 架构] 推荐:

Web基础架构:负载均衡和LVS

- - 博客园_新闻
阿里巴巴 Java 开发工程师,目前负责天猫和淘宝的店铺浏览系统,长期关注系统稳定性、性能优化、Web 系统架构. blog.hesey.net 新浪微博: Hesey 小纯纯). 在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库、缓存等等).

零基础如何学习 Web 安全?

- - 知乎每日精选
这是个好问题,我强迫症犯了,本来你写的是“web”,我改为了“Web”. 因为正好Web安全是我擅长的,你说的是 0基础,我总结下我的一些看法吧,针对0基础的. Web分为好几层,一图胜千言:. 事实是这样的: 如果你不了解这些研究对象是不可能搞好安全研究的. 这样看来,Web有八层(如果把浏览器也算进去,就九层啦,九阳神功……).

web基础-web工作原理,http协议,浏览器缓存

- - 浏览器 - 互联网 - ITeye博客
4,cookie和session. 平时用浏览器,输入网址后回车,页面响应我们想要浏览的内容,简单操作的背后蕴涵了什么原理. 当输入url回车后,客户端(浏览器)会去请求DNS服务器,通过DNS获取域名对应的IP地址,然后通过这个地址找到对应的服务器,要求建立TCP连接,建立连接,客户端发送httpRequest(请求包)后,服务器接收并开始处理请求,调用自身服务,返回httpResponse(响应包),客户端收到响应包后开始渲染body主体,等到全部接收,断开与该服务器端的TCP连接.

Kernel.org重建基础架构

- satan - Solidot
在遭黑客攻击后,Kernel.org至今仍未上线. 期间系统管理者发布了多次状态更新. 最新的更新称,他们正辛苦的从头开始重新搭建Kernel.org的基础架构,新的架构将不再允许shell访问git库,他们正在用Gitolite构建Git服务器. gitolite将通过SSH公钥进行权限控制.

豆瓣的基础架构

- - 博客园_知识库
  本文根据InfoQ中文站对豆瓣洪强宁(@hongqn)的沟通交流整理而成. 洪强宁介绍了豆瓣的架构和组件,并分享了豆瓣基础平台部的一些团队经验. 文中截图来自洪强宁在2013年CTO俱乐部中的分享.   豆瓣整个基础架构可以粗略的分为在线和离线两大块.   BeansDB项目可以说是一个简化版的AWS DynamoDB,该项目在2008年启动,2009年开源,第⼀版使⽤tokyo cabinet作为存储引擎,2010年使⽤bitcask存储格式重写了存储引擎,性能更好.

web信息架构和社会化

- 丽维 - Tony-懒得设计
大家都喜欢PPT,那就分享吧. 这个演讲稿实际有34页,拆分“动作”之后变成63页面. 下面是简单的解释,为了给书友会各舵主使用的,都分享出来吧. 真害怕误导大家,喜欢速读的朋友直接阅读61页,就可以了. web信息架构这本书是十几年前信息数字化沉淀下来的理论体系,而今,互联网的发展让用户从当初的简单消费到深度参与.

全 Javascript 的 Web 开发架构:MEAN

- - 开源中国社区最新新闻
最近在Angular社区的原型开发者间,一种全Javascript的开发架构MEAN正突然流行起来. 其首字母分别代表的是:(M)ongoDB——NoSQL的文档数据库,使用JSON风格来存储数据,甚至也是使用JS来进行sql查询;(E)xpress——基于Node的Web开发框架;(A)agular——JS的前端开发框架,提供了声明式的双向数据绑定;(N)ode——基于V8的运行时环境(JS语言开发),可以构建快速响应、可扩展的网络应用.

简谈IT基础架构规划

- - 人月神话的BLOG
IT基础架构规划和研究是合理规划和安排各项信息化基础设施,使之形成良好的IT环境,让各种业务解决方案、应用系统和数据都能不受约束地在其上实现有效配合. 这些基础设施包括网络、硬件设备和基础软件. 对应网络层面重点是核心的组网和网络拓扑,内部局域网的划分,VPN网络,企业内核心业务网络间的防火墙安全隔离等.

DNS基础及域名系统架构

- - 编程语言 - ITeye博客
客户机根据/etc/nsswitch.conf文件来确定名字解析的顺序. 在本例中,假定的顺序是:首先是本地文件,其次NIS+服务器,最后是DNS. 客户机查找本地/etc/inet/hosts文件,没有发现匹配项. 客户机向NIS+服务器发起关于ftp.internic.net地址的查询,仍然没有找到.

WEB安全测试所需的基础知识提纲

- - CSDN博客Web前端推荐文章
第一章:B/S架构体系安全渗透测试基础. (1)介绍HTTP标示URL. (2)HTTP响应状态码. (3)HTTP协议传输内容. (1)HTTP常见认证机制. (2)BASE64编码介绍. (1)拒绝服务攻击基础. (2)Smurf攻击模型. (3)Fraggle攻击模型. (4)SynFlooding攻击模型.