
SRS Origin Cluster 原厂集群部署与源码解析基于 srs-proxy 负载均衡的多 Origin 媒体架构【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srsSRS Origin Cluster 是 SRS 为承载大规模并发流而设计的多 Origin 服务器集群方案由一组 Go 编写的 srs-proxy 代理服务器作为统一入口将 RTMP、HTTP-FLV、HLS、WebRTC、SRT 等协议请求负载均衡到一组 SRS Origin 服务器上。本文以仓库文档 origin-cluster.md 为主线完整覆盖从构建、三种协议集群部署、环境变量配置、鉴权、注册 API 到 K8s 部署架构的全部内容并结合本仓库中的 srs-proxy 源码入口、引导、环境配置、负载均衡、系统 API深入讲解其底层实现原理。概述什么是 Origin ClusterSRS Origin Cluster原厂集群是一组用于承载大量流的 Origin 服务器集合。与旧版集群不同SRS 7.0 的新版 Origin Cluster 由**代理服务器srs-proxy与原厂服务器SRS Origin**组成代理服务器扮演负载均衡器把客户端的推流与拉流请求转发给后端的 Origin 服务器-------------------- ------- SRS Origin Server -------------------- ----------------------- -------------------- SRS Proxy(Deployment) ------------- SRS Origin Server ----------------------- -------------------- -------------------- ------- SRS Origin Server --------------------Origin Cluster 通过横向扩容 Origin 服务器提升系统承载能力。例如使用 200 台后端 SRS Origin 服务器可支撑 100 个 WebRTC 推流端每个推流端 200 个观看者合计 20,000 个连接。如果将该集群部署在拥有大量 CPU 核心的服务器上它将成为一个非常强大的媒体服务器。说明代理服务器与 Origin 服务器的关系是代理转发而非边缘缓存。从源码注释可以看到RTMP 代理Unlike the edge server, it will not cache the stream, but just proxy the stream to backendrtmp.go即代理服务器不缓存流只做流的中转分发。你还可以部署多台代理服务器、代理到其他媒体服务器如 nginx-rtmp或与边缘集群Edge Cluster配合使用详见下文 部署架构设计 一节。代理服务器几乎支持 SRS 的全部协议包括 RTMP、HTTP-FLV、HLS、WebRTC 与 SRT详见 协议支持。构建 srs-proxy构建代理服务器需要安装Go 1.18。克隆仓库后执行git clone https://github.com/ossrs/srs.git cd srs make构建成功后得到可执行二进制bin/srs-proxy。也可以先执行go mod download下载依赖再构建。从本仓库的 Makefile 可以看到构建规则build: fmt bin/srs-proxy bin/srs-proxy: cmd/proxy/*.go internal/**/*.go mkdir -p bin go build -o bin/srs-proxy ./cmd/proxy即make会把 cmd/proxy/main.go 编译为bin/srs-proxy。入口非常简单创建 ProxyBootstrap 后调用Start启动整个代理进程。未来该项目计划提供 Docker 镜像并将代理服务器集成进 Oryx 项目。目前仓库根目录已包含 oryx 与 Dockerfile可自行构建镜像。与旧版 Origin ClusterLegacy的关系从 SRS 7.0 起新版 Origin Cluster 基于代理服务器而不再使用旧版基于 MESH服务器互连的 SRS 服务器集群。如果需要使用旧版 Origin Cluster请切换到 SRS 6.0 及之前的版本。文档明确指出SRS 6.0 之前的旧集群通过 MESH 让 Origin 服务器互相连接这种架构并不理想新版改用代理 相互独立的 Origin架构后系统更加健壮。部署一RTMP Origin ClusterRTMP Origin Cluster 的部署分三步启动代理服务器、部署多个 Origin 服务器、推流与拉流验证。第一步启动代理服务器env PROXY_RTMP_SERVER1935 PROXY_HTTP_SERVER8080 \ PROXY_HTTP_API1985 PROXY_WEBRTC_SERVER8000 PROXY_SRT_SERVER10080 \ PROXY_SYSTEM_API12025 PROXY_LOAD_BALANCER_TYPEmemory ./bin/srs-proxy说明这里使用memory类型的内存负载均衡器适用于单代理场景如果希望运行多个代理服务器可将PROXY_LOAD_BALANCER_TYPE切换为redis让多个代理共享同一份 Origin 注册状态。第二步部署三个 Origin 服务器Origin 服务器通过端口12025代理的 System API 端口向代理注册自己./objs/srs -c conf/origin1-for-proxy.conf ./objs/srs -c conf/origin2-for-proxy.conf ./objs/srs -c conf/origin3-for-proxy.conf说明Origin 服务器之间相互独立、无需同步状态因此强烈建议在 KubernetesK8s中将其部署为 Deployment。这三个配置文件在仓库中的实际位置为 trunk/conf/origin1-for-proxy.conf、trunk/conf/origin2-for-proxy.conf、trunk/conf/origin3-for-proxy.conf。以 origin1 为例其关键配置包括配置块监听端口说明rtmp19351RTMP 推流/拉流端口http_server8081HTTP-FLV / HLS 流服务http_api19851HTTP APIWHIP/WHEP 等rtc_server8001 (UDP)WebRTC 端口srt_server10081SRT 端口三个 Origin 的端口分配如下文件RTMPHTTPAPIRTC (UDP)SRTorigin119351808119851800110081origin219352808219853800210082origin319353808319852800310083每个 Origin 配置了heartbeat心跳注册块向代理注册自身信息heartbeat { enabled on; interval 9; url http://127.0.0.1:12025/api/v1/srs/register; device_id origin1; ports on; }其中interval 9表示每 9 秒上报一次心跳url指向代理的 System API 注册接口ports on表示自动上报各协议监听端口。同时 vhost 内开启了http_remuxHTTP-FLV 转封装、hlshls_fragment 10 秒、hls_window 60 秒、rtc含rtmp_to_rtc与rtc_to_rtmp转码开关与srtsrt_to_rtmp等模块保证多协议互通。第三步推流与拉流验证向代理服务器推 RTMP 流推流地址rtmp://localhost/live/livestreamffmpeg -re -i doc/source.flv -c copy -f flv rtmp://localhost/live/livestream说明doc/source.flv是仓库自带的测试视频源位于 trunk/doc/source.flv。从代理服务器分别用多种协议拉流# RTMP 播放 ffplay rtmp://localhost/live/livestream # HTTP-FLV 播放 ffplay http://localhost:8080/live/livestream.flv # HLS 播放 ffplay http://localhost:8080/live/livestream.m3u8WebRTC 播放可打开代理服务器的 WHEP 播放器页面http://localhost:8080/players/whep.html。也可以使用 VLC 或其他播放器播放代理服务器上的流。部署二WebRTC Origin ClusterWebRTC Origin Cluster 的代理与 Origin 部署步骤与 RTMP 集群完全一致env PROXY_RTMP_SERVER1935 PROXY_HTTP_SERVER8080 \ PROXY_HTTP_API1985 PROXY_WEBRTC_SERVER8000 PROXY_SRT_SERVER10080 \ PROXY_SYSTEM_API12025 PROXY_LOAD_BALANCER_TYPEmemory ./bin/srs-proxy./objs/srs -c conf/origin1-for-proxy.conf ./objs/srs -c conf/origin2-for-proxy.conf ./objs/srs -c conf/origin3-for-proxy.conf同样的提示单代理用 memory 负载均衡多代理请切换为redisOrigin 相互独立建议以 Deployment 方式部署在 K8s 中。WebRTC 场景下的推流与拉流均通过浏览器完成使用 WHIP 推流器页面http://localhost:8080/players/whip.html向代理服务器推 WebRTC 流使用 WHEP 播放器页面http://localhost:8080/players/whep.html从代理服务器播放 WebRTC 流。跨协议拉流同样可用ffplay rtmp://localhost/live/livestream ffplay http://localhost:8080/live/livestream.flv ffplay http://localhost:8080/live/livestream.m3u8也可以使用 VLC 或其他播放器。实现提示代理的 WebRTC 能力依赖 HTTP API 代理与 WebRTC UDP 代理配合。从 api.go 源码可以看到代理的 HTTP API 服务器注册了/rtc/v1/whip/推流、/rtc/v1/whep/拉流路由并兼容旧版/rtc/v1/publish/、/rtc/v1/play/路由供 srs-bench 使用将请求转发给 WebRTC 代理服务器处理后回源到 Origin。部署三SRT Origin ClusterSRT Origin Cluster 的代理与 Origin 部署步骤同样相同env PROXY_RTMP_SERVER1935 PROXY_HTTP_SERVER8080 \ PROXY_HTTP_API1985 PROXY_WEBRTC_SERVER8000 PROXY_SRT_SERVER10080 \ PROXY_SYSTEM_API12025 PROXY_LOAD_BALANCER_TYPEmemory ./bin/srs-proxy./objs/srs -c conf/origin1-for-proxy.conf ./objs/srs -c conf/origin2-for-proxy.conf ./objs/srs -c conf/origin3-for-proxy.conf向代理服务器推 SRT 流注意 SRT 的streamid语法mpublish表示推流ffmpeg -re -i ./doc/source.flv -c copy -pes_payload_size 0 -f mpegts \ srt://127.0.0.1:10080?streamid#!::rlive/livestream,mpublish从代理服务器拉 SRT 流mrequest表示拉流ffplay srt://127.0.0.1:10080?streamid#!::rlive/livestream,mrequest同样支持跨协议拉流ffplay rtmp://localhost/live/livestream ffplay http://localhost:8080/live/livestream.flv ffplay http://localhost:8080/live/livestream.m3u8WebRTC 播放依旧使用http://localhost:8080/players/whep.html页面也可用 VLC 等播放器。说明SRT 推流参数中的-pes_payload_size 0用于禁止 PES 载荷拼接这是 SRT 封装的常见要求代理服务器通过PROXY_SRT_SERVER示例中为 10080接收 SRT 流后回源到 Origin 的srt_server如 10081/10082/10083。代理服务器配置环境变量详解srs-proxy 完全通过环境变量配置同时也支持.env文件见 env.go 中的loadEnvFile若进程环境中已有同名变量则不会覆盖.env中的值。分为四组回源后端端口代理对外监听、转发给 Origin环境变量作用默认值PROXY_HTTP_APIHTTP API 端口代理到 SRS Origin11985PROXY_HTTP_SERVERHTTP 流服务端口FLV/TS/HLS代理到 Origin18080PROXY_RTMP_SERVERRTMP 服务端口代理到 Origin11935PROXY_WEBRTC_SERVERWebRTC 服务端口UDP代理到 Origin18000PROXY_SRT_SERVERSRT 服务端口代理到 Origin20080以上默认值与源码 env.go 中buildDefaultEnvironmentVariables的默认值完全一致。代理自身配置环境变量作用默认值PROXY_SYSTEM_APISystem API 端口供 Origin 注册服务12025PROXY_STATIC_FILES静态 Web 服务器文件目录如 players 页面文档标注../trunk/research源码默认./trunk/researchPROXY_LOAD_BALANCER_TYPE负载均衡器类型memory或redis文档标注redis当前仓库源码默认memory关于默认值的差异说明文档origin-cluster.md将PROXY_LOAD_BALANCER_TYPE默认值标注为redis但当前仓库源码 env.go 中实际默认值为memorysetEnvDefault(PROXY_LOAD_BALANCER_TYPE, memory)。以你实际使用的版本代码为准——单代理可直接用memory多代理务必显式设置为redis。Redis 负载均衡器参数使用redis类型时需设置以下变量环境变量作用默认值PROXY_REDIS_HOSTRedis 主机127.0.0.1PROXY_REDIS_PORTRedis 端口6379PROXY_REDIS_PASSWORDRedis 密码空无密码PROXY_REDIS_DBRedis 数据库编号0源码中还支持两个文档之外的扩展变量PROXY_REDIS_KEY_PREFIXRedis 键前缀默认空与PROXY_ORIGIN_SERVER_TTLOrigin 注册的健康存活期默认300s以及代理自身生命周期相关的PROXY_GRACE_QUIT_TIMEOUT优雅退出超时默认20s与PROXY_FORCE_QUIT_TIMEOUT强制退出超时默认30s。默认后端调试用调试时代理可以转发到一个默认 Origin 服务器不要求该后端注册到代理环境变量作用默认值PROXY_DEFAULT_BACKEND_ENABLED是否启用默认后端offPROXY_DEFAULT_BACKEND_IP默认后端 IP127.0.0.1PROXY_DEFAULT_BACKEND_RTMP默认后端 RTMP 端口1935PROXY_DEFAULT_BACKEND_HTTP默认后端 HTTP 端口8080PROXY_DEFAULT_BACKEND_RTC默认后端 WebRTCUDP端口8000PROXY_DEFAULT_BACKEND_SRT默认后端 SRT 端口10080PROXY_DEFAULT_BACKEND_API默认后端 API 端口1985设计意图默认后端机制面向任意 RTMP 服务器如 nginx-rtmp它不需要向代理注册服务代理会按固定地址回源便于快速调试或对接第三方媒体服务器。认证AuthenticationOrigin 注册请求可通过 Bearer Token 鉴权保护分两侧配置。代理侧配置注册 API 鉴权环境变量作用默认值PROXY_HTTP_API_AUTH_ENABLED是否对 Origin 注册请求鉴权offPROXY_HTTP_API_AUTH_TYPE鉴权类型开启鉴权时代理要求为bearer空PROXY_HTTP_API_AUTH_TOKEN代理注册 API 接受的 Bearer Token开启鉴权时必填空从源码 env.go 的validate()可以看到强约束当PROXY_HTTP_API_AUTH_ENABLEDon时PROXY_HTTP_API_AUTH_TYPE必须为非空且为bearer同时PROXY_HTTP_API_AUTH_TOKEN必须非空否则代理启动即报错。Origin 侧配置心跳请求鉴权环境变量作用默认值SRS_HEARTBEAT_AUTH_ENABLEDSRS Origin 是否对其心跳请求鉴权offSRS_HEARTBEAT_AUTH_TYPE心跳鉴权类型对接鉴权代理时使用bearer空SRS_HEARTBEAT_AUTH_TOKENOrigin 发送的凭据需设置为代理的PROXY_HTTP_API_AUTH_TOKEN空重要区别SRS_HEARTBEAT_AUTH_TOKEN是 Origin 访问代理注册接口时携带的凭据它独立于SRS_HTTP_API_AUTH_TOKEN——后者保护的是 Origin 自身的 HTTP API两者不要混淆。实现层面代理的 System API 使用withHTTPAPIAuth中间件api.go校验Authorization: Bearer token并通过crypto/subtle.ConstantTimeCompare进行常量时间比较避免时序侧信道攻击。部署架构设计Design基本流模型Client ---- Proxy Server --- Origin Servers Client --- LB -- Proxy Servers -- Origin Servers OBS/FFmpeg --RTMP-- K8s(Service) --Proxy-- SRS(pod A) Browsers --FLV/HLS/SRT-- K8s(Service) --Proxy-- SRS(pod A) Browsers -----HTTP-API-- K8s(Service) --Proxy-- SRS(pod A) ---WebRTC---- K8s(Service) --Proxy-- SRS(pod A)代理服务器可以部署在 KubernetesK8s中将流量路由到 SRS Origin 服务器充当负载均衡器不使用 K8s 同样可以部署。与 K8s 结合的完整部署拓扑----------------------- --- SRS Proxy(Deployment) --------------------------- ----------------- | ---------------------- | LB(K8s Service) -- (Redis/MESH) SRS Origin Servers ----------------- | ---------------------- (Deployment) --- SRS Proxy(Deployment) --------------------------- -----------------------关键设计点多个代理需要同步状态多代理之间需要通过 Redis 或 MESH 同步状态。MESH 指代理之间互相连接同步状态在 K8s 中应部署为 StatefulSetRedis 方案更优——代理可以部署为普通 Deployment还可借助 Redis 集群实现高可用。多个 Origin 无需同步状态Origin 在 K8s 中部署为 Deployment彼此完全独立系统非常健壮。这与 SRS 6.0 之前用 MESH 互连的旧集群有本质区别旧架构并不理想。单代理 多 Origin如果只需支撑大量流而观看者较少单代理架构同样有效-------------------- ------- SRS Origin Server -------------------- ----------------------- -------------------- SRS Proxy(Deployment) ------------- SRS Origin Server ----------------------- -------------------- -------------------- ------- SRS Origin Server --------------------说明代理服务器性能很高且支持多进程单代理架构适用于流多、观看者少的场景。需要更多代理时直接部署更多代理并连接到同一个 Redis 即可这套架构可水平扩展。代理 边缘集群超大规模系统在该架构之上再叠加 SRS 边缘服务器Edge可支撑海量观看者------------------ -------------------- SRS Edge Server -- ------- SRS Origin Server ------------------ -------------------- ------------------ ----------------------- -------------------- SRS Edge Server ------- SRS Proxy(Deployment) ------------- SRS Origin Server ------------------ ----------------------- -------------------- ------------------ -------------------- SRS Edge Server -- ------- SRS Origin Server ------------------ --------------------说明边缘服务器负责承接大量观看者的播放请求代理负责 Origin 之间的负载均衡。这套系统能构建支持海量流与观看者的超大型媒体系统但维护复杂度高仅在必要时使用。另外代理服务器与 SRS 边缘服务器也可以协同工作但这并非典型架构。协议支持Protocols由于 srs-proxy 是全新编写的服务器并非所有协议都已支持。当前状态协议状态说明RTMP✅ 已支持代理 RTMP 协议到 SRS OriginHTTP-FLV✅ 已支持代理 HTTP-FLV 到 SRS OriginHTTP-TS✅ 已支持代理 HTTP-TS 到 SRS OriginHLS✅ 已支持代理 HLS 到 SRS OriginWebRTC✅ 已支持代理 WebRTCWHIP/WHEP到 SRS OriginSRT✅ 已支持代理 SRT 到 SRS OriginMPEG-DASH❌ 未支持尚未实现RTSP❌ 未支持尚未实现代理自身的关键特性支持状态特性状态单节点代理内存存状态✅ 已支持Redis连接 Redis 同步状态✅ 已支持MESH代理互连同步状态❌ 未支持HTTP-API汇总各 Origin 指标❌ 未支持ExporterPrometheus 指标导出❌ 未支持需要说明对于媒体集群而言媒体服务器只是整个系统的一部分控制与管理面板对维护这套复杂系统同样重要。已支持协议与未支持特性的当前状态以仓库中 proxy 目录下的各协议实现文件rtmp.go、http.go、rtc.go、srt.go为准。注册 APIRegisterOrigin 服务器通过简单的 HTTP API 向代理注册自己代理据此维护可用的后端服务器列表。注册接口如下curl -X POST http://127.0.0.1:12025/api/v1/srs/register \ -H Connection: Close \ -H Content-Type: application/json \ -H User-Agent: curl \ -d { device_id: origin2, ip: 10.78.122.184, server: vid-46p14mm, service: z2s3w865, pid: 42583, rtmp: [19352], http: [8082], api: [19853], srt: [10082], rtc: [udp://0.0.0.0:8001] } #{code:0,pid:53783}请求体字段说明字段必填说明ip必填后端服务器 IP。确保代理服务器可通过该 IP 访问后端server必填后端服务器的 server id。对 SRS 而言存储在文件中一般不会变化service必填后端服务器的 service id。对 SRS 而言重启后总会变化pid必填后端进程 id。用于判断进程是否重启rtmp必填后端 RTMP 监听端点代理通过该端口回源 RTMPhttp可选后端 HTTP 监听端点用于 HTTP-FLV / HTTP-TS 回源api可选后端 HTTP API 监听端点用于 WHIP/WHEP 等 HTTP-API 回源srt可选后端 SRT 监听端点用于 SRT 回源rtc可选后端 WebRTC 监听端点用于 WebRTC 回源device_id可选后端设备 id作为后端的标签监听端点的格式为port、protocol://ip:port或protocol://:port例如1935TCP 协议监听 1935 端口及任意 IPtcp://:1935TCP 协议监听 1935 端口及任意 IPtcp://0.0.0.0:1935TCP 协议监听 1935 端口及任意 IPtcp://192.168.3.10:1935TCP 协议监听 1935 端口及指定 IP从源码看该接口由 System API 服务器实现api.go 中的/api/v1/srs/register路由它解析请求体后强制校验ip、server、service、pid、rtmp五个字段非空然后构造OriginServer并调用负载均衡器的Update写入后端列表最后返回{code:0,pid:代理进程PID}。若开启了鉴权此路由会先经过withHTTPAPIAuth的 Bearer Token 校验。使用方式说明SRS 5.0 可作为后端其heartbeat特性即上文 Origin 配置中的heartbeat块会自动向代理注册也可以编写 curl 脚本注册后端或者开发一个独立的后端管理服务。例如不想改动 nginx-rtmp 代码时可以用一个独立程序把 nginx-rtmp 注册到代理服务器。源码视角代理进程如何工作以上操作背后srs-proxy 的启动与请求流转可以从源码中完整还原进程入口cmd/proxy/main.go 创建ProxyBootstrap并调用Start引导初始化internal/bootstrap/proxy.go 按顺序完成加载环境变量 → 安装信号处理与强制退出定时器 → 按PROXY_LOAD_BALANCER_TYPE选择 Redis 或内存负载均衡器 → 依次启动RTMP 代理、WebRTC 代理、HTTP API 代理、SRT 代理、System API、HTTP 流代理六个服务器并阻塞等待退出信号负载均衡决策internal/lb/mem.go 中Pick的核心策略是同一流 URL 始终路由到同一台 Originpicked表缓存首次选择时从 TTL 存活窗口默认 300 秒内注册过内的 Origin 中随机挑选同时内存版负载均衡器为默认后端启动每 30 秒一次的 keepalive 续期协程注册与鉴权System APIapi.go承载/api/v1/srs/register注册路由与/api/v1/versions版本/健康检查路由。仓库中还提供了端到端验证脚本如 proxy-e2e-cluster-test.sh、proxy-e2e-redis-test.sh 与 proxy-e2e-test.sh以及负载均衡与各代理模块的单元测试internal/lb、internal/proxy 下的*_test.go可进一步验证本文所述行为。总结SRS Origin Cluster 以 srs-proxy 为统一入口通过Origin 注册 负载均衡 协议代理的方式取代了旧版 MESH 集群用更简单、更健壮的架构支撑大规模并发推流。无论是单代理 多 Origin 的小型集群还是叠加 Redis 多代理与边缘服务器的超大规模系统都可以基于本文的环境变量配置、三套协议部署流程与注册 API 快速落地。当前实现已覆盖 RTMP、HTTP-FLV、HTTP-TS、HLS、WebRTCWHIP/WHEP与 SRT 六类协议MPEG-DASH 与 RTSP 支持、代理指标汇总与 Prometheus Exporter 仍在规划之中值得持续关注仓库更新。【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考