先简单介绍一下使用的资源
三台服务器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; }