尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SRS 多代理服务器怎么配置 Redis 负载均衡器共享源站状态

SRS 多代理服务器怎么配置 Redis 负载均衡器共享源站状态 SRS 多代理服务器怎么配置 Redis 负载均衡器共享源站状态【免费下载链接】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 的 Go 语言代理服务器cmd/proxy内置负载均衡它把客户端请求按流 URL 路由到后端源站并维护流 → 源站的映射。默认的内存负载均衡器PROXY_LOAD_BALANCER_TYPEmemory状态只存在于单个代理进程内只能支撑单代理部署。当单个代理成为瓶颈、需要部署多个代理横向扩容时就要求所有代理共享同一份源站注册表和流映射——这正是 Redis 负载均衡器的用途所有代理读写同一个 Redis 实例源站只向其中任意一个代理注册其余代理即可从 Redis 读到状态并正确路由。本文的目标很具体部署两个使用 Redis LB 的代理加一个 SRS 源站验证推流走代理 A、播放走代理 B仍命中同一源站。内容依据仓库文档 proxy-load-balancer.md、features.md、proxy-protocol.md 与 E2E 脚本 proxy-e2e-redis-test.sh。内存 LB 与 Redis LB 的差异两种实现都维护流级粘性一个流的首个请求选定源站后后续同流请求始终路由到该源站。区别在于状态存放位置proxy-load-balancer.md 的对比表方面Memory LBRedis LB部署单个代理多个代理状态存储进程内内存共享 Redis延迟最低进程内网络 序列化开销依赖无需要 Redis适用中等流量高流量、需要横向扩容只有需要跑多个代理时才切到redis单代理多源站的场景用 memory 即可proxy-origin-cluster.md 中的说明。准备条件按 proxy-origin-cluster.md 和 E2E 脚本的前置检查Go 1.18用于构建代理在项目根目录执行make得到bin/srs-proxy。已构建的 SRS 源站二进制trunk/objs/srscd trunk ./configure make可选先go mod download。Redis 服务已运行且redis-cli ping返回 PONG。脚本对 macOS 的提示是brew services start redis或前台运行redis-server其他平台自行保证一个可用的 Redis 实例。ffmpeg与ffprobe在 PATH 中用于推流和验证。代理的配置完全由环境变量驱动没有配置文件features.md。配置两个代理使用同一个 RedisRedis LB 的环境变量最小集合proxy-load-balancer.mdPROXY_LOAD_BALANCER_TYPEredis PROXY_REDIS_HOST127.0.0.1 PROXY_REDIS_PORT6379 PROXY_REDIS_PASSWORD PROXY_REDIS_DB0PROXY_REDIS_KEY_PREFIX可选默认为空设置后所有键变为xxx:srs-proxy-...形式用于隔离共用同一个 Redis 数据库的独立集群。同一逻辑集群的所有代理必须使用相同的 host/port/db 和相同的前缀否则它们读到的就不是同一份状态。每个代理会同时启动全部 6 个监听RTMP、HTTP API、HTTP Stream、WebRTC UDP、SRT UDP、System API所以两个代理需要各自独立的一整套端口。下面的端口方案来自仓库 E2E 脚本代理 Afeatures.md 中的默认端口env PROXY_RTMP_SERVER11935 \ PROXY_HTTP_API11985 \ PROXY_HTTP_SERVER18080 \ PROXY_WEBRTC_SERVER18000 \ PROXY_SRT_SERVER20080 \ PROXY_SYSTEM_API12025 \ PROXY_LOAD_BALANCER_TYPEredis \ PROXY_REDIS_HOST127.0.0.1 \ PROXY_REDIS_PORT6379 \ PROXY_REDIS_PASSWORD \ PROXY_REDIS_DB0 \ PROXY_REDIS_KEY_PREFIXredis-lb-demo \ ./bin/srs-proxy代理 B每项端口错开一位Redis 相关变量与代理 A 完全相同env PROXY_RTMP_SERVER11936 \ PROXY_HTTP_API11986 \ PROXY_HTTP_SERVER18081 \ PROXY_WEBRTC_SERVER18001 \ PROXY_SRT_SERVER20081 \ PROXY_SYSTEM_API12026 \ PROXY_LOAD_BALANCER_TYPEredis \ PROXY_REDIS_HOST127.0.0.1 \ PROXY_REDIS_PORT6379 \ PROXY_REDIS_PASSWORD \ PROXY_REDIS_DB0 \ PROXY_REDIS_KEY_PREFIXredis-lb-demo \ ./bin/srs-proxyPROXY_REDIS_PASSWORD为空表示 Redis 无密码。示例中的redis-lb-demo前缀是演示值两个代理保持一致即可也可留空使用默认键名。Redis 中共享的键proxy-load-balancer.md键用途过期策略srs-proxy-server:{serverID}源站注册PROXY_ORIGIN_SERVER_TTL默认 300ssrs-proxy-all-servers服务器列表索引无过期srs-proxy-url:{streamURL}流到源站的映射无过期srs-proxy-hls:{streamURL}、srs-proxy-spbhid:{spbhid}HLS 会话双索引120ssrs-proxy-rtc:{streamURL}、srs-proxy-ufrag:{ufrag}WebRTC 会话双索引120s健康判定源站在PROXY_ORIGIN_SERVER_TTL默认 300s内没有心跳更新即视为死亡Redis 中对应键由 TTL 自动过期。该参数接受 Go 时长语法如45s、2m必须为正且大于心跳间隔。启动 SRS 源站并验证注册源站直接使用仓库自带的 trunk/conf/origin1-for-proxy.conf其中的heartbeat段让 SRS 5.0 自动注册并周期性心跳这是 proxy-protocol.md 推荐的生产方式heartbeat { enabled on; interval 9; url http://127.0.0.1:12025/api/v1/srs/register; device_id origin1; ports on; }该配置中源站的 RTMP/HTTP/API/RTC/SRT 端口分别是 19351/8081/19851/8001/10081url指向的12025是代理 A 的 System API 端口这份配置面向代理与源站同机或代理 A 可达的单机示例。多机部署时 SRS 只接受一个heartbeat.url文档建议指向 NLB 或 VIP 这类高可用前端再转发到各代理的 System API——因为若直连单个代理且该代理故障SRS 不会自动改连其他代理注册会在 TTL默认 300s后过期。启动源站proxy-usage.mdulimit -n 10000 bash -c cd trunk ./objs/srs -c conf/origin1-for-proxy.conf注册是否成功有两条文档依据的验证方式代理 A 的控制台日志出现 Register SRS media server 消息Redis 中已写入服务器键E2E 脚本的判断方式示例前缀下redis-cli -h 127.0.0.1 -p 6379 -n 0 --scan --pattern redis-lb-demo:srs-proxy-server:*若你使用空前缀扫描模式为srs-proxy-server:*。扫描到至少一个键说明源站状态已进入共享 Redis两个代理都能读到。推流与跨代理播放验证这是验证共享状态是否真正生效的最短主路径推流请求到达代理 A由 A 选定源站并把映射写入 Redis播放请求到达代理 B由 B 从 Redis 解析出映射并转发到同一源站。推流走代理 ARTMP 端口 11935ffmpeg -stream_loop -1 -re -i trunk/doc/source.flv -c copy -f flv rtmp://localhost:11935/live/livestream-stream_loop -1让输入文件无限循环避免推流结束后断流。播放走代理 BRTMP 端口 11936ffprobe -v error -show_streams rtmp://localhost:11936/live/livestream成功条件是 E2E 脚本采用的判断ffprobe 输出中同时出现codec_typevideo和codec_typeaudio。能探测到码流说明代理 B 命中了代理 A 写入的srs-proxy-url:{streamURL}映射该映射键永不过期只要源站存活同流请求会一直固定路由到该源站。需要其他协议时可按 proxy-origin-cluster.md 用 HTTP-FLVhttp://localhost:18080/live/livestream.flv、SRT 等地址替换协议代理本身不受影响见下文限制。另外HTTP API11985、System API12025与 HTTP Stream 服务器都暴露/api/v1/versions可兼作各代理的健康检查features.md。一键 E2E 验证脚本可选路径仓库自带的 skills/srs-develop/scripts/proxy-e2e-redis-test.sh 把上面流程整体脚本化构建代理 → 按上文端口方案启动代理 A/B → 启动源站 → 等待 12s心跳间隔 9s后用redis-cli --scan检查srs-proxy-server:*键 → 用 ffmpeg 向代理 A 推一条带时间戳流名的测试流 → 用 ffprobe 经代理 B 校验视频/音频流任一步失败即打印对应日志退出。执行前需了解它的副作用与前提前提PATH 中有ffmpeg、ffprobe、redis-cliRedis 已在PROXY_REDIS_HOST/PROXY_REDIS_PORT/PROXY_REDIS_DB默认 127.0.0.1:6379/0可用会执行make构建代理若trunk/objs/srs不存在还会在trunk下执行./configure make构建 SRS会删除残留的trunk/objs/origin1.pid并 kill 占用 A/B 代理与源站全部测试端口的进程脚本内列出的 15 个端口清理 Redis 状态时只删除本次测试创建的键测试流映射、匹配的源站注册键明确不 FLUSHDB、不清空其他srs-proxy-*键每次运行默认生成唯一的e2e-xxxxxxxx键前缀隔离状态也可通过环境变量PROXY_REDIS_KEY_PREFIX显式指定。已知限制Redis LB 的 HLS/WebRTC 限制当前 Redis 负载均衡器尚不能把 HLS 与 WebRTC 会话对象从 Redis 反序列化回来LoadHLSBySPBHID和LoadWebRTCByUfrag返回错误。因此在PROXY_LOAD_BALANCER_TYPEredis下HLS 播放会在 TS 分片请求上失败WebRTC 客户端只能被处理过其信令的那个代理识别跨代理迁移不生效。RTMP、HTTP-FLV/TS、SRT 不受影响features.md Notes。会话状态 120s 过期HLS 与 WebRTC 会话键在 120s 无请求后过期每次请求会续期流 → 源站映射则永久保留仅当源站死亡或映射被显式清除时重置。心跳与 TTL 的约束PROXY_ORIGIN_SERVER_TTL必须大于源站心跳间隔源站停止心跳后其注册在 Redis 中按 TTL 自动过期代理随即不再把新流分配给它。延迟Redis LB 相比内存 LB 多一次网络往返与 JSON 序列化开销这是用延迟换取多代理共享状态的成本。完成这套验证后多代理横向扩容的架构即 proxy-design.md 中的 Multi-Proxy 模式客户端前面再加一层网络负载均衡如 AWS NLB把连接分发到各代理代理层与源站层各自独立扩容而只需一个代理时把PROXY_LOAD_BALANCER_TYPE改回memory、去掉全部PROXY_REDIS_*变量即可。【免费下载链接】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),仅供参考
返回列表