ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

服务端网络架构解析:防火墙、负载均衡与CDN的完整链路

服务端网络架构解析:防火墙、负载均衡与CDN的完整链路 这本书我前后翻过不少遍。第一遍是刚入行时当科普读物看第二遍是带团队时当培训教材讲第三遍是前阵子排查一个时通时不通的诡异线上问题时突然意识到第五章讲的服务端结构恰恰就是这类问题的根源所在。第五章在全书里的位置很特别前面四章一直跟着一个数据包从浏览器出发穿过网卡、交换机、路由器走完接入网和骨干网到第五章镜头才终于切到互联网的另一头——服务器所在的局域网。这一章要回答的核心问题很朴素请求到了服务端之后是怎么被一层一层接住而不至于把服务器压垮的如果你是想系统搞懂网络的人或者正在做运维、后端开发甚至只是好奇我在浏览器里敲了个回车服务器那边到底发生了什么第五章都是必读的一章。它把数据中心长什么样、防火墙挡在什么位置、负载均衡凭什么能把流量分得那么均匀、CDN为什么能让全国用户都快这些看似分散的知识点串成了一条完整的链路。下面我就按自己的理解把这章的内容拆开讲一遍顺便补一些实际运维中踩过的坑。1. 第五章在全书叙事中的位置数据包终于到了家这本书的写法很有意思它不像传统教科书那样先讲OSI七层模型而是让读者假想一个场景你在浏览器地址栏输入了一个网址按下回车。然后全书就一路跟着这个请求像跟踪快递一样看它怎么从用户电脑出发最终抵达服务器。第一章是浏览器把URL解析成HTTP请求交给操作系统第二章是TCP/IP协议栈把这些数据拆包、加头部、交给网卡第三章是网线、交换机、路由器这些局域网设备怎么转发第四章是数据包进入互联网内部的接入网和骨干网。到了第五章故事线走到最关键的转折点数据包已经到达服务器所在的局域网边缘接下来它面临的是一片完全不同于客户端环境的网络结构。为什么说完全不同于因为客户端这边通常是一台电脑、一根网线或者Wi-Fi网络结构简单而服务器端面对的是成千上万个并发请求不可能靠一台裸服务器扛住。所以服务端的网络被设计成一套多层次的体系先是防火墙挡住不该进的东西然后是负载均衡把流量分给多台服务器中间还可能穿插缓存服务器和CDN节点把重复的内容提前挡住最后才是真正干活的Web服务器和数据库。这一章的核心任务就是把这套体系讲清楚。作者没有停留在服务器放在机房这种一句话层面而是把物理部署、设备角色、数据流向都展开了。读完这一章你会形成一张完整的地图请求到了服务端局域网后先遇到谁、经过谁、最后落到谁手里每一步都清清楚楚。我个人的理解是第五章就是从互联网的公共道路切换到服务器的内部庭院的分界点。前面那些章节讲的是通往服务器之路第五章开始讲服务器门口和内部的故事。所以如果你想弄清楚为什么服务器端的网络跟家用网络差别这么大这一章就是答案所在。2. 服务端的物理网络机柜、交换机与防火墙2.1 机房里的真实样子从几排机柜说起书里描述的服务端物理结构本质上是数据中心的一个缩影。你走进任何一间像样的机房看到的不会是孤零零一台服务器而是一排排机柜每个机柜里叠放着十几台到几十台服务器每台服务器通常只有1U或2U的高度。服务器前面板是网口、电源指示灯后面板是密密麻麻的网线、光纤和管理口。这些服务器怎么连起来不可能每台服务器都直接拉一根线上联到核心设备那样机房会变成蜘蛛网。实践中的标准做法是每个机柜放一台架顶交换机Top of Rack也就是常说的TOR交换机机柜里的服务器都用短网线接到这台TOR上TOR再通过光纤上联到机柜列头或者汇聚交换机汇聚层再往上接到核心交换机。这就是经典的三层架构接入层、汇聚层、核心层。这个层级结构可以用一个生活场景来类比一个小区里每栋楼有一个楼栋配电箱每个楼栋配电箱汇总到小区的配电房配电房再接到城市电网。服务器就是楼里的住户TOR是楼栋配电箱汇聚和核心是配电房。这么做的好处有两个一是布线整洁扩容时只要加机柜和TOR二是故障隔离某台TOR挂了只影响一个机柜不至于整个机房瘫掉。带宽设计上有个容易被忽略的点。客户端下载文件是从服务器拉数据对服务器来说这叫出方向流量客户端上传文件是推数据给服务器这叫入方向流量。普通家庭宽带都是下载快、上传慢因为大多数用户主要是看视频、浏览网页下行量大。但服务器端恰好相反服务器的主要任务是把内容发出去也就是出方向流量占大头。所以设计服务端网络时核心交换机、防火墙、负载均衡这些设备的出方向转发能力往往是选型时要重点照顾的。书里虽然没有大篇幅讲选型但这个方向感搞反了后面规划带宽和选设备时很容易踩坑。2.2 防火墙的位置不是挂上就完事防火墙是服务端局域网的第一道门卫。书里重点讲了一个所有做网络的人都绕不开的概念DMZ隔离区Demilitarized Zone。常规做法是把网络分成三个区域——内网区、DMZ区、外网区。对外提供服务的Web服务器放在DMZ区数据库服务器和内部管理系统放在内网区外网就是互联网。防火墙部署在区域边界上用默认拒绝的策略控制谁能访问谁。外网用户可以访问DMZ里的Web服务器80/443端口但访问不到内网区的数据库DMZ里的Web服务器可以访问内网区的数据库但内网区主动向外发起连接要严格控制。这里有一个新手容易犯的错误以为防火墙只要把外网到内网的访问挡住就安全了。实际上真正容易出问题的是东西向流量——也就是服务器与服务器之间的互访。如果内网区一台服务器被攻破它横向移动去连别的服务器如果防火墙没有针对内网区之间的访问做策略攻击就可能在内部蔓延开。所以现在稍微成熟一点的企业都会把内网按业务再细分Web、应用、数据库三层之间也用防火墙或安全组隔开。第五章虽然写于较早的年代但这个思路放到今天依然适用只是工具从物理防火墙变成了云安全组、微隔离这类东西。防火墙的部署位置也很讲究。一般放在核心交换机和外部路由器之间所有进出流量都从这里过。但大型业务流量很大防火墙往往会成为瓶颈所以生产环境里常见的是防火墙做双机热备配合负载均衡器分流。另外不少公司会把防火墙和负载均衡串在一起防火墙先挡恶意流量再交给负载均衡分发。如果流量大到一台防火墙扛不住就会用防火墙集群或者旁路部署的方式这也是书里没有细讲、但实际生产里一定会遇到的问题。2.3 VLAN与ACL给内网做物理隔离感光有防火墙还不够服务端局域网内部还要做隔离。第五章讲到交换机时自然会牵扯出VLAN和ACL这对组合。VLAN的作用是在一台物理交换机上切出多个逻辑隔离的二层网络让不同业务的广播域互不相通。ACL则是交换机或路由器上的访问控制列表用来精确控制哪些IP、哪些端口能通过。举个常见的落地场景。一个业务系统通常分前端Web、后端应用、数据库三层三层分别放在不同VLAN里。Web服务器的VLAN可以对外网开放80/443应用服务器的VLAN只允许来自Web VLAN的流量访问数据库VLAN只允许来自应用VLAN的特定端口访问。这套配置配合ACL哪怕物理上所有服务器都连着同一台交换机逻辑上它们也被隔成了三个独立的房间。我在实际运维中见过不少配了VLAN但ACL没跟上的情况。比如为了省事同一个VLAN里塞了几十台服务器觉得反正内网嘛无所谓。结果出了问题才发现一台服务器中了病毒在内网里横向扫把同网段的机器全拖下水。VLAN是手段ACL是配套的锁光切了VLAN不配ACL相当于房间之间砌了墙但没安门锁墙形同虚设。第五章里对广播域、隔离域的讲解其实就是现在所有微隔离方案的思想源头理解了这一层后面看云上的安全组配置会轻松很多。3. 负载均衡别让一台服务器独自扛流量3.1 为什么要人海战术而不是单人猛男服务端网络里负载均衡是承上启下的关键一环。为什么一定要有它原因很简单单台服务器的处理能力是有上限的。哪怕你买了一台配置顶天的机器CPU、内存、网卡都拉满它同时能处理的TCP连接数、HTTP请求数依然有限。可能撑几千个并发没问题但一个热门业务高峰期几十万甚至上百万并发单机绝对扛不住。这时候有两种思路向上扩展换更猛的机器和向外扩展加更多普通机器。向上扩展很快就会撞到物理天花板而且成本指数级上升。向外扩展才是主流做法代价就是引入了新问题多台服务器组成的集群怎么把流量均匀地分给每一台这就是负载均衡存在的意义。书里的讲解顺序很好它先让你明白为什么要分散再讲怎么分散。负载均衡本质上就是一个交通指挥员站在客户端和服务器集群中间所有请求先到它这里再由它决定转发给哪台后端服务器。对客户端来说它只跟负载均衡器打交道根本感知不到后面有多少台服务器。3.2 从DNS轮询到四层、七层方案演进是有逻辑的最早的负载均衡思想比硬件出现得还早叫DNS轮询。原理很简单一个域名解析出多个IPDNS服务器每次解析时轮流返回不同的IP这样请求就会被分散到不同的服务器上。这个方法零成本但缺点致命DNS缓存会让某个用户长时间固定访问同一台服务器而且DNS解析不了后端服务器的健康状况某台服务器宕机了DNS照样把流量引过去。所以后来就有了专门的负载均衡器。从技术层面分常见的是四层负载均衡和七层负载均衡。四层工作在传输层主要根据IP和端口做转发它不关心请求内容是什么只管把TCP连接导给后端。代表产品有LVS、F5等性能极高一台设备能扛百万级并发连接。七层工作在应用层能看懂HTTP请求的URL、Header、Cookie这些内容可以做更精细的路由比如把/api/的请求转发给一组服务器把/page/的请求转发给另一组。代表产品是Nginx、HAProxy。两者没有绝对的谁好谁坏。四层快但无脑七层聪明但开销大。生产环境里最常见的组合是前面放一个四层负载均衡或者云上的SLB/ELB接住海量连接再到后端用一层七层的Nginx做应用级路由和转发。书里第五章对负载均衡的角色划分讲得比较清楚它强调的核心点是负载均衡解决的是规模问题把一个大流量拆成多个小流量分给不同机器至于智能路由这种精细化需求是叠加在基础负载均衡之上的一层能力。3.3 健康检查与会话保持两个不能省的事负载均衡器要真正均匀地分发流量前提是它知道哪些后端服务器是活的。这就牵扯到健康检查负载均衡器定期向后端服务器发起探测可能是TCP端口探测可能是发一个HTTP请求看返回码。连续几次失败就把这台服务器从转发列表里摘掉恢复了就加回来。这个机制听着简单但我见过不少配置不当引发的事故——健康检查间隔设得太长服务器已经挂了五分钟流量还在不断打过去用户看到一片报错或者健康检查路径配错探测到一个不需要维护的静态接口服务器假死却一直显示健康。另一个绕不开的话题是会话保持。有些业务需要用户粘连到同一台后端服务器上典型的例子是购物车用户把商品加入购物车这个状态存在某台服务器上如果下一次请求被负载均衡分发到了另一台服务器购物车就丢了。解决办法是会话保持按客户端IP哈希选择后端或者通过Cookie携带会话标识让负载均衡识别。这里有个权衡——会话保持做得好用户体验稳定但如果某台服务器压力大哈希算法会把大量请求持续导给它反而加剧不均衡。所以更高级的做法是让后端共享会话状态比如用Redis存Session让负载均衡可以放心地均匀分发而不必担心粘连问题。第五章虽然写于会话共享还没普及的年代但它讲的为什么需要保持连接以及保持连接带来的副作用这个矛盾到现在依然是架构设计的核心议题。4. 缓存服务器与CDN把内容搬近一点快一点4.1 反向代理缓存把重复的活挡在门外服务端网络里还有一个重要的角色就是缓存服务器。书里讲缓存服务器的时候是从代理这个概念切入的。代理分两种正向代理和反向代理。正向代理是替客户端访问外部资源典型场景是办公室里大家共用一台代理上网反向代理是替服务器接收请求客户端访问的是代理代理再去后面找真正的服务器。服务端常见的缓存服务器本质上是反向代理加缓存能力。它的逻辑是一个内容第一次被请求时反向代理去后端取回来同时在自己本地存一份后面再有相同的请求直接拿缓存里的内容返回不再骚扰后端服务器。这就像一个食堂窗口师傅第一次炒菜需要现做炒完后多留一份放在保温台上后面学生来打菜直接盛不用再等现炒。对于图片、CSS、JS、视频这些静态资源命中缓存的速度提升是数量级的。一个完全没有缓存的网站用户首次访问慢是因为服务器要为每个请求做应用逻辑处理、查数据库、组装页面有了缓存90%以上的静态请求在代理层就被直接应答了后端服务器压力瞬间降下来。但缓存不是免费的午餐。最头疼的问题是缓存一致性源站内容更新了缓存里的旧内容怎么办书里虽然没有深入讲Web缓存协议但第五章把这个问题的核心逻辑讲透了——缓存本质上是在速度和新鲜度之间做取舍。现在实际用的方案是配合HTTP头里的Cache-Control、Expires、ETag这些字段来控制缓存的有效期和校验方式内容更新时可以主动通知缓存刷新比如CDN的刷新API也可以靠设置很短的缓存有效期来保证最终一致。理解了缓存不可能永远新鲜只能尽量新鲜这个本质遇到缓存不生效、缓存污染这类问题排查思路就会清晰很多。4.2 CDN的就近原则是怎么实现的书里第五章的篇幅安排很有意思它在讲完缓存服务器之后紧接着引入了CDN的概念因为CDN本质上就是把缓存服务器撒到全国各地甚至全球各地去。CDN全称是内容分发网络它的核心思想一句话就能说清把内容放到离用户最近的地方。一个网站如果只部署在北京的机房广州的用户访问要跨越大半个中国网络延迟可能几十毫秒甚至上百毫秒加上跨运营商互联的拥堵体验会很差。CDN的做法是在全国各地部署边缘节点用户请求时通过DNS解析或全局负载均衡调度把用户引导到离他最近的边缘节点由那个节点直接返回内容。这块书里讲得很严谨。它特别点出CDN的关键在于DNS调度用户访问一个启用了CDN的域名时权威DNS服务器会根据用户的来源IP判断他所在的地理位置和运营商返回离他最近的那个CDN节点IP。所以同一个域名北京用户和广州用户解析出来的IP往往是不同的。这也解释了为什么CDN服务商要求你修改域名解析的CNAME——只有把域名交给CDN的DNS体系管理它才能做地理位置调度。CDN节点上没缓存的内容怎么办这叫回源。边缘节点发现自己没有用户要的内容就会去源站取取到后存在本地下次再有人访问就直接命中。运营CDN的人最关心的一个指标是回源率回源率越低说明边缘节点缓存命中越高源站压力越小用户速度越快。为了提升命中率运营方会做预缓存也叫预热主动把热门内容从源站拉到边缘节点上免得用户第一次访问时还要等回源那一趟。我在实际项目中见过一个经典误区有人以为上了CDN就万事大吉结果改了源站内容后发现用户还一直看到旧内容。原因往往是CDN缓存的TTL设得太长。动静态内容要区别对待对图片、视频这类不常变的内容缓存时间可以设到一天甚至更长对HTML页面这种可能随时更新的内容要么短缓存要么不缓存实时回源。CDN是把双刃剑配好了全国加速配不好就是内容永远慢半拍。第五章把这个原理讲明白了后面你配置CDN时心里就有底了。5. 服务器处理请求的两种姿势多进程与事件驱动5.1 高并发的本质怎么让一台机器同时服务很多人请求穿过防火墙、负载均衡、缓存代理之后最终还是要落在真正的Web服务器上。那么Web服务器是怎么同时处理成千上万个请求的这一部分在我看来是第五章最硬核的内容。传统的方式是多进程或多线程来一个连接就fork一个进程或者开一个线程去处理处理完关闭。这个模型简单直观但有两个问题一是进程和线程的创建销毁开销大二是每个进程/线程都要占用内存并发一高内存和CPU调度开销就把服务器拖垮了。这就是早期Apache在超高并发下性能不行的根本原因。另一种方式叫事件驱动也叫IO多路复用经典实现是Nginx。它用少量线程配合事件循环同时监管大量连接某个连接有数据来了就处理没数据就先挂着不占线程。这就像一个咖啡师一次磨多个单不按一个人磨一杯来分配人力而是把所有订单挂在吧台上哪个订单的咖啡豆磨好了就立刻装杯磨着重的时候手也不闲着。这种模型的优势是同样的硬件能扛的连接数多一个数量级这也是Nginx能取代Apache成为主流的重要原因。书里虽然是在讲Web服务器的工作方式但这个多进程/多线程 vs 事件驱动的对比影响远不止Web服务器。现在的Redis、Node.js、Netty等一大堆高性能中间件核心思路都是事件驱动。理解了第五章这个对比你再看很多中间件的架构文档会有一种原来如此的豁然感。5.2 keep-alive和TLS握手被低估的隐形耗时第五章里还有一个细节很多人第一遍读会忽略就是HTTP keep-alive。早期HTTP/1.0时代每次请求都要重新建立TCP连接三次握手再加慢启动开销很大。HTTP/1.1引入了keep-alive允许一个TCP连接上连续发送多个请求省去频繁建连的消耗。这个复用连接的思想到了HTTP/2甚至演变成连接上多路复用但根子都是第五章讲的那个道理网络里最贵的是握手和往返时间不是数据本身。另一个现代才被放大的是TLS握手。书里写到的年代HTTPS还不是标配但今天全站HTTPS已经是底线。TLS握手需要多次往返交换密钥信息每增加一次RTT往返时间就会让访问变慢一点。所以现在的优化手段比如TLS会话复用、0-RTT握手、OCSP Stapling本质上都是在减少握手次数这件事上做文章。你在第五章里学到的连接建立成本很高这个意识放到今天依然适用——只是成本从TCP握手变成了TCPTLS的多次握手。6. 读到第五章时容易忽略的三个细节这一章信息密度大我第一次读的时候自认为懂了后来做运维踩了几个跟头回头再看才发现当初理解得很浅。这里说三个很容易被忽略、但实际作用很大的点。第一个是服务端的上下行方向和家宽是反的。大多数人习惯了自己的宽带下行快、上行慢规划服务端网络时也会下意识觉得入方向流量是主要的。但服务器是要给客户端发内容的真正的瓶颈恰恰在出方向。曾经有个项目买了很高配的带宽套餐结果发现是上下行对等的专线还好如果买的是不对称带宽出方向不够再好的服务器也是白搭。判断服务端网络够不够一定要站在服务器视角看出口带宽和出方向的转发能力。第二个是缓存一致性比缓存本身难得多。刚接触缓存的人容易陷入一个误区觉得缓存命中率高就是好。但现实中命中率高不代表用户体验好——如果返回的是过期内容用户看到的就是错误信息。我遇到过线上改完配置后用户迟迟看不到新效果的案例排查到最后竟然是CDN节点缓存的黑白名单配错了。缓存系统上线容易维护难核心工作其实是知道什么时候该失效。第三个是负载均衡器自己也会成为瓶颈而且它是单点。很多人给后端服务器做了集群就觉得高枕无忧了却忘了负载均衡器是一夫当关的位置。虽然可以做主备Active-Standby或者集群Active-Active但设计不当时负载均衡器本身的状态同步、会话复制反而会成为新的故障点。第五章把这个位置的重要性讲得很清楚——越靠近入口的设备越要当作重点保护对象来对待监控、冗余一个都不能省。7. 常见问题与排查思路实操向把第五章的内容消化完之后很多服务端网络问题的排查方向就会变得非常明确。我自己在实际运维中积累了一些常见问题的排查路径整理成一张速查表供参考。现象可能原因排查命令/手段外网访问服务时通时不通负载均衡健康检查误判、后端单机故障但未摘除查看LB后端健康状态curl各后端IP的探测接口特定地区用户访问慢CDN调度异常、回源链路拥塞对比不同地区解析出的CDN节点IP测回源链路延迟后端服务器CPU不高但请求处理慢缓存命中率低、数据库成为瓶颈查看代理层缓存命中率用慢查询日志定位数据库问题改了内容用户还看到旧的CDN/代理缓存TTL过长刷新失效手动刷新CDN缓存检查HTTP缓存头是否设置正确大流量打进来导致服务雪崩负载均衡与后端之间缺少限流、熔断检查LB限流配置确认后端服务是否有自我保护机制内网服务器之间互访不通VLAN/ACL配置错误、安全组规则遗漏用ping和telnet测试端口连通性核对ACL规则命中计数排查工具方面有几个经典组合我一直在用。测带宽用iperf可以排除网络速度不行这个干扰项直接压测两台机器之间的实际吞吐量看路径用traceroute/mtr能快速定位是哪一个网络节点延迟异常看协议细节用tcpdump抓包配合Wireshark分析。做服务端网络问题排查时思路一定要从外往里逐层排除先确认客户端和服务器之间链路通不通、延迟多少再看防火墙有没有拦截再看负载均衡转发是否正常最后才落到后端应用本身。这个顺序和第五章的叙事结构是高度一致的——书怎么讲你就怎么查。另外提一句现在很多环境是容器化和虚拟化的宿主机、Docker网络、虚拟机网络这层虚拟链路也会带来额外的问题。比如Docker容器里能通外网但容器之间不通或者虚拟机网络显示线缆已拔出但物理链路明明没问题——这类问题排查时不要忘了虚拟交换机、网桥和命名空间这些层它们在逻辑上跟第五章讲的交换机、VLAN是同一个套路只是换了实现方式。如果报错信息里包含获取接收配置失败请检查网络设置之类的提示常规做法是先确认本机DNS配置、网关配置和物理链路再用网络测速工具判断是DNS解析慢还是数据传输慢。从我个人经验来说读第五章最大的收获不是记住那几个术语而是建立了一种分层排查的直觉。碰到网络问题脑子里自动会浮现出那条请求链路客户端→防火墙→负载均衡→缓存→后端服务器→数据库然后逐个节点去定位。这种直觉一旦建立起来很多以前觉得玄乎的网络故障其实都能找到合理解释。这本书的第五章正是帮你把这条链路在脑子里画出来的那一章。
返回列表