tongsiying

阅读|运动|自律

0%

CND

000-ott基本流程

1
2
3
4
5
6
7
8
下午复习计划:
1、项目连续说一遍
2、一些问题,集中说一遍
3、sql语句背一下,多表查询,增删改查,数据库以及表导入导出
4、linu基本
5、计算机基本,如加路由等
6、dfs相关
7、为啥要离职
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
老模式:
用户——RR——边缘SLB——边缘IAS——中心SLB——中心IAS
1、RR匹配边缘SLB
2、边缘SLB匹配边缘IAS
3、边缘IAS有内容就直接返回给用户,没有就直接到中心级联,中心没有去源站回源

RR:最大带宽、最大用户数(license)
DR采集:
curl -i "http://223.85.247.163:6612/GetCDNLoadInfo" ip
curl -i "http://223.85.247.163:6612/GetCDNLoadInfoAll" 设备
1、先ip段:看客户端ip在哪个ip段,在iam上可以配置某个ip段掉某个节点
1节点对应0.0.0.0——200.200.200.200
2节点对应201.201.201.201——255.255.255.255
客户端ip是10.10.10.10对应节点1的ip段,那掉的时候就掉到节点1
比如节点1无对应节点,返回默认节点

2、服务类型:
·vod
·tvod
·live
·tstv
file type:
·1
·2
·3
·4
对应节点1,那就返回节点1
对应节点2,那就返回默认节点
没有对应节点,那就返回默认节点

3、如果服务类型都有,那就看权重

4、SLB定时反馈一个状态给RR,RR进行Dr采集
netstate:10
最大用户数
最大带宽
在线用户数
使用带宽

SLB:正常情况下是一个slb调度两个ias
-vod
1、正常的IAS:
内容发布的时候会根据contentid、ias的max带宽、deviceid进行一个算法(hash)到某个ias

2、IAS:定时返回一个状态给SLB
netstate:10
最大用户数
最大带宽
在线用户数
使用带宽

来判断是否有该内容,又返回就给用户

-频道
1、SLB会记录频道和对应的ias
通过查表:
chan1 dev1
chan2 dev2
chan1 dev2
chan1同时在dev1和dev2上,chan1来第一次请求的时候会先选dev1,第二次请求的时候会选择dev2,第三次请求的时候会选择dev1以此类推
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
新模式:泰国、越南、南非
用户——RR——边缘SLB——边缘IAS——file slb——file package——live package

1、端口
RR:
管理端口:6120
服务端口:6060

SLB:
管理端口:6420
服务端口:6410

IAS:
管理端口:6620
服务端口:6610

file package:
管理端口:6920
服务端口:6910

live package:
管理端口:6820
服务端口:6810


2、live package进行拉直播流、切片和转码,提供dash和hls的直播服务以及给file package提供录制分片
file package是存储vod、录制分片(存储为mp4)。提供点播、tvod和tstv

·切片器是基于nginx做的,nginx做了一个module(就是嵌入了一个我们开发的模块),其实就是一个大文件range请求,range成小文件,就等于说切成了大小一样的ts,大文件计算好请求多少个range然后带range去请求服务器大文件保存成小文件

·ts转成mp4是ffmpeg开源模块做的
mp4转成ts和dash,是jitp做的,jitp就是一个vod-module模块做的,也是开源的


3、file package存储的都是mp4分片,有开关

4、multicast组播
用户会请求一个单播,file package会带一个组播信息,一看这个频道是组播频道,用户就直接加入组播组
http走公网,需要大量服务器;组播走专网,一条线就可以了,省钱,但丢包严重,组播只管发,爱收你就加入组播组;
我们做了丢包补偿,10%的丢包补偿,10个udp包就会多给一个包,有什么算法,可以算出丢的那个

5、意电做了热点组播、组播N+1
N+1:
两台multicas
·发布组播频道的时候会主动哈希
·某台multicast异常,这台multcast上的组播频道会重新哈希到另外一台正常的multicast上
·已经有一台了,上面有组播频道,然后我这边又加了台multicast,理论上会哈希的,但是我们有时间设置,默认是晚上2点到5点才会哈希
·IAMRES根据组擂设备心跳采集情况,判断组播设备是否发生状态切换(正常转异常、状态抖动、异常转正常、设备扩容)。
当正常设备转为异常设备时,更新内存中的设备状态及哈希设备列表,生成N+1哈希计划t_ otthashtask

