请叫我小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;

        }

 


打赏

已有2人打赏

hunan27的gravatar头像 最代码官方的gravatar头像
最近浏览
暂无贡献等级
叶儿飞  LV4 8月13日
dapeng0011  LV15 6月6日
youwuzuichen  LV10 2023年3月27日
wsh564494062  LV8 2023年1月28日
1105570390  LV8 2022年12月23日
superding  LV5 2022年12月18日
heerofriend  LV11 2022年12月7日
如果white  LV2 2022年11月28日
Add_Wa  LV1 2022年11月21日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友