请叫我小C的gravatar头像
请叫我小C 2022-05-18 18:10:28
记录一次上千人同时点播视频的实践

先简单介绍一下使用的资源

三台服务器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;

        }

 


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
qqqwml  LV1 前天
沙漠鱼  LV12 6月30日
hanyifan  LV3 6月23日
请叫我小C  LV19 6月22日
fellowfun  LV11 6月10日
1521845663 6月6日
暂无贡献等级
dafeiyu  LV10 6月4日
Liu1814789260 6月3日
暂无贡献等级
不打不相识  LV12 5月31日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友