跳转到内容

集群部署插件

Cluster 插件为 Monibuca 提供多节点集群能力,支持 Origin-Edge 架构、节点自动发现、流自动转发(Relay)、智能负载均衡和故障转移。节点间通信基于 QUIC 协议实现低延迟高可靠传输。

预编译二进制已内置该插件,在 config.yaml 中设置 enable: true 即可。

┌─────────────┐ QUIC ┌─────────────┐
│ Origin │◄────────────►│ Edge-1 │
│ (node-1) │ └─────────────┘
│ │ QUIC ┌─────────────┐
│ 推流端接入 │◄────────────►│ Edge-2 │
└─────────────┘ └─────────────┘
QUIC ┌─────────────┐
◄────────────►│ Edge-3 │
└─────────────┘
  • Origin 节点:接收推流,作为流的源头
  • Edge 节点:接收拉流请求,当本地不存在流时自动从 Origin 回源
  • 每个节点既可以是 Origin 也可以是 Edge,角色由流的实际位置决定
cluster:
sync:
enabled: true
server_id: "node-1" # 唯一节点标识
address: "192.168.1.10:8180" # HTTP 控制面地址(与 global.http.listenaddr 一致)
seed_servers: # 种子节点列表(同为 HTTP 地址,非 gRPC :50051)
- "192.168.1.10:8180"
- "192.168.1.11:8180"
- "192.168.1.12:8180"
heartbeat_interval: 5 # 心跳间隔(秒)
sync_interval: 30 # 全量同步间隔(秒)
heartbeat_ttl: 15 # 心跳超时时间(秒)
suspect_threshold: 2 # 标记为可疑的未响应次数
offline_threshold: 3 # 标记为离线的未响应次数
routing:
cpu_threshold: 85.0 # CPU 使用率触发重定向的阈值(%)
bandwidth_threshold: 8000.0 # 带宽触发重定向的阈值(Mbps)
subscriber_threshold: 2000 # 订阅者数量触发重定向的阈值
allocation:
ticket_ttl: 30 # 分配票据有效期(秒)
candidate_limit: 3 # 每次分配的候选节点数量
relay:
establish_timeout: 10 # 建立 Relay 连接超时(秒)
release_delay: 10 # 空闲 Relay 释放延迟(秒)
max_retry_attempts: 3 # 最大重试次数
retry_delay: 2 # 重试间隔(秒)
health_check_interval: 5 # 健康检查间隔(秒)
role: [] # 角色配置(可选)
字段说明
server_id集群中唯一的节点标识符,建议使用有意义的命名如 origin-1edge-beijing-1
address本节点 HTTP 控制面地址(host:port,通常为 global.http.listenaddr),用于 /cluster/api/heartbeat
seed_servers种子节点的 HTTP 控制面地址列表;不要global.tcp.listenaddr(gRPC,如 :50051
heartbeat_interval心跳发送间隔,用于探测节点存活状态
suspect_threshold连续未收到心跳响应达到此次数后,节点被标记为 Suspect
offline_threshold连续未收到心跳响应达到此次数后,节点被标记为 Offline,触发会话失效和 Relay 清理

当节点负载超过阈值时,Redirect Manager 会将新的订阅请求重定向到负载更低的节点:

  • CPU 阈值:节点 CPU 使用率超过 cpu_threshold 时触发重定向
  • 带宽阈值:节点出口带宽超过 bandwidth_threshold 时触发重定向
  • 订阅者阈值:单节点订阅者数量超过 subscriber_threshold 时触发重定向

Edge 节点拉取 Origin 节点的流时,通过 Relay 机制建立连接。配置项控制连接超时、重试策略和健康检查频率。

Cluster 插件内部由以下管理器协同工作:

组件职责
SyncManager节点发现、心跳检测、状态同步
TransportManagerQUIC 传输层管理,维护节点间连接
SessionRegistry流会话注册表,记录流在哪个节点发布
RelayManager流转发管理,建立和维护跨节点的流传输
AllocationManager资源分配,为新请求选择最优节点
RedirectManager负载均衡重定向决策
ClusterHooks事件钩子,响应流的发布/取消发布/订阅/取消订阅事件
Cluster HTTP API控制面 REST(/cluster/api/*),含心跳与节点/会话查询
  1. 推流端向 Origin 节点推流
  2. ClusterHooks 监听 StreamEvent::Created,将流信息注册到 SessionRegistry
  3. SyncManager 通过心跳将流信息同步到集群其他节点
  1. 拉流请求到达 Edge 节点
  2. Edge 查询 SessionRegistry / SyncManager 目录,确定 Origin 节点
  3. Edge 向 Origin 发送 POST /cluster/api/relay/pull,Origin 接受后通过 QUIC 建立 Relay
  4. Origin 从本地 StreamManager 订阅 FLV 帧并经 QUIC 推送;Edge 写入 cluster 插件 Publisher,再向客户端分发
  1. SyncManager 检测到某节点心跳超时
  2. 达到 suspect_threshold 后标记为可疑,达到 offline_threshold 后标记为离线
  3. SessionRegistry 失效该节点的所有流会话
  4. RelayManager 清理该节点的所有 Relay 连接
  5. 客户端重新请求时,AllocationManager 分配新的可用节点

Origin 节点配置(node-1):

cluster:
sync:
enabled: true
server_id: "origin-1"
address: "10.0.0.1:8180"
seed_servers: ["10.0.0.1:8180"]

Edge 节点配置(node-2):

cluster:
sync:
enabled: true
server_id: "edge-1"
address: "10.0.0.2:8180"
seed_servers: ["10.0.0.1:8180"]

Edge 节点配置(node-3):

cluster:
sync:
enabled: true
server_id: "edge-2"
address: "10.0.0.3:8180"
seed_servers: ["10.0.0.1:8180"]

更详细的集群架构设计请参阅 集群架构

默认基地址:http://localhost:8180,路由前缀:/cluster/api/

统一成功响应:

{
"code": 0,
"message": "success",
"data": {}
}
GET /cluster/api/status/local

响应(示例):

{
"code": 0,
"message": "success",
"data": {
"server_id": "node-1",
"address": "192.168.1.10:8180",
"has_sync": true,
"node_count": 3,
"session_count": 25,
"relay_session_count": 2,
"active_relay_sessions": 1
}
}

可选配置 sync.internal_api_key:设置后,所有 /cluster/api/* 请求需携带请求头 X-Cluster-Api-Key(或 Authorization: Bearer <key>)。

GET /cluster/api/servers

返回所有可见节点摘要列表。

POST /cluster/api/heartbeat
Content-Type: application/json

请求体:

{
"summary": {
"server_id": "node-2",
"address": "192.168.1.11:8180"
}
}
字段类型必填说明
summary.server_idstring节点 ID
summary.addressstring节点地址

响应 data(v6):

{
"summaries": [
{ "server_id": "origin-1", "address": "192.168.1.10:8180", "quic_addr": "..." }
]
}

Edge 等节点应合并响应中的 summariessessions,并在 sync_interval 周期内对种子执行 GET /cluster/api/serversGET /cluster/api/sessions 拉取全量目录。推流/断流后 Edge 会向种子 POST /cluster/api/sessions/sync 推送会话增量;订阅/取消订阅时向种子 POST /cluster/api/sessions/participation 推送参与方增量(action: subscribe / unsubscribe)。

POST /cluster/api/servers/sync
Content-Type: application/json

请求体:

{
"summaries": [
{ "server_id": "node-1", "address": "192.168.1.10:8180" },
{ "server_id": "node-2", "address": "192.168.1.11:8180" }
]
}
GET /cluster/api/sessions

返回集群中的流会话列表(按 stream_path 排序)。

POST /cluster/api/sessions/participation
Content-Type: application/json
{
"stream_path": "live/test",
"node_id": "edge-1",
"action": "subscribe"
}

actionsubscribeunsubscribe。接收方将远端 node_id 记入该流的 subscribe_nodes。当 node_id 等于本地 server_id 且流在远端 Origin 上发布时,本节点会通过 attach_or_ensure_relay_session 建立或复用 Relay。参与方事件会向目录中所有已知节点 HTTP 地址广播(不仅限于 seed_servers)。

POST /cluster/api/relay/pull
Content-Type: application/json

请求体(Edge → Origin):

{
"request_id": "uuid",
"stream_path": "live/test",
"requestor_id": "edge-1",
"quic_addr": "192.168.1.11:44944",
"session_id": "uuid",
"timestamp": 1710000000000
}

响应 dataPullStreamResponseacceptedtrue 时 Origin 已接受拉流并开始 QUIC Relay;quic_addr 为 Origin 侧 QUIC 端点。

GET /cluster/api/relay/sessions

返回本节点正在管理的 Relay 会话(statesubscriber_countframe_countsource_quic_addr 等),供 Admin 集群页「Relay」Tab 展示。

POST /cluster/api/allocate/publish
Content-Type: application/json
POST /cluster/api/allocate/play
Content-Type: application/json

以上两个接口请求体一致:

{
"stream_path": "live/test",
"protocol": "webrtc",
"limit": 3
}
字段类型必填说明
stream_pathstring流路径
protocolstring协议名,默认 unknown
limitint候选节点上限
GET /cluster/api/redirect/decision?stream_path=live/test&protocol=webrtc
参数类型必填说明
stream_pathstring目标流路径
protocolstring协议类型
HTTP 状态码场景
400请求体错误或 stream_path 缺失
404路由不存在
401配置了 internal_api_key 但缺少或错误的 X-Cluster-Api-Key
503分配器/重定向器不可用

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码