热点组播:意电现网是有cdn的
·rr对于意电来说叫ctroller,agent(网关)上报某个频道的某个码率的用户数给controller,controller上会设置一个阀值,超过这个阀值就会生成组播频道,IAMCACHE定时向RR设备发起热点频道数据采集请求(默认5分钟采集一次,WEB页面进行配置修改)
·每次生成的组播频道默认一小时,要到一小时的时候会会重新采集,看是否还是热点频道,如果是就会再加一个小时
·如果组播出现断流,multicast会告知iam,iam显示组播异常,当码流恢复的时候还是上报给iam的
1
2
3
4
5
缩略图:
1、内容通过下推或者从源站下拉的方式到缩略图节点
2、终端请求是从缩略图的slb的请求的不是rr
3、我们这边可以配置一个分片时间:如10s一个图片,我们这边会有个t和rt,t是理论时间,rt是实际时间
4、终端可以根据rt来定位到准确的视频位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
http和tcp的区别:
1、TCP协议对应于传输层,而HTTP协议对应于应用层
2、从本质上来说,二者没有可比性。
3、Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Htt建立起一个TCP连

1、TCP连接
接需要经过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连 接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写 了,就是服务器和客户端交互,最终确定断开)p连接是一种短连接,是一种无状态的连接。


通俗描述3次握手就是
1、A对B说:我的序号是x,我要向你请求连接;(第一次握手,发送SYN包,然后进入SYN-SEND状态)
2、B听到之后对A说:我的序号是y,期待你下一句序号是x+1的话(意思就是收到了序号为x的话,即ack=x+1),同意建立连接。(第3、二次握手,发送ACK-SYN包,然后进入SYN-RCVD状态)
4、A听到B说同意建立连接之后,对A说:与确认你同意与我连接(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已进入ESTABLISHED状态)
5、B听到A的确认之后,也进入ESTABLISHED状态。

描述四次挥手就是:
1、A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(seq=u,FIN=1)。(第一次挥手,A进入FIN-WAIT-1
2、B收到A的消息后说:确认,你要关闭连接了。(seq=v,ack=u+1,ACK=1)(第二次挥手,B进入CLOSE-WAIT)
3、A收到B的确认后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2
4、B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次挥手)
5、A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,然后A进入CLOSED)
6、B收到A的确认后,也进入CLOSED。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
负载均衡:
IP负载均衡
网络地址转换(NAT)负载均衡工作在传输层,对数据包中的IP地址和端口进行修改,从而达到转发的目的,称为四层负载均衡。
NAT服务器(前端服务器)必须作为实际服务器(后端服务器)的网关,否则数据包被转发后将一去不返。

能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可能体现在硬件配置、网络带宽的差异,也可能因为某台服务器身兼多职,我们所说的“均衡”,也就是希望所有服务器都不要过载,并且能够最大程序地发挥作用。

一、http重定向
当http代理(比如浏览器)向web服务器请求某个URL后,web服务器可以通过http响应头信息中的Location标记来返回一个新的URL。这意味着HTTP代理需要继续请求这个新的URL,完成自动跳转。

性能缺陷:
1、吞吐率限制
主站点服务器的吞吐率平均分配到了被转移的服务器。现假设使用RR(Round Robin)调度策略,子服务器的最大吞吐率为1000reqs/s,那么主服务器的吞吐率要达到3000reqs/s才能完全发挥三台子服务器的作用,那么如果有100台子服务器,那么主服务器的吞吐率可想而知得有大?相反,如果主服务的最大吞吐率为6000reqs/s,那么平均分配到子服务器的吞吐率为2000reqs/s,而现子服务器的最大吞吐率为1000reqs/s,因此就得增加子服务器的数量,增加到6个才能满足。

