返回介绍

lvs 为何不能完全替代 DNS 轮询

发布于 2025-02-23 22:52:37 字数 5295 浏览 0 评论 0 收藏 0

之前的文章“ 一分钟了解负载均衡的一切 ”引起了不少同学的关注,评论中大家争论的比较多的一个技术点是 接入层负载均衡技术 ,部分同学持这样的观点:

1)nginx 前端加入 lvs 和 keepalived 可以替代“DNS 轮询”

2)F5 能搞定接入层高可用、扩展性、负载均衡,可以替代“DNS 轮询”

“DNS 轮询”究竟是不是过时的技术,是不是可以被其他方案替代,接入层架构技术演进,是本文将要细致讨论的内容。

一、问题域

nginx、lvs、keepalived、f5、DNS 轮询,每每提到这些技术,往往讨论的是接入层的这样几个问题:

1) 可用性 :任何一台机器挂了,服务受不受影响

2) 扩展性 :能否通过增加机器,扩充系统的性能

3) 反向代理+负载均衡 :请求是否均匀分摊到后端的操作单元执行

二、上面那些名词都是干嘛的

由于每个技术人的背景和知识域不同,上面那些名词缩写(运维的同学再熟悉不过了),还是花 1 分钟简单说明一下(详细请自行“百度”):

1) nginx :一个高性能的 web-server 和实施反向代理的软件

2) lvs :Linux Virtual Server,使用集群技术,实现在 linux 操作系统层面的一个高性能、高可用、负载均衡服务器

3) keepalived :一款用来检测服务状态存活性的软件,常用来做高可用

4) f5 :一个高性能、高可用、负载均衡的硬件设备(听上去和 lvs 功能差不多?)

5) DNS 轮询 :通过在 DNS-server 上对一个域名设置多个 ip 解析,来扩充 web-server 性能及实施负载均衡的技术

三、接入层技术演进

【裸奔时代(0)单机架构】

裸奔时代架构图

裸奔时代的架构图如上:

1)浏览器通过 DNS-server,域名解析到 ip

2)浏览器通过 ip 访问 web-server

缺点

1)非高可用,web-server 挂了整个系统就挂了

2)扩展性差,当吞吐量达到 web-server 上限时,无法扩容

注:单机不涉及负载均衡的问题

【简易扩容方案(1)DNS 轮询】

假设 tomcat 的吞吐量是 1000 次每秒,当系统总吞吐量达到 3000 时,如何扩容是首先要解决的问题,DNS 轮询是一个很容易想到的方案:

简易扩容方案(1)

此时的架构图如上:

1)多部署几份 web-server,1 个 tomcat 抗 1000,部署 3 个 tomcat 就能抗 3000

2)在 DNS-server 层面,域名每次解析到不同的 ip

优点

1)零成本:在 DNS-server 上多配几个 ip 即可,功能也不收费

2)部署简单:多部署几个 web-server 即可,原系统架构不需要做任何改造

3)负载均衡:变成了多机,但负载基本是均衡的

缺点

1)非高可用: DNS-server 只负责域名解析 ip,这个 ip 对应的服务是否可用,DNS-server 是不保证的 ,假设有一个 web-server 挂了,部分服务会受到影响

2)扩容非实时:DNS 解析有一个生效周期

3)暴露了太多的外网 ip

【简易扩容方案(2)nginx】

tomcat 的性能较差,但 nginx 作为反向代理的性能就强多了,假设线上跑到 1w,就比 tomcat 高了 10 倍,可以利用这个特性来做扩容:

简易扩容方案(2)

此时的架构图如上:

1)站点层与浏览器层之间加入了一个反向代理层,利用高性能的 nginx 来做反向代理

2)nginx 将 http 请求分发给后端多个 web-server

优点

1)DNS-server 不需要动

2)负载均衡:通过 nginx 来保证

3)只暴露一个外网 ip,nginx->tomcat 之间使用内网访问

4)扩容实时:nginx 内部可控,随时增加 web-server 随时实时扩容

5)能够保证站点层的可用性:任何一台 tomcat 挂了,nginx 可以将流量迁移到其他 tomcat

缺点:

1)时延增加+架构更复杂了:中间多加了一个反向代理层

2)反向代理层成了单点,非高可用:tomcat 挂了不影响服务, nginx 挂了怎么办?

【高可用方案(3)keepalived】

为了解决高可用的问题,keepalived 出场了(之前的文章“ 使用 shadow-master 保证系统可用性 ”详细介绍过):

高可用方案图 1

此时:

1)做两台 nginx 组成一个集群,分别部署上 keepalived,设置成相同的虚 IP,保证 nginx 的高可用

2)当一台 nginx 挂了,keepalived 能够探测到,并将流量自动迁移到另一台 nginx 上,整个过程对调用方透明

高可用方案图 2

优点

1)解决了高可用的问题

缺点

1)资源利用率只有 50%

2)nginx 仍然是接入单点, 如果接入吞吐量超过的 nginx 的性能上限怎么办,例如 qps 达到了 50000 咧?

【scale up 扩容方案(4)lvs/f5】

nginx 毕竟是软件,性能比 tomcat 好,但总有个上限,超出了上限,还是扛不住。

lvs 就不一样了,它实施在操作系统层面;f5 的性能又更好了,它实施在硬件层面;它们性能比 nginx 好很多,例如每秒可以抗 10w,这样可以利用他们来扩容,常见的架构图如下:

使用 Ivs 的架构

此时:

1)如果通过 nginx 可以扩展多个 tomcat 一样,可以通过 lvs 来扩展多个 nginx

2)通过 keepalived+VIP 的方案可以保证可用性

99.9999%的公司到这一步基本就能解决接入层高可用、扩展性、负载均衡的问题。

这就完美了嘛?还有潜在问题么?

好吧,不管是使用 lvs 还是 f5,这些都是 scale up 的方案,根本上,lvs/f5 还是会有性能上限,假设每秒能处理 10w 的请求,一天也只能处理 80 亿的请求(10w 秒吞吐量*8w 秒),那万一 系统的日 PV 超过 80 亿怎么办呢? (好吧,没几个公司要考虑这个问题)

【scale out 扩容方案(5)DNS 轮询】

如之前文章所述,水平扩展,才是解决性能问题的根本方案,能够通过加机器扩充性能的方案才具备最好的扩展性。

facebook,google,baidu 的 PV 是不是超过 80 亿呢,它们的域名只对应一个 ip 么, 终点又是起点,还是得通过 DNS 轮询来进行扩容

DNS 轮询

此时:

1)通过 DNS 轮询来线性扩展入口 lvs 层的性能

2)通过 keepalived 来保证高可用

3)通过 lvs 来扩展多个 nginx

4)通过 nginx 来做负载均衡,业务七层路由

四、结论

聊了这么多,稍微做一个简要的总结:

1) 接入层架构要考虑的问题域为 :高可用、扩展性、反向代理+扩展均衡

2)nginx、keepalived、lvs、f5 可以很好的解决 高可用、扩展性、反向代理+扩展均衡 的问题

3)水平扩展 scale out 是解决扩展性问题的根本方案, DNS 轮询是不能完全被 nginx/lvs/f5 所替代的

末了,上一篇文章有同学留言问 58 到家采用什么方案 ,58 到家目前部署在阿里云上,前端购买了 SLB 服务(可以先粗暴的认为是一个 lvs+keepalived 的高可用负载均衡服务),后端是 nginx+tomcat。

五、挖坑

接入层讲了这么多,下一章,准备讲讲服务层“异构服务的负载均”(牛逼的机器应该分配更多的流量,如何做到?)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文