你管这破玩意儿叫负载均衡?

负载均衡设备在接收到第一个来自客户端的SYN请求时 , 即通过负载均衡算法选择一个最佳的服务器 , 并对报文中目标IP地址进行修改(改为后端服务器IP) , 直接转发给该服务器 。
你管这破玩意儿叫负载均衡?
文章图片
图片来自Pexels
你管这破玩意儿叫负载均衡?】相信大家都听过这样的一道经典面试题:「请说出在淘宝网输入一个关键词到最终展示网页的整个流程 , 越详细越好」
这个问题很难 , 涉及到HTTP , TCP , 网关 , LVS等一系列相关的概念及诸多协议的工作机制 , 如果你能掌握到这其中的每个知识点 , 那将极大地点亮你的技能树,对于网络是如何运作也会了然于胸 , 即便不能完全掌握 , 但知道流量怎么流转的对你排查定位问题会大有帮助 , 我之前就利用这些知识定位到不少问题 , 为了弄清楚整个流程 , 我查阅了很多资料 , 相信应该可以把这个问题讲明白 , 不过写着写着发现篇幅实在太长 , 所以分为上下两篇来分别介绍一下 , 本篇先介绍流量在后端的的整体架构图 , 下一篇会深入剖析各个细节点 , 如LVS , NAT的工作细节等 , 这其中会涉及到交换机 , 路由器的工作机制等知识点 , 相信大家看了肯定有帮助
李大牛创业了 , 由于前期没啥流量 , 所以他只部署了一台tomcatserver , 让客户端将请求直接打到这台server上
你管这破玩意儿叫负载均衡?
文章图片
这样部署一开始也没啥问题 , 因为业务量不是很大 , 单机足以扛住 , 但后来李大牛的业务踩中了风口 , 业务迅猛发展 , 于是单机的性能逐渐遇到了瓶颈 , 而且由于只部署了一台机器 , 这台机器挂掉了业务也就跌零了 , 这可不行 , 所以为了避免单机性能瓶颈与解决单点故障的隐患 , 李大牛决定多部署几台机器(假设为三台) , 这样可以让client随机打向其中的一台机器 , 这样就算其中一台机器挂了 , 另外的机器还存活 , 让client打向其它没有宕机的机器即可
你管这破玩意儿叫负载均衡?
文章图片
现在问题来了 , client到底该打向这三台机器的哪一台呢 , 如果让client来选择肯定不合适 , 因为如果让client来选择具体的server , 那么它必须知道有哪几台server , 然后再用轮询等方式随机连接其中一台机器 , 但如果其中某台server宕机了 , client是无法提前感知到的 , 那么很可能client会连接到这台挂掉的server上 , 所以选择哪台机器来连接的工作最好放在server中 , 具体怎么做呢 , 在架构设计中有个经典的共识:没有什么是加一层解决不了的 , 如果有那就再加一层 , 所以我们在server端再加一层 , 将其命名为LB(LoadBalance , 负载均衡) , 由LB统一接收client的请求 , 然后再由它来决定具体与哪一个server通信 , 一般业界普遍使用Nginx作为LB
你管这破玩意儿叫负载均衡?
文章图片
采用这样的架构设计总算支撑了业务的快速增长 , 但随后不久李大牛发现这样的架构有点问题:所有的流量都能打到server上 , 这显然是有问题的 , 不太安全 , 那能不能在流量打到server前再做一层鉴权操作呢 , 鉴权通过了我们才让它打到server上 , 我们把这一层叫做网关(为了避免单点故障 , 网关也要以集群的形式存在)
你管这破玩意儿叫负载均衡?
文章图片
这样的话所有的流量在打到server前都要经过网关这一层 , 鉴权通过后才把流量转发到server中 , 否则就向client返回报错信息 , 除了鉴权外 , 网关还起到风控(防止羊毛党) , 协议转换(比如将HTTP转换成Dubbo) , 流量控制等功能 , 以最大程度地保证转发给server的流量是安全的 , 可控的 。