跳转到正文

存储与容量 ​

录制文件通常是 Rust-Srec 部署的主要成本。容量规划必须包括原始录制、弹幕文件、管道中间文件、最终产物,以及备份或迁移期间的额外空间。

估算录制容量 ​

可使用以下十进制近似公式:

text
每小时 GB = 平均码率 Mbit/s x 0.45
每日 GB = 每小时 GB x 每日录制小时数 x 同时录制数
所需容量 = 每日 GB x 保留天数 x 安全系数

以 6 Mbit/s 计算,一路直播每小时约 2.7 GB。每天 8 小时、保留 30 天约为 648 GB,尚未包括弹幕、管道产物、文件系统开销和安全余量。应测量平台真实码率;转码可能减少最终体积,但会增加处理期间的峰值占用。

安全系数至少取 1.2;直播时长不稳定或管道同时保留源文件与产物时应进一步提高。

Docker 路径 ​

宿主机设置容器路径内容
DATA_DIR/app/dataSQLite 数据库与应用数据
CONFIG_DIR/app/config平台配置文件
OUTPUT_DIR/app/output录制与配置的管道输出
LOG_DIR/app/logs应用日志

生产环境使用绝对宿主机路径,并确认容器用户能在每个输出根中创建、重命名和删除文件。除非容量和告警确实共用,否则不要把 OUTPUT_DIR 指向操作系统卷。

系统服务路径 ​

使用随附 rust-srec.service 单元部署时,路径改为:

路径内容
/var/lib/rust-srecSQLite 数据库、WAL 文件和运行世代标记;同时也是服务账号的主目录
/var/lib/rust-srec/output单元中 OUTPUT_DIR 和 RUST_SREC_OUTPUT_ROOTS 指向的录制卷
/var/log/rust-srec按天轮转的应用日志

三者都由 systemd 在每次启动时创建并归服务账号所有,全新主机无需提前创建。

如果录制目录会增长到几百 GB 以上,请给它单独的卷,并在 ReadWritePaths= 中列出,而不要嵌套在 /var/lib/rust-srec 之下。只要 StateDirectory= 发现状态目录属于其他用户,就会递归修改其下全部文件的属主,而这一步发生在单元启动过程中——目录树很大时,这次遍历可能超过启动超时。列在 ReadWritePaths= 中的路径必须事先存在并归服务账号所有,systemd 既不会创建它,也不会修改它的属主。

录制目录取自数据库中的 output_folder。独立后端仅在创建全新数据库时用 OUTPUT_DIR 初始化它,之后启动时会保留已保存的值。发现过程使用已保存的设置和覆盖项,不会把过时的 OUTPUT_DIR 当成额外录制位置。请让显式配置的 RUST_SREC_OUTPUT_ROOTS 与已保存的文件夹保持一致。参见环境变量。

输出根探测 ​

启动发现使用真实主播名和平台名,选择与录制尝试映射到同一写入门键的具体目录。 探测会测试具体配置目录,即使其祖先键目录只读,该目录也可能可写。显式 RUST_SREC_OUTPUT_ROOTS 边界优先。若路径前部的标题、会话或日期占位符使键无法 确定,则跳过该模板;可用显式边界为这些布局提供探测覆盖。

探测目标按写入门键合并,并确定性地选择一个具体代表目录。启动最多尝试 16 个键, 同时等待结果的尝试最多四个;被跳过的目标会记录日志。操作系统调用可能超过 五秒等待时间仍未返回,但启动探测的总启动数受限。一个代表目录的结果不能证明 每个子目录都具有相同权限,每次实际录制仍会检查自己的输出路径。

磁盘探针在启动时注册。修改输出设置不会重建该探针集合,不再使用的输出根对应的 历史写入门条目也会保留。这些限制不会改变新录制尝试使用的键。

容量控制 ​

  • 用 max_concurrent_downloads 限制同时写入数。
  • 下游无法处理超大文件时,通过时长或分片大小限制切分长录制。
  • CPU 与 IO 管道并发应低于主机可持续容量。
  • 任务历史和通知事件历史有各自保留设置;这些设置不会删除媒体文件。
  • 只有在非关键数据上验证目标和删除源文件行为后,才使用自动移动或上传管道。

删除主播不会回收任何空间。该主播的会话,以及记录在会话下的媒体产物记录、分段和弹幕统计都会被有意保留。要回收空间,请先删除不再需要的媒体产物并勾选一并删除磁盘文件,然后再删除会话。顺序很重要:删除会话会一并移除其媒体产物记录,而这些记录保存着应用能找到对应文件的唯一路径。参见删除语义。

Rust-Srec 不能替代组织的媒体生命周期策略。如保留要求需要,应在应用外自动归档或删除媒体,并确保自动化不会删除仍在写入的文件。

告警与故障处理 ​

同时监控输出卷的剩余字节和剩余百分比,告警提前量应覆盖最长活跃录制和管道临时空间。输出根写入门会在配置目录不可写时阻止新任务并发送严重通知,但不能替代容量预测。

输出失败时:

  1. 停止增加新任务,确认受影响的输出根。
  2. 检查剩余空间、inode/文件数限制、挂载状态和所有权。
  3. 恢复写权限,并在同一文件系统完成一次小文件写入测试。
  4. 写入门冷却结束后,让受影响录制重试真实目录检查,再确认系统健康页恢复。不再使用的输出根若保留了历史条目,写入其他位置的录制无法使其恢复。

运行时恢复记录 ​

独立运行时在数据库旁记录当前代的所有权及较早未完成恢复的代。只有主播元数据 加载和管道、DAG、协调器对账都明确报告成功,启动过程才会清除较早的恢复欠账。 历史产物关联不明确或恢复操作失败时保留欠账;启动仍尽力继续。恢复会分页读取 全部会话分片。

确认恢复不会清除当前代,因此后续崩溃仍会形成新欠账。代的准入、恢复确认和干净 退出更新共享短期跨进程锁,旧工作进程无法覆盖替代代的记录。持久的 .update.lock 文件与监督进程的生命周期所有权锁分离。运行时活动期间不要删除这些锁文件。

基于 MIT 许可证发布。