🎬 第十一章 SRS搭建直播平台
📄 一句话概括

SRS 的集群只有三种角色:origin、edge、forward。 理解了分工,配置就是填空题。

📝 本节和前面几节的关系

11.2 装的是单机,这一节开始谈多机。 11.3.2 把这些角色落到 cluster 块里。

一、三种角色

① origin 源站:接推流端,把流往外发,不直接服务观众。 ② edge 边缘:接观众,向源站回源,再把流分给观众。 ③ forward 转发:接推流端,把流原样转给另一个源站。

origin 与 forward 最容易混,区别在方向: origin 是被动被拉的源头,它知道自己是源; forward 是主动往外推的中转,它不关心对面是谁。 一句话:前者等着别人来要,后者主动送过去。

为什么要有边缘这一层? 因为观众太多时,源站的出口带宽根本不够。 边缘的作用就是「把一份流复制成很多份」,摊掉出口压力。

二、算一遍边缘省了多少

拿一个具体数:10000 人看 2048 kbps 的一路流。 单机直出要 19.5 Gbps,这在任何一台机器上都不可能。

加边缘之后,源站只需要往每个边缘发一份: 20 个边缘时,源站出口只要 0.04 Gbps。 省下来的倍数正好等于边缘数,这不是什么黑科技,就是分发。

但边缘本身也有上限,这笔账必须一起算: 20 个边缘、每个承担 500 人,每人 2048 kbps, 每个边缘的出口就是 1000 Mbps,刚好压满千兆网卡。 所以「边缘数」不是随便定的,要按单机能扛多少反推。

三、调度与故障,SRS 不管

两件事必须提前想清楚,而它们都不在 SRS 的配置里:

① 选路:观众连哪个边缘? SRS 只负责「你连上我,我就回源」,它不做调度。 调度通常交给 DNS 或专门的调度服务。 ② 故障:边缘挂了怎么办? 观众会重连到别的边缘,那个边缘重新回源。 所以源站必须扛得住「所有边缘同时回源」的那一瞬间。

把这两句记住,选型就不会跑偏: SRS 是「一个边缘的实现」,不是「一套完整的 CDN」。 要做完整的,还得有调度、健康检查、日志汇总、计费。

四、动手 Demo:边缘数怎么定——算源站出口与单机压力

同一份总流量,边缘数从 5 加到 50, 源站出口与每个边缘的压力反着走。

total, kbps = 10000, 2048

# 单机直出要多少
single = total * kbps / 1024.0 / 1024.0
print("单机直出 %.1f Gbps" % single)

# 不同边缘数下,源站与边缘各承担多少
for e in (5, 10, 20, 50):
    origin = e * kbps / 1024.0 / 1024.0      # 源站只发 e 份
    per = total * kbps / 1024.0 / e          # 每个边缘的 Mbps
    print(e, "源站 %.2f Gbps" % origin, "边缘 %.0f Mbps" % per)

实跑输出:

--------------------------------------------------------------------
集群简介——源站只接推流,边缘只接观众
--------------------------------------------------------------------
**① 三种角色**

  **SRS 的集群只有三种角色,理解它们的分工比记配置重要得多。**

  角色             接谁       往外发什么
  --------------------------------------------------------
  origin 源站      推流端     往边缘发,不直接服务观众
  edge 边缘        观众       向源站回源,再分给观众
  forward 转发     推流端     把流原样转给另一个源站

  **`origin` 和 `forward` 容易混:**
  **origin 是「被边缘回源的源头」,它自己知道自己是源;**
  **forward 是「主动把流推给别人的中转」,它不知道对面是谁。**
  **前者是被动被拉,后者是主动推。**

**② 真算一遍边缘到底省了多少**

  **10000 人看 2048 kbps 的一路流,这是本节的基本盘。**

  边缘数     源站出口 Gbps     每个边缘 Mbps     省几倍
  ---------------------------------------------------------
  5          0.01              4000              2000
  10         0.02              2000              1000
  20         0.04              1000              500
  50         0.10              400               200

  **单机直出要 19.5 Gbps,这显然不可能。**
  **20 个边缘时,源站只要 0.04 Gbps——省了 500 倍。**

  **这个倍数就是边缘数,不是什么黑科技。**
  **但要注意每个边缘的压力:20 个边缘时每个承担 500 人,**
  **就是 1000 Mbps,刚好压满千兆。**
  **所以「边缘数」不是随便定的,要按单机能扛多少反推。**

**③ 选路与故障,两件事要提前想**

  **① 选路**:**观众连哪个边缘?**
  **常见做法是按 DNS 或按地域就近,**
  **SRS 本身不管这件事,它只负责「你连上我,我就回源」。**
  **② 故障**:**边缘挂了怎么办?**
  **观众会重连到别的边缘,那个边缘重新回源。**
  **所以源站必须扛得住「所有边缘同时回源」那一瞬间。**

  **这两件事都不在 SRS 的配置里,**
  **它是「一个边缘的实现」,不是「一套完整的 CDN」。**
  **要做完整的,还得有调度、健康检查、日志汇总。**
  **这一点在选型时要清楚,别指望装个 SRS 就变成 CDN。**

源站出口随边缘数线性涨,每个边缘的压力随边缘数线性落。 省下来的倍数就是边缘数本身,这是分发的定义,不是优化技巧。 20 个边缘时每个压 1000 Mbps,刚好是千兆网卡的线速。 所以边缘数不是越多越好,多到单机扛不住就得上第二层。

30 秒实验

  1. 把码率从 2048 改成 4096,猜边缘数要翻几倍——翻一倍,因为单机压力与码率成正比。
  2. 把人数从 10000 改成 100000,看源站出口变不变——不变,源站只跟边缘数有关。
  3. 边缘数加到 100,猜单机压力还剩多少——每个 200 Mbps,这时候瓶颈已经不在带宽了。

常见误区

  1. 「边缘越多越好」——每个边缘压力降了,但源站出口在涨。
  2. 「origin 与 forward 是一回事」——一个被动被拉,一个主动推。
  3. 「装了 SRS 就有 CDN」——调度、健康检查、日志都得自己做。
自测三问(点开对答案) 1. 三种角色分别接谁? —— **origin 接推流端、edge 接观众、forward 接推流端再转出去。** 2. 10000 人看 2048 kbps,单机直出要多少带宽? —— **约 19.5 Gbps**,任何单机都做不到。 3. SRS 负责观众连哪个边缘吗? —— **不负责**,选路要靠 DNS 或调度服务。

相关笔记