1. 概述:目标与总体架构
- 目标:在直播场景下用 SRS 构建边缘缓存 + 多机房/多备份的高可用直播 CDN,保证0~几秒内自动故障切换并最小化观众中断。
- 总体架构:多个边缘节点(SRS 或 Nginx+SRS 组合)做拉流缓存,集中或分布式 Origin(SRS),使用 DNS+健康检查+Keepalived/LVS 做流量引导,Prometheus+Grafana 做监控与告警。
2. 环境准备与依赖
- 主机建议:CentOS/Ubuntu,内核支持 epoll,网络 1Gbps+。
- 软件:SRS 源码或二进制、nginx(用于静态/HLS)、keepalived、haproxy(可选)、prometheus/node_exporter、ffmpeg(测试)。
- 端口:RTMP 1935、HTTP-FLV 80/8080、HLS 8080、API/Stats 1985。配置防火墙放行并调整 ulimit。
3. SRS 基本配置(边缘与 Origin)
- Origin srs.conf(示例关键段):
listen 1935;
vhost __defaultVhost__ {
mode rtc; # 或 origin 模式,根据需求
http_remux { enabled on; }
origin { enabled on; }
}
- Edge srs.conf:启用 origin 接入与缓存,配置 forward_to_origin、vhost 的 origin 指向 origin 集群 IP 或域名。
4. 用 Nginx 做静态与 HLS 加速
- 在边缘部署 nginx,用 upstream 指向本地或同机 SRS 的 http_remux 端口做缓存。示例:
upstream srs_local { server 127.0.0.1:8080; }
location /live/ { proxy_pass http://srs_local; proxy_cache srs_cache; }
- 设置 proxy_cache_path、cache_valid、cache_lock,避免并发回源风暴。
5. Keepalived/LVS 做边缘高可用
- Keepalived(虚拟 IP 冗余):在两台或多台 Edge 上配置 VRRP,master 发生故障时切换 VIP 给备机。
keepalived.conf 关键:vrrp_instance VI_1 { state MASTER; interface eth0; virtual_router_id 51; priority 100; virtual_ipaddress { 10.0.0.100 } }
- LVS+Keepalived:将请求均衡到后端 SRS 集群,使用 LVS 的 NAT/DR 模式提高吞吐。
6. 健康检查与自动剔除
- 使用 haproxy 或自写脚本做主动健康检查,检查点:SRS stats 接口(http://host:1985/),检测 RTMP/HLS 接口响应与流延迟。
- 健康不佳时,将节点从 LVS 后端或 Nginx upstream 中移除(通过 API 或 consul-template/etcd)。
7. DNS 与 Anycast 策略
- DNS:主域名使用多个 A/AAAA 记录分布到不同机房,配合低 TTL(例如 30s)与监控自动更新。
- Anycast:如使用 BGP Anycast,将边缘节点 IP 做 Anycast 广播,能在更大范围内减少切换时间,但对运维要求更高。
8. 流量回源与容错策略
- 回源策略:Edge 拉取 Origin,确保多 Origin 配置(primary/secondary)或 DNS 轮询。
- 缓存策略:HLS 片段预取、长短缓存结合,设置 cache-control 和 Expires,保留最后 N 片段以应对短暂 Origin 不可用。
9. 实战部署步骤(按序)
- 第一步:在每台节点上安装 SRS 并验证本地拉流/推流。示例命令:ffmpeg -re -i in.mp4 -c copy -f flv rtmp://edge-ip/live/stream
- 第二步:配置 edge 的 srs.conf 指向 origin(forward_to
)。重启 SRS 并确认 http_remux/HLS 可访问。
- 第三步:部署 nginx 缓存并配置 proxy_cache;在两台 edge 上部署 keepalived 并确认 VIP 切换。
10. 自动化运维脚本与回滚
- 健康检查脚本示例:定时 curl http://127.0.0.1:1985/api/v1/streams,若失败超过 3 次调用 API 从 upstream 删除并发送告警。
- 部署脚本:使用 ansible 或 salt 批量分发 srs.conf、证书与 systemd 单元,支持一键回滚到上一个版本并平滑重启(systemctl reload)。
11. 监控、告警与日志
- 监控:Prometheus 抓取 SRS 的 prometheus 模块或 stats 接口,Grafana 展示并设置流量/延迟/丢包告警。
- 日志:SRS access/error 日志集中化(Filebeat -> ELK),并做索引以便快速定位回溯。
12. 灾备演练与压力测试
- 故障演练:模拟节点断电、VIP 切换、回源不可达;演练步骤要写成 runbook 并在非生产时验证切换时长。
- 压力测试:用 tsung/locust 或 ffmpeg 多并发推流模拟并观察 CPU、内存、网络、文件描述符消耗。记录阈值并扩容。
13. 安全与证书管理
- HTTPS/RTMPS:用 nginx 做 SSL 终端,或在 SRS 端启用 TLS;推荐使用 Let’s Encrypt 自动续期并在多节点同步证书。
- 访问控制:限制推流白名单、启用签名 URL(token),避免盗链与盗流。
14. 回收与冷却策略(避免回源风暴)
- 并发限流:Nginx 设置 limit_conn/limit_req,SRS 设置 max_connections。
- 缓存锁:proxy_cache_lock 避免大量请求同时回源。配置合理的 cache_valid 和 stale 选项。
15. 灰度发布与升级流程
- 先在一台边缘做新版 SRS 部署,验证无异常后滚动更新;使用流量镜像(nginx mirror)将部分请求导到新版本做验证。
- 升级不可回滚时,准备兼容性检查(协议变化、配置项)并在低峰完成。
16. 常见故障排查步骤
- 无法拉流:检查端口、防火墙、SRS 日志、推流端返回码;使用 tcpdump/ss 查看连接。
- 延时/丢包高:查看网络丢包(ping/iperf)、磁盘 I/O(iostat)、检查是否在回源或转码环节瓶颈。
17. 测试命令与验证示例
- 验证 HLS:curl http://edge-ip:8080/live/stream.m3u8 -I,检查返回 200 并包含最新片段。
- 断流切换验证:在 master edge kill srs 后观察客户端是否在 2-10s 内切换到备机,检查 keepalived 状态和 DNS/Anycast 行为。
18. 运维小技巧与优化建议
- 使用 Rolling Update + 慢启动(graceful reconnect)减少并发冲击;提前预热热点流。
- 定期清理无效缓存、调优 tcp_tw_recycle/fin_timeout,设置合理的 epoll 与 worker 数量。
19. 问:SRS 在边缘模式下如何保证短时间内从故障节点切换到备节点?
- 回答要点:结合 Keepalived 的 VIP 切换或 DNS/Anycast+健康检查实现。Keepalived 切换通常在几秒内完成;若使用 DNS,需低 TTL 并配合主动健康监测与自动更新。另配合 nginx proxy_cache 保留片段可以覆盖切换期间的短暂中断。
20. 问:如何避免大量观众同时回源造成 Origin 风暴?
- 回答要点:通过边缘缓存(HLS 片段缓存)、proxy_cache_lock、合理的 cache_valid 设置与热流预热,结合限流(nginx limit_req)和退避策略,能将回源压力降至可控范围。同时可部署多 Origin 并做流量分发。
21. 问:日常运维中最关键的三项监控指标是什么?
- 回答要点:1) 流量与并发流数(突增预警);2) 平均端到端延迟与丢包率(用户体验指标);3) 节点资源(CPU、内存、fd、网络带宽)和 SRS 错误率日志。对这三项设置告警策略,能快速发现并定位问题。
来源:srs 直播cdn原理在容错与高可用设计中的具体实践