2、重定向访问深度不同
有的重定向一个静态页面,有的重定向相比复杂的动态页面,那么实际服务器的负载差异是不可预料的,而主站服务器却一无所知。因此整站使用重定向方法做负载均衡不太好。
我们需要权衡转移请求的开销和处理实际请求的开销,前者相对于后者越小,那么重定向的意义就越大,例如下载。你可以去很多镜像下载网站试下,会发现基本下载都使用了Location做了重定向。

扩容频道怎么办:频道需要重建,multicast会自动重新哈希

dfs看下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
测试策略:
1、测试策略描述了软件开发过程中进行测试方法,用来告诉测试过程中所有可能的参与者,测试活动应该如何进行。
2、其中主要会包括测试目标,测试新功能的方法,测试项目的时间和资源,以及测试环境等等。
3、除此以外,测试策略应该描述测试过程中存在哪些风险,以及如何能够规避或者降低这些风险。
4、同时,测试策略也会提到测试的级别,哪些测试应该被执行,入口出口条件是什么。

创建测试策略时候我们可以参考各种需求文档和设计文档。
一般来说,测试策略在结构上可以包括以下一些要点:
1)测试级别:常见的测试级别有单元测试,集成测试和系统测试。大部分的测试组织里面,单元测试由开发负责,而集成测试和系统测试由测试部门或者质量保证部门负责。
2)角色与职责:需要在测试策略里面明确定义各个角色,以及该角色的职责。比如项目经理,测试组长,测试工程师…
3)环境需求:这一点非常重要,它将描述测试时需要的系统环境,包括软硬件以及网络环境等等。在澄清环境需求的时候,测试组织可以识别出资源方面的风险。
4)风险分析:影响测试过程的风险都应该尽早被识别出来,而且必须有相应的解决办法以便消除或者减轻这些风险。
5)测试进度:测试进度将会评估完成测试所需要的时间。在设定进度的时候,首先需要明确测试范围,然后根据测试资源的多少来制定能被各方面认可的测试进度计划。做一个非常准确的进度计划是困难的事情,因为测试过程中充满了各种不确定性,所以一般计划者需要考虑增加一定的buffer。当然,制定进度计划的时候可以参考已有的项目的数据。如果是一个全新的软件项目,专家认为将初始计划的时间翻倍比较靠谱!
6)回归测试方法:回归测试用来保证之前fix bug的代码不会影响软件的其他部分,这样需要我们选择已经执行过的测试用例重新运行。测试人员需要找到一个方法来确定哪些测试用例应该在回归测试中运行,用例不能太多,因为资源有限,用例也不能太少,否则会达不到必须的测试强度。不过,如果测试部门对待测系统以及软件架构非常了解的话,就比较容易找到合适的回归测试集合。
7)测试范围:这个没啥好说的,就是你要测试的内容,可能是某些模块,可能是某些指标,比如功能,性能,易用性…
8)测试优先级:测试范围内的东西不会都是一样重要的,加上测试资源各种有限,所以为测试排定优先级是十分的必要。


1)根据动态测试在软件开发过程中所处的阶段和作用分为
-单元测试
-集成测试
-系统测试
-验收测试(Alpha、Beta、用户验收、运营验收、功能验收)
-回归测试

2)从是否关心软件内部结构和具体实现的角度划分  
-白盒测试
-黑盒测试
-灰盒测试
黑盒测试分为功能测试和性能测试:
-功能测试(function testing),是黑盒测试的一方面,它检查实际软件的功能是否符合用户的需求。
包括逻辑功能测试(logic function testing)
界面测试(UI testing)UI=User Interface
易用性测试(usability testing):是指从软件使用的合理性和方便性等角度对软件系统进行检查,来发现软件中不方便用户使用的地方。
兼容性测试(compatibility testing):包括硬件兼容性测试和软件兼容性测试

-性能测试(performance testing)软件的性能主要有时间性能和空间性能两种
时间性能:主要指软件的一个具体事务的响应时间(respond time)。
空间性能:主要指软件运行时所消耗的系统资源。

软件性能测试分为:
一般性能测试:指的是让被测系统在正常的软硬件环境下运行,不向其施加任何压力的性能测试。
稳定性测试也叫可靠性测试(reliability testing):是指连续运行被测系统检查系统运行时的稳定程度。
负载测试(load testing):是指让被测系统在其能忍受的压力的极限范围之内连续运行,来测试系统的稳定性。
压力测试(stress testing):是指持续不断的给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。

-其他测试类型:
回归测试(regression testing)是指对软件的新的版本测试时,重复执行上一个版本测试时的用例。
冒烟测试(smoke testing),是指在对一个新版本进行大规模的测试之前,先验证一下软件的基本功能是否实现,是否具备可测性。
随机测试(random testing),是指测试中所有的输入数据都是随机生成的,其目的是模拟用户的真实操作,并发现一些边缘性的错误。
1
linux基础:
1
sql基础:

001-shell脚本

mkdir_path.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/bash
#set information of source IAS and local IAS
#source_root=/mnt/zxdfs/ottcache/vod/
local_root=/mnt/zxdfs/ottcache/vod/
#china mobile cp is 000000000000
cp=cellc

start_time=18
end_time=23

#set log path
log_path=`pwd`
Mkdir_log="log_path/logs/mkdir_$1.log"

function Mkdir path ()
{
#judge whether file exist or not
if [ ! -f "1" ]; then
echo "ContentId file not exists"
exit
fi

if [ ! -d "$log_path/logs" ]; then
mkdir -p $log_path/logs

#read file by lines
cat $1 | while read line; do
#start copy in free time
while ((1));do
hour=`date "+%H"`
if [ $hour -gt $start_time -a $hour -lt $end_time ];then
echo "$1" copy wait.......now is busy time">>$Mkdir_log
sleep 60
else
cid=$line
md5=`echo -n "$cid" | md5sum`
dir1=${md5:29:2}
dir2=${md5:31:1}
md5_cid=${md5:0:32}
Local_Path=${local_root}${cp}/$(dir2)/${dir1}/

if [ ! -d "$Local_Path" ]; then
#directory doesn't exist and make it
mkdir -p "$Local_path"
fi

#judge whether mkdir successful
if [ -d "$Local_Path" ];then
echo "$cid mkdir success ====== path:$Local_Path" >> $Mkdir_log
else
echo "$cid mkdir failed" >> $Mkdir_log
fi
sleep 1
break
fi
done
done
echo "$1 mkdir over ....." >> $Mkdir_log
}

Mkdir_path $1
exit

split.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/shif [ ! -f "$1" ];then    echo "$1 not exit..please check"    exitelse    echo "start to split $1"    split -l $2 $1 $1echo "split success"fiexit    



#!/bin/bash
#!/usr/bin/expect -f

#set information of source IAS and loacal IAS
source_root=/mnt/zxdfs/ottcache/vod/
local_root=/mnt/zxdfs/ottcache/vod/
#china mobile cp is 000000
cp=cellc

IP=80.80.30.73
Usename=root
password=ZTE@uss400
limit_rate=100000
start_time=18
end_time=23
function Copy_files ()
{
#judge whether file exist or not
if [ ! -f "$1" ];then
echo "ContentId file not exists"
exit
fi
#set log path
log_path=`pwd`
mkdir -p $log_path/logs
Copy_log="$log_path/logs/copy_$1.log"
#read file by lines
cat $1 | while read line;do
#start copy in free time
while ((1));do
hour=`date "+%H"`
if [ $hour -gt $start_time -a $hour -lt $end_time ];
echo "$1 copy wait.....now is busy time" >>$Copy_log
sleep 60
else
cid=$line
md5=`echo -n "$cid" | md5sum`
dir1=${md5:29:2}
dir2=${md5:31:1}
md5_cid=${md5:0:32}
#get content path
Source_path=${source_root}${cp}/${dir2}/${dir1}/${md5_cid}
Local_path=${local_root}${cp}/${dir2}/${dir1}
#if [ -d $Local_path ];then
#this cid is a hls file
source_file=$Source_path
local_file=${local_root}${cp}/${dir2}/${dir1}/${md5_cid}
#else
#this cid is a hpd file
#source_file=${Source_path}.hpd
#local_file=${local_root}${cp}/${dir2}/${dir1}/${md5_cid}
#fi

if [ ! -d $Local_path ];then
#directory doesn't exist and make it
mkdir -p "$Local_path"
fi
#start copy
echo "start copy files....."
./expect.sh $username $IP $source_file $Local_path $password $limit_rate
#judge whether copy successful
if [ -d "$local_file" -o -f "$local_file" ];then
echo "$cid copy success========== path:$Local_path${md5_cid}" >>$copy_log
else
echo "$cid copy failed" >>$copy_log
fi
sleep 1
break
fi
done
done
echo "$1 copy over.....">>$copy_log
}
Copy_files $1
exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
连接给100台虚机登录,在/目录下创建new文件夹

shell脚本通过expect脚本实现自动输入密码(使用expect)

背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现

一.在shell脚本中嵌入expect来实现密码输入
expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send)
1.安装expect
需要先安装tcl:apt-get install tcl
apt-get install expect

2.expect使用
2.1一个简单的输入密码操作
#!/usr/bin/expect
set timeout 100
set password "123456"
spawn sudo rm -rf zzlogic
expect "root123456"
send "$password\n"
interact
说明:
第一行#!/usr/bin/expect表示使用expect的shell交互模式
set是对变量password赋值
set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10
spawn在expect下执行shell脚本
expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段
send:如果expect监测到了包含的字符串,将输入send中的内容,\n相当于回车
interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端

2.2expect的命令行参数
[lindex $argv n]获得index为n的参数(index从0开始计算)
$argc为命令行参数的个数
[lrange $argv 0 0]表示第一个参数
[lrange $argv 0 3]表示第1到第3个参数

例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数
set option [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)

2.3if...elif...else...
expect支持if语句,
if {条件1} {
条件1执行语句
} elif {条件2} {
条件2执行语句
} else {
其他情况执行语句
}
说明:
1.if的条件用{}来包含条件
2.if和后面的{}必须有空格隔开
3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
3.使用{来衔接下一行,所以if的条件后需要加左花括号{
4.else不能单独放一行,所以else要跟在}后面

626983-20160116000226866-646781972

2.4 expect {},多行期望,匹配到哪条执行哪条背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。

3.shell中调用expect来实现登录我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。可以见我下图调用的一个例子

626983-20160116000235772-556419781

明:经过这次尝试些expect,给我的感觉是expect对格式的要求比较高,比如花括号之间必须有空格啊之类的,所以如果有报错,大家可以仔细观察一下是不是语法格式错误了。

二.在远程服务器上配置ssh信任这个我暂时没有试,网上有很多教程,感觉长期的话应该比写expect方便,但是我觉得写脚本的话还是最好不要总去操作其他地方,所以这里我就用expect自己来写的(当然也是想练习一下写expect)

002-测试流程

Image

Image

Image

003-遇到的面试问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
苏宁面试:
1、http和tcp的区别
2、为什么离职

苏宁外包:
1、多表联查
2、monkey
3、冒烟测试(smoke testing):是指在对一个新版本进行大规模的测试之前,先验证一下软件的基本功能是否实现,是否具备可测性。

中软面试:
1、测试策略
2、脚本,写了哪些脚本举例
3、具体怎么测试
4、为什么离职

切片器、jitp、组播普及

1
2
3
4
5
6
7
8
9
10
11
12
13
14
切片器是基于nginx做的,nginx做了一个module(就是嵌入了一个我们开发的模块),其实就是一个大文件range请求,range成小文件,就等于说切成了大小一样的ts,大文件计算好请求多少个range然后带range去请求服务器大文件保存成小文件

ts转成mp4是ffmpeg开源模块做的

mp4转成ts和dash,是jitp做的,jitp就是一个vod-module模块做的,也是开源的

nginx一般获取静态文件也就是本地就有的文件,高并发远优于tomcat,一般作为前台门户用;因内是触发式服务,处理请求只是取决于内存大小,高并发可以支持上百万级别的并发服务;
tomat可以动态生成文件并提供服务,一般作为后台使用,它是顺序处理方式的处理方式,一个个的处理,索引并不支持高并发,十几万的样子

tomcat录制就是解决动态生成文件问题,你想下,时移跟回看m3u8都是根据时间动态生成

nginx作为门户提供本地文件,缓存功能可以快速服务

http走公网,需要大量服务器;组播走专网,一条线就可以了,省钱,但丢包严重,组播只管发,爱收你就加入组播组;

IAMMGR热点组播播功能、及组播N+1功能的大致业务流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
标题:于哥--- IAMMGR热点组播播功能、及组播N+1功能的大致业务流程
以下为IAMCR热点组播功能、及组播N+1功能的大致业务流程说明,作为测试参考,内部细节以实际测试为准。
一、Live Multicast N+1功能说明:
主要功能:
组播设备心跳监测、
组播设备切换及恢复(正常转异常、超时异常、状态防抖、异常恢复正常、MAER全清接口)
MABR单播频道哈希迁移、
子码率组播计划自动重建(组播IP及端口按地址段自动分配)、
异常恢复在指定时间段内回迁、
WEB频道手动哈希创建。

大致业务流程:
1. IAMWEBR页面资源树增删改 Livemulticastl设备,触发 IAMREST设备列表自动同步v_livemulticast
2. IAMRES定时向U2M设备发送心跳请求,U2M设备返回心跳响应(含设备状态 statel以及自身频道表的记录数mabrnum)
IAMRES收到心跳响应后,更新 IAMRES内存中的设备状态,同时更新数据库中的设备状态state:0-异常,1-正常。
t_ottheartstate
3. IAMRES根据组擂设备心跳采集情况,判断组播设备是否发生状态切换(正常转异常、状态抖动、异常转正常、设备扩容)。
当正常设备转为异常设备时,更新内存中的设备状态及哈希设备列表,生成N+1哈希计划t_ otthashtask。

当异常设备转为正常设备时,如果心跳响应中的频道记录数不为0,则 IAMRES首先触发待恢复设备的频道全清 t_mabrclntask。
待该组播设备返回的心跳响应状态正常且頻道记录数为0后,IAMRES再将其设备状态切换为正常,更新内存中的设备状态及哈希设备列表,生成N+1哈希计划
t_otthashtask
4.IAMRES定时扫描哈希计划,发送哈希计划请求给IAMTV,同时将异常设备的组播地址记录在禁用列表中 t_mabrforbid
5. IAMTV收到哈希计划请求,生成全量单擂频道的哈希任务 t_hashmabrtask。
IAMTV扫描单播频道哈希任务下发给工 IAMRES, IAMRES调用哈希算出接口计算出目标设备ID并返回给 IAMTV





6.IATv根据频道哈希结果,剔除不需要重建的频道,只生成需要迁移的频道创建任务t_ mabrchantask。
同时记录需要迁移的组播计划t_hashcastplan\t_hashcastinfo(只迁移待组播的和组播中的)
7.IAMTV定时扫描频道创建任务t_mabrchantask,下发给IASI。由IAMSI将频道创建请求下发给u2m设备。
U2M设备返回频道创建结果及频道子码率列表。

8.IAMTV根据频道创建结果 t_mabrchannel\t_chanbitrate,来生成对应子码率的组播计划重建任务t_multicastplan(组播地址及端口重新获取)。
如果频道为迁出,则同时对已迁出频道的U2M设备下发对应channelid的频道删除任务t_marchantask
9.IAMT描组播计划t_ multicast1an,经IAMSI下发组播计划设置任务给U2M设备,U2M设备返回组播计划设置任务响应。
10.U2M设备向IAMSI上报组播启动结果及停止结果。
IAMTV安照组播启停结果及时更新组擂MAP列表t_multicastlist,由IAMNI向IAMWEB发送频道列表变更通知。
IAMWEB将MABR频道数据同步给RR设备及U2M设备。
MAP列表同步记录可在WEB页面-->场景化配置向导-->配置下发查询页面中进行查询

11.IAMTV将MABR迁移失败的单播频道和组播计刘记录在t_iamalarm

12.总结
N+1功能全流程主要IAM表:
v_livemulticast==>t_ottearstate==>t_otthashtask==>t_hashmabrtask(t_mabrforbid)==>t_mabrchantask(t_hashcastplan\t_hashcastinfo)==>t_mabrchanel
(t_chanbitrate\t_iamalarm)==>t_multicastplan(multicastinfo\t_iamalarm)==>t_multicastlistm=>结束

N+1功能全流程主更IAM日志:
心跳及哈希倒换流程:zxtool send 226 65535;tail -f iamres.iam.log|grep -E "HashSwith";
频道及组播计划下发:tail -f si.iam.log;
组播MAP列表同步通知:tail -f iamni.iam.log;

二、LiveMulticast MABR热点码率组播功能说明:
主要功能:
频道热点码率采集。
热点组播计划生成。
组播地址及端口自动分配

大致业务流程:
1.IAMWEB页面创建MABR单播频道t_mabrchannel(t_chanbitrate)。
U2M设备在频道创建成功时,向IAMSI上报频道子码率列表。
IAMSI按照频道子码率bandwidth进行排序,生成子码率序号bandid,入库。
IAMWEB在频道MAP列表同步时,将子码率号bandid、子码率区间bandmin、bandmax,同步给RR设备和U2M设备。

2.用户请求单播频道,Agent将频道子码率bandwidth的在线用户数通过心跳接口上报RR。

3、RR将各频道子码率的在线用户数,按照在在码率序号bandid(子码率区间bandmin、bandmax)作累加、统计。

4、IAMCACHE定时向RR设备发起热点频道数据采集请求(默认5分钟采集一次,WEB页面进行配置修改)。

5、RR将热点频道子码率数据返回给IAMCACHE。

6、IAMCACHE将热点频道子码率列表入库t_mabrhotchan。

7.IAM定时处理热点频道数据t_mabrhotchan,按照子码率序号 bandid,生成对应应子码率bandwidth的热点组播计划t_multicastplan(t_ multicastfo)
默认每2分钟定时处理一次,通过 Crontab定时任务进行修改。
(1)热点组播地址及端口按照MABR组播地址段 t_mabrippool自动分配(跳过禁用组播IP),热点组播计划时长默认1个小时,页面可配。
组播地址获取规则:
按IP段最大优先的顺序,遍历IP地址段,获取IP
若IP可用不冲突,则循环遍历使用IP,对端口仅作自动加1。
若IP不足,则遍历端口寻找可用的ip:port,如果ip:port不足,则返回失败。
(2)IAM时按照时间半衰减的规则,在生成热点组播计划时校验是否存在对应时间段的冲突的组播计划:如果60分钟内存在冲突的组播计划,则校验30分钟内是否存在冲突,否则校验15分钟内是否存在冲突,如果依旧冲突则认为组播计划已存在,不生成热点组播
如果存在冲突的组播计划,则检查冲突的组播计划是否即将结束,如即将结束则自动修改组播计划,延长其组播时间。
如果不存在时间冲突的组播计划,则生成新的热点组播计划。
(3)对于DASH热点组播和MSS热点组播,会首先生成音频组播循环计划,再生成对应热点码率的视频组播单次计划。音频组播计划按频道唯一。
对于HLS热点组播,直接生成对应热点码率的视频组播单次计划。
8.IAMTV时扫描组播计划t_ multicastplan,经IAMSI下组描计划设置任务,U2M设备返回组播计划设置任务响应。
9.U2M设备向 IAMSI上报组播启动结果及停止结果。
IAMTV按照组播启停结果及时更新组播MAP列表 t_multicastlist,由IAMNII向 IAMWEB发送频道列表变更通知。
IAMWEB将MABR频道数据同步给RR设备及U2M备。
MAP列表同步记录可在WB页面->场景化配置向导一配置下发查询页面中进行查询

10.总结
热点组播功能全流程主要IAM表:
t_mabrhotchan=(t_multicastplan(t_multicastinfo\t_mabrippool\t_chanbitrate)==>t_multicastlist==>结束
热点组播功能全流程主要IAM日志:
MABR热点码率采集: zxtool send 242 65535;tall -f cache.iam.log| grep -E“Hotchan";
频道及组播计划下发:tail -fS1.1am,1og
组播AP列表同步通知:tai1-f1amn1.iam.1og
赞赏一下吧~