流媒体技术服务器常用部署方式

流媒体网站的服务器主要分为两个部分:流服务 与 web服务。

流服务器使用常crtmpserver作为原型,为主播提供推流服务,为用户提供拉流服务。流服务分为源管理节点(SM),源节点(SP)以及边缘节点(EP)。三种类型的节点为层级关系。

一般主播通过dns获取源节点的ip,向源服务器推流。源服务器收到主播流之后,向源管理上报该主播的流信息(每个主播有唯一的id号)。用户从边缘节点拉流,边缘节点向所设定的唯一上级源服务器拉取某个流编号的数据。源节点通过与源管理节点通信之后,确定该流id的来源,源节点取得主播推流的源服务器ip后,直接与该源节点通信,拉取流。

每个边缘节点如上所述,有一个固定的上游源节点。源节点之间是互相拉取的关系。

二、crtmpserver的通讯结构

三、crtmpserver的部署及启动方式

1、部署

目前使用rsync源作为程序包管理服务器。crtmpserver 目录结构目前为

|– etc
|   `– crtmpserver.lua.sample
|– lib
|   `– crtmpserver
|       |– applications
|       |   |– SourceManagerClient
|       |   |   `– libSourceManagerClient.so
|       |   |– SourceManagerServer
|       |   |   `– libSourceManagerServer.so
|       |   |– admin
|       |   |   `– libadmin.so
|       |   |– applestreamingclient
|       |   |   `– libapplestreamingclient.so
|       |   |– appselector
|       |   |   `– libappselector.so
|       |   |– flvplayback
|       |   |   `– libflvplayback.so
|       |   |– proxypublish
|       |   |   `– libproxypublish.so
|       |   |– samplefactory
|       |   |   `– libsamplefactory.so
|       |   |– stresstest
|       |   |   `– libstresstest.so
|       |   `– vptests
|       |       `– libvptests.so
|       |– libcommon.so
|       |– liblua.so
|       |– libthelib.so
|       `– libtinyxml.so
|– man
|   `– man1
|       `– crtmpserver.1
|– sbin
|   `– crtmpserver
`– script
|– CRTMPServerEP.lua
|– CRTMPServerSM.lua
|– CRTMPServerSP.lua
|– checkcrtmpserver.sh
|– install.sh
|– restart.sh
|– start.sh
`– update.sh

2、 使用install.sh 进行安装

当然首先你得先获取install.sh,此脚本会调用start.sh 把进程配置起来。

a、安装SM: sh install.sh SM

b、安装SP:    sh install.sh SP $SM_ip (请替换为源管理的ip)

c、安装EP:    sh install.sh EP $SP_ip(请替换为指定的上级的ip,尽量使用同运营商资源)

3、 使用update.sh 进行版本更新

a、 sh update.sh (可以在线更新,因为程序运行时已经完全载入内存)

b、sh restart.sh (更新或者使用新的配置文件时需要重启服务器,此时所有的用户连接会直接关闭)

4、使用checkcrtmpserver.sh 进行自动拉起

a、 在update.sh 中有 nohup /bin/sh /usr/local/crtmpserver/script/checkcrtmpserver.sh > /usr/local/crtmpserver/script/checkcrtmp.log  2>&1 & 的命令进行自动拉起,检查间隔为5s,判断是否拉起的标准为进程个数是否为7个进程。(包括1个主进程和6个子进程)。

5、启动方式

sed -i ‘/crtmpserver/d’ /etc/ld.so.conf
echo “/usr/local/crtmpserver/lib/crtmpserver/” >> /etc/ld.so.conf
ldconfig

#以上为避免crtmpserver启动所依赖的库没有。

cd /usr/local/crtmpserver/lib/crtmpserver #一定要进到这个目录,然后用绝对路径把进程起起来。

/usr/local/crtmpserver/sbin/crtmpserver /usr/local/crtmpserver/etc/$conf

四、目前使用的节点情况以及监控注意事项

1、目前使用的节点共39台服务器,其中源节点5台,边缘节点34台。

2、监控时需要注意进程个数是否小于7,更倚重的是网络质量。

3、观众流接收数和流失败率是需要监控的两个指标,目前由网页上的客户端上报。

五、常见问题排查

1、主播播放不了

a、首先查看主播是dns到哪个源上,可以直接用(nslookup 流地址)或者 (ping 流地址)查看,如果解析错误,则反馈…

b、判断主播是否能够正常连接上源节点。(telnet 流地址:端口)与 (telnet 流地址:端口)尝试,如果不行,则检查是否是否被本机软件禁用

c、看是否360禁用掉端口,是则打开。

2、主播播放卡

a、主播网速测试,上传带宽必须到达40kB至少才能保持通畅。

b、tracert -d  流地址 看路由。

c、ping 流地址 看耗时

d、如果有mtr工具,则看是哪一跳丢包。

3、观众播放卡

原因同上。

4、进程异常,请在ps aux | grep crtmpserver  之后,直接restart进程,避免长时间不服务。

5、新节点启用之前请测试,必须加到token服务器的ip列表中才可以。

 

 

以上用到的install.sh脚本为:

#!/bin/sh
#rsync new version crtmp to folder
#choose sever type
#copy server type config to etc
#change ip & upstream ( just for ep )
#add new server ip to sm
#run update.sh for other install shell
#run start.sh to startup crtmpserver#rsync -avz --delete rsync://网址:端口/crtmpserver /usr/local/crtmpserver/
LOCALIP=`ip r | grep src| grep eth0 |awk '{print $NF}'`
if [ -d /data1 ];thendirpre=/data1
elif [ -d /data01 ];thendirpre=/data01
elsedirpre=/data1/
fi
LOGDIR=${dirpre}/crtmpserver/logs
MEDIADIR=${dirpre}/crtmpserver
install_crtmp(){rsync -avz --delete rsync://网址:端口/crtmpserver /usr/local/crtmpserver/mkdir -p ${LOGDIR}mkdir -p ${MEDIADIR}
}
install_SM(){mkdir -p ${LOGDIR}smlog/cd /usr/local/crtmpserver/etc/cp /usr/local/crtmpserver/script/CRTMPServerSM.lua .echo "modify the configure file~"#sh /usr/local/crtmpserver/script/start.sh
}
install_SP(){cd /usr/local/crtmpserver/etc/SOURCEMANAGERIP=$1cp /usr/local/crtmpserver/script/CRTMPServerSP.lua .sed "s/LOCALIP/${LOCALIP}/g" -i  /usr/local/crtmpserver/etc/CRTMPServerSP.luased "s/SOURCEMANAGERIP/${SOURCEMANAGERIP}/g" -i  /usr/local/crtmpserver/etc/CRTMPServerSP.luased "s/LOGDIR/${LOGDIR}/g" -i /usr/local/crtmpserver/etc/CRTMPServerSP.lua sed "s/MEDIRDIR/${MEDIADIR}/g" -i /usr/local/crtmpserver/etc/CRTMPServerSP.lua echo "add new crtmpserver to SM in IP地址";echo "/usr/local/crtmpserver/lib/crtmpserver/" >> /etc/ld.so.confldconfigrm /usr/local/crtmpserver/etc/crtmpserver.lua.samplesh /usr/local/crtmpserver/script/start.sh
}
install_EP(){cd /usr/local/crtmpserver/etc/cp /usr/local/crtmpserver/script/CRTMPServerEP.lua .SOURCEIP=$1sed "s/LOCALIP/${LOCALIP}/g" -i /usr/local/crtmpserver/etc/CRTMPServerEP.luased "s/SOURCEIP/${SOURCEIP}/g" -i /usr/local/crtmpserver/etc/CRTMPServerEP.lua sed -e "s#LOGDIR#${LOGDIR}#g" -i /usr/local/crtmpserver/etc/CRTMPServerEP.lua sed -e "s#MEDIADIR#${MEDIADIR}#g" -i /usr/local/crtmpserver/etc/CRTMPServerEP.lua echo "please add new crtmpserver to SM in IP地址";echo "/usr/local/crtmpserver/lib/crtmpserver/" >> /etc/ld.so.confldconfigrm /usr/local/crtmpserver/etc/crtmpserver.lua.samplesh /usr/local/crtmpserver/script/start.sh
}
install_CHECK(){/bin/sh /usr/local/crtmpserver/script/checkcrtmpserver.sh >> /usr/local/crtmpserver/script/checkcrtmp.log 2>&1 &
}
case $1 in SM ) echo "SM_INSTALL" install_crtmpinstall_SM;;SP ) echo "SP_INSTALL"install_crtmpinstall_SP $2install_CHECK;;EP ) echo "EP_INSTALL"install_crtmpinstall_EP $2install_CHECK;;* ) echo "CHOOSE A SERVER TYPE: SM/SP/EP" ;;
esac

 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注