先简单介绍一下使用的资源
三台服务器16g,16核,磁盘阵列
服务器A:部署了nginx,前端,nginx缓存视频,预览服务
服务器B:部署了PC后端服务,App后端服务,文件服务,nginx分片视频服务
服务器C:部署了数据库,redis,mq,PC后端服务,App后端服务
需求是:5000人使用,基本上4000人会同时使用,每个人必须完整的看完视频,不能拖动进度条,不能切屏,播放过程中偶尔需要客户端点击确定做一个互动,记录进度,上传看视频心得,还有其他功能为下一阶段需求
大概架构如这个图
好了,背景就这些,最重要的一点哈,整个项目就我一个人,一个人开发,运维,上线,测试各种问题,因为是私活,也要的比较急,35天的工期,找的开源框架做的
正文开始了
daung~~~~duang~~~~duang~~~~~一下子涌入1300多人,上午8点40分
我已经泡好茶,打开服务器监控页面,点了跟烟,duang~~~cpu和内存一下子就到90%,过一会到100%了,再过一会儿110%多,系统基本上瘫痪了,我马上切入B计划,动态增加了cpu和内存,限制流量进入,进入问题排查
大概2个小时过后,排除问题得到的结果
问题1:视频播放单个请求2-3m,带宽不够
问题2,记录看视频进度请求过于频繁(10秒记录一次),导致cpu过高
问题3. 有的进度点开播放后直接学习完成(这个bug花费时间最久才找到原因)
问题4:有个别视频播放到中间后不能播放了
解决问题:
上午11点50
问题1,利用nginx-vod-module这个插件,将视频分割成200kb左右,之后再用服务器A的nginx缓存
中午12点30
问题2,所有请求都发送到redis,让后redis每分钟写入数据库
下午14点
问题3,当发现当前视频进度与上次的进度时间相隔10秒或以上,则记录的进度保持不变,同时进度条保持再拖动之前
下午17点
问题4,nginx中缓存的配置修复
晚上20点
将服务器资源重新恢复初始值
晚上23点,监控服务器资源cpu和内存一直保存相对稳定40%,在线人数还有400多
第二天早上9点,在线人数3200多人,cpu80%多,内存90%多,相对稳定
以下是nginx的配置重要配置
events {
use epoll;
worker_connections 20480;
}
http {
# 开启换成到指定目录
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=48h max_size=100g use_temp_path=off;
upstream pcServer {
least_conn;
server 10.0.2.17:8082 weight=2;
server 10.0.2.18:8082 weight=1;
}
upstream wxServer {
least_conn;
server 10.0.2.17:8081 weight=2;
server 10.0.2.18:8081 weight=1;
}
}
server {
#视频代理,直接只想视频存储目录
location /video {
proxy_pass http://10.0.2.17:9005/video;
}
#视频缓存
location ^~ /vod {
proxy_pass http://10.0.2.17:9005/vod;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass_header Set-Cookie;
}
#视频只缓存代理的
location ^~ /vcache/video {
proxy_pass http://10.0.2.17:9005/vcache/video/;
open_file_cache max=10000 inactive=60s;
proxy_cache cache_one;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
proxy_cache_valid 200 206 304 301 302 72h;
}
}
分片设置,服务器B配置
location /video {
vod hls; # 协议使用hls模式
vod_mode local; # 访问模式指定为local模式
sendfile on;
directio 4k;
directio_alignment 4k;
output_buffers 1 256k;
aio threads;
vod_open_file_thread_pool default;
vod_align_segments_to_key_frames on; # 每个切片以关键帧开头
vod_manifest_segment_durations_mode accurate; # 精确显示每个切片的长度
vod_metadata_cache metadata_cache 1024m; # 这个应该以G为单位,越大越好
vod_response_cache response_cache 128m;
vod_mapping_cache mapping_cache 5m;
#vod_hls_mpegts_align_frames off;
#avod_hls_mpegts_interleave_frames on;
vod_base_url $scheme://$http_host/vcache;
# 解决浏览器跨域问题
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
alias /opt/storage/video;
}
最近浏览





