多台服务器请求交给谁

为什么需要

按上一页的估算,百家菜至少要 5 台。可读者的手机只认一个地址:第 1 章讲过,把网址里的名字换成一个 ,就发到那里。5 台服务器各有各的地址,把哪一个告诉读者?让读者各自挑,有的会挤满,有的闲着;坏了一台,挑中它的读者就打不开菜谱。

办法是在读者和服务器之间加一个(load balancer):它站在这一组服务器前面,读者只认它的地址;每来一个请求,它挑一台服务器转交过去,再把转回读者。这有点像银行大厅的叫号机,把客人分到不同的窗口;不同的是,叫号机看得见哪个窗口空着,负载均衡器看不见服务器里面,只能凭自己数的数或服务器报给它的数来判断。

怎样做

挑哪一台,按事先定好的规则。常见的有三种:

  • (round robin):一台接一台地分,甲、乙、丙、丁、戊,再从甲开始。它不看谁忙谁闲。
  • 交给手上活最少的一台:负载均衡器替每台记着「已经交过去、还没做完的请求」有几个,新请求交给最少的那台。不少负载均衡器数的是(两台机器之间建立以后会保持一段时间的通道,第 1 章讲过),所以这种分法常叫(least connections)。
  • 按用户算号固定分配:从请求里取一个固定不变的东西,例如读者的编号,交给(hash function)算成一个数。这个数看起来很随机,但同一个编号每次都算出同一个数。再用服务器的台数去除它,余数是几,就交给第几台(余 0 交给甲,余 1 交给乙,依此类推),这一步叫。所以同一位读者总落到同一台。没登录的读者没有编号,常用他的请求来自的 IP 地址代替。

三种分法:服务器丙慢一半时,谁越积越多

先看这里先直接看第 30 秒;再把服务器丙换成「慢一半」,三种分法各看一遍,比一比丙的队伍和失败的个数。

分法
服务器
服务器丙
每秒请求数
现在:每秒 208 个
发起方
转发
处理

  • 一个点代表这一秒的一批请求,N 是这一批的个数

框底部的条是这一秒的(分到的请求 ÷ 容量;每台每秒 50 个,慢一半的丙 25 个):绿色有空,橙色超过七成,红色满了。点一下某个框,只亮出与它相连的线。

现在:尚未开始

还没开始。选好分法和每秒请求数,按「下一步」或「自动播放」,也可以直接看第 30 秒。

成功(到此刻为止)—
失败(到此刻为止)—
平均用时(到此刻为止成功的)—
每台服务器(尚未开始)
服务器这一秒分到此刻排队失败(到此刻为止)
服务器甲———
服务器乙———
服务器丙———
服务器丁———
服务器戊———

服务器与第 2 章一样,一次只处理一个请求;到达时刻和处理时长带随机性,但每次打开都一样;排队 2 秒还没轮到的算失败。按用户算号时,每个请求来自 2,000 位读者里随机的一位。

每台一样快时,三种分法都没有失败;可在晚饭高峰(每秒 208 个),平均用时最多差约 3.5 倍,每秒 69 或 100 个时只差 1.3 到 1.6 倍:不看忙闲的两种,有时把新请求交给手上还有活的那台。丙慢下来以后差别更大:轮流分配照样每 5 个给它 1 个,按用户算号照样送来分给它的读者,丙处理不完,队伍越排越长,排太久的请求失败;交给手上活最少的一台时,丙的计数降不下来,新请求自然少分给它。

网盘公司 Dropbox 内部的程序之间原来用简单的轮流分配;机器有新有旧,各台忙闲相差很大,只好多配机器。后来它自己做了一个按各台实际的调整分配的负载均衡服务,叫 Robinhood;各台忙得差不多了,一些最大的少用了 25% 的机器(2024)。

按用户算号还有一个问题。上一页说过,留出余量要 6 台;添上第 6 台,台数变了,余数也跟着变。下图画出加一台以后,每台原来的读者去了哪一台。

按用户算号:加一台以后,读者从哪一台到了哪一台

先看这里按「再加一台」,看左边每台原来的读者有多少留下(灰色)、多少换了服务器(蓝色);点左边的一台,只看它的读者去了哪里。

加一台以后读者的去向:左边一列是原来的服务器,右边一列是加一台以后的服务器,中间的带子从原来那台连到现在那台,越粗人越多;留在原来那台的是灰色,换了服务器的是蓝色。左边的服务器是按钮,按下一台,图下写出它的读者分别去了哪里。

服务器甲甲12 位服务器乙乙11 位服务器丙丙13 位服务器丁丁13 位服务器戊戊11 位

服务器5台
这一次换了服务器的读者—
占 60 位读者—

现在 5 台,60 位读者按号分到甲、乙、丙、丁、戊。按「再加一台」,看他们去了哪里。

读者只有 60 位,换了服务器的比例会和推算的 5/6、6/7 略有出入。

从 5 台变成 6 台,约 5/6 的读者换了服务器;从 6 台变成 7 台,约 6/7(推算)。为什么这么多:同一个数除以 5 和除以 6,余数碰巧相同的只占约六分之一,其余的读者都换了号。有一种叫的办法,能让挪动的读者少得多,第 9 章(选读)讲。换了服务器的读者,原来那台替他记着的东西就用不上了,下一页会看到后果。

代价是什么

负载均衡器也有代价:每个请求多经过一站,多花一点时间;它自己也会坏,只有一台时,它就成了新的,所以负载均衡器通常也要备两台以上。常见的做法是一主一备:读者认的那个地址平时由主的那台接着,它停了,备用的那台就接管这个地址(常用的网站服务器软件 NGINX 的说明)。

资料来源

以下资料均于 2026-10-22 至 2026-10-23 访问。

  1. HTTP Load BalancingF5 NGINX,2026-10-19
  2. HAProxy 3.4 Configuration ManualHAProxy(3.4.7 版),2026-10-14
  3. Edit target group attributes for your Application Load BalancerAWS,未注明日期
  4. Backend services overviewGoogle Cloud,2026-10-22
  5. Connection management in HTTP/1.xMDN Web Docs(Mozilla),2026-09-11
  6. hash functionPaul E. Black,美国国家标准与技术研究院(NIST)算法与数据结构词典,2023-08-08
  7. Remainder (%)MDN Web Docs(Mozilla),2025-07-08
  8. Module ngx_http_upstream_modulenginx.org,未注明日期
  9. What's new with Robinhood, our in-house load balancing serviceYi-Shu Tai,Dropbox,2024-10-23
  10. High Availability Support for NGINX Plus in On-Premises DeploymentsF5 NGINX,2026-10-19
  11. system-design-primerDonne Martin(GitHub,CC BY 4.0;最近提交 2026-03-20),2026-03-20