|
本帖最后由 IDCLAYER 于 2018-11-30 20:10 编辑
又又又一个CDN集群管理系统...... 视频CDN/点播CDN 最近完成的事
这次完善了CDN视频这块的支持
这个不知道怎么说.... 考虑到一些因素, 能算独立的系统吧
后面在讨论原因
先汇报测试数据
日志服务器的数据量
===========================================================
我这个测试日志服务器配置是
Xeon E5-2560/ 64G内存 / 6 x 300G SSD / HW Raid+10
这个量目前查询都是毫秒级别,没有压力
视频日志服务器这块用户提供给客户计费,都是计流量费用
所以就存储了5个字段,算非常迷你了
time 时间
vhost 域名
byte 字节
cache 缓存命中
code 状态代码
经过一段时间的测试,日志服务器占用情况
最高的记录了单天完成了1751千万请求日志, 合计占用1G硬盘
平均就算按
3千万条日志记录 = 2G硬盘
30亿=200G硬盘
300亿=2000G
HW卡 + 4块 1T 硬盘 = 最少存储500亿记录
单机虽然慢些但是作为计费凭证,还是有必要的长期存储的
成本并不高....
在讨论
业务逻辑图
视频后端服务器模式
==================================================
第一种模式
用户使用自己的存储服务器
我们缓存用户的内容到服务器缓存节点
和正常CDN业务一样
第二种模式
用户使用我们的存储服务器
搭配我们专用后端存储服务器
用户上传MP4格式的文件
我们的后端存储实时处理(0等待)
生成
MP4
MSS
HLS
Dash
RTMP
等协议
实现全媒体平台的播放支持
生成的文件,提供给CDN节点缓存使用,并不占硬盘!
这个方案 优势明显
如果一个1G的MP4文件,你希望提供5个点播协议
正常的方案 1Gx5个副本 = 5G
我们的方案 1Gx5个副本 = 1G 节省4G
影片容量大的话,成本节省还是很明显的
专用后端存储服务器 (硬盘IOPS和内存有要求)
亿级请求,没有性能瓶颈
视频CDN主要的管理功能
====================================================
加速资源管理
0.png
资源摘要
1.png
源站配置
2.png
流量分析
3.png
数字证书
4.png
安全相关
5.png
流量和速度限制相关
6.png
缓存策略
7.png
内存缓存策略 针对MP4文件
7-1.png
页面定制,忽略这个 流媒体用不到.....
遇到的大坑
/////////////////////////////////////////////////////
1. MP4文件的Meta信息 atom这个问题
我之前也回复过某人
这里写个详细的分析
选择你最大目录下的MP4文件
分析有很多工具
qtfaststart AtomicParsley 都可以
[ol] wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-5-1-627.x86_64-unknown-linux.zip unzip Bento4-SDK-1-5-1-627.x86_64-unknown-linux.zip cd Bento4-SDK-1-5-1-627.x86_64-unknown-linux 分析文件 bin/mp4dump aaaa.mp4[/ol]复制代码
得到 类似这种数据
10.png
那个
源头数据 [moov] size=8+319945
视频数据 [mdat] size=8+23403101
并且注意那个顺序
moov应该在前面,如果不在,视频只能下载完成才看
qt-faststart和MP4Box就是干这个工作的,
把文件中的moov移到开头
就是这个视频计算 moov大小
然后换算下
[ol] function bcsum { local -i bytes=$1; if [[ $bytes -lt 1024 ]]; then echo "${bytes}B" elif [[ $bytes -lt 1048576 ]]; then echo "$(( (bytes + 1023)/1024 ))KiB" else echo "$(( (bytes + 1048575)/1048576 ))MiB" fi } echo -e "moov size:" $(bcsum 319945) echo -e "mdat size:" $(bcsum 23403101) [root@dev]# echo -e "moov size:" $(bcsum 319945) moov size: 313KiB [root@dev]# echo -e "mdat size:" $(bcsum 23403101) mdat size: 23MiB[/ol]复制代码
这个就是表示
如果想看在线观看MP4,你在线观看这个视频, 必须下载完moov的313k,然后才能看视频
按比例
20M = 300k
200M=3M
2000M=30M
一个2G的视频文件,访客必须先要下载完约30M的moov索引才能开始看视频
这个就是为什么你看视频慢的原因
对应的 nginx中 MP4 Block
mp4;
mp4_buffer_size 5m;
mp4_max_buffer_size 30m; #这个30M就是改为你最大MOOV值
如果小于 日志里,就会出现
"moov atom is too large: 99999999
这个错误, 且视频播放失败
2. MP4文件的分段缓存问题
官方的说明在这里
https://www.nginx.com/blog/smart-efficient-byte-range-caching-nginx/
分段缓存
看起来很美好,压根不是那么回事
针对MP4文件
启用分段的时候
一个1G大小的MP4文件
使用缓存KEY + $slice_range, 可能出现缓存硬盘占用超N倍的情况
因为缓存KEY的变为
http://cache/10Mb.txtbyte0-1048576
就是根据内容长度, 用户请求的哪段就缓存哪段 问题在于用户请求的长度无规律的
会出现重复特定段的问题
虽然官方的说明有设置锁定和更新期限,但是还是有各种问题,除非你仅使用内网缓存
对CDN节点硬盘读写I/O也有压力
如果开启了分段缓存
哈哈
你访问m3u8索引和ts/key文件 都会出现这个问题
2018/11/30 01:02:18 [error] 11142#11142: *554 unexpected range in slice response: 0-1048576 while sending to client,
因为这个的问题 slice 1m;
这个定义了1M 就是 1048576 字节 , 返回长度小于这个的会出错,无限循环
如果你slice定义的小 100k? HLS AES 的key只有几k
并且内容分段为100k 那么分段本身已经毫无意义了....
解决办法:
把这个配置移动到mp4的BLOCK里
只对MP4和FLV这类大文件生效,当然你MP4文件如果小于1M...
所以正确的方式是 slice值 设置为你最小的 size
我是先定义一个全局变量
如果在mp4 block区域追加$slice_range
如果有必要的话,因为测试我暂时已经关闭了已经
未完待续 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|