第 4 章 · 多台服务器第 2 页,共 5 页
多了几台服务器,请求该交给谁?
几台服务器各有各的地址,读者的手机却只认一个。请求该由谁来分、按什么规则分,其中一台变慢时又会怎样?
为什么需要
按上一页的估算,百家菜至少要 5 台。可读者的手机只认一个地址:第 1 章讲过,把网址里的名字换成一个 ,就发到那里。5 台服务器各有各的地址,把哪一个告诉读者?让读者各自挑,有的会挤满,有的闲着;坏了一台,挑中它的读者就打不开菜谱。
办法是在读者和服务器之间加一个(load balancer):它站在这一组服务器前面,读者只认它的地址;每来一个请求,它挑一台服务器转交过去,再把转回读者。这有点像银行大厅的叫号机,把客人分到不同的窗口;不同的是,叫号机看得见哪个窗口空着,负载均衡器看不见服务器里面,只能凭自己数的数或服务器报给它的数来判断。
怎样做
挑哪一台,按事先定好的规则。常见的有三种:
- (round robin):一台接一台地分,甲、乙、丙、丁、戊,再从甲开始。它不看谁忙谁闲。
- 交给手上活最少的一台:负载均衡器替每台记着「已经交过去、还没做完的请求」有几个,新请求交给最少的那台。不少负载均衡器数的是(两台机器之间建立以后会保持一段时间的通道,第 1 章讲过),所以这种分法常叫(least connections)。
- 按用户算号固定分配:从请求里取一个固定不变的东西,例如读者的编号,交给(hash function)算成一个数。这个数看起来很随机,但同一个编号每次都算出同一个数。再用服务器的台数去除它,余数是几,就交给第几台(余 0 交给甲,余 1 交给乙,依此类推),这一步叫。所以同一位读者总落到同一台。没登录的读者没有编号,常用他的请求来自的 IP 地址代替。
三种分法:服务器丙慢一半时,谁越积越多
先看这里先直接看第 30 秒;再把服务器丙换成「慢一半」,三种分法各看一遍,比一比丙的队伍和失败的个数。
- 一个点代表这一秒的一批请求,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 台,台数变了,余数也跟着变。下图画出加一台以后,每台原来的读者去了哪一台。
按用户算号:加一台以后,读者从哪一台到了哪一台
先看这里按「再加一台」,看左边每台原来的读者有多少留下(灰色)、多少换了服务器(蓝色);点左边的一台,只看它的读者去了哪里。
加一台以后读者的去向:左边一列是原来的服务器,右边一列是加一台以后的服务器,中间的带子从原来那台连到现在那台,越粗人越多;留在原来那台的是灰色,换了服务器的是蓝色。左边的服务器是按钮,按下一台,图下写出它的读者分别去了哪里。
现在 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 访问。
- HTTP Load Balancing
- HAProxy 3.4 Configuration Manual
- Edit target group attributes for your Application Load Balancer
- Backend services overview
- Connection management in HTTP/1.x
- hash function
- Remainder (%)
- Module ngx_http_upstream_module
- What's new with Robinhood, our in-house load balancing service
- High Availability Support for NGINX Plus in On-Premises Deployments
- system-design-primer