转自:http://blog.chinaunix.net/uid-26000296-id-4273867.html
一、简介
流媒体网站的服务器主要分为两个部分:流服务 与 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 ];then
dirpre=/data1
elif [ -d /data01 ];then
dirpre=/data01
else
dirpre=/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=$1
cp /usr/local/crtmpserver/script/CRTMPServerSP.lua .
sed "s/LOCALIP/${LOCALIP}/g" -i /usr/local/crtmpserver/etc/CRTMPServerSP.lua
sed "s/SOURCEMANAGERIP/${SOURCEMANAGERIP}/g" -i /usr/local/crtmpserver/etc/CRTMPServerSP.lua
sed "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.conf
ldconfig
rm /usr/local/crtmpserver/etc/crtmpserver.lua.sample
sh /usr/local/crtmpserver/script/start.sh
}
install_EP(){
cd /usr/local/crtmpserver/etc/
cp /usr/local/crtmpserver/script/CRTMPServerEP.lua .
SOURCEIP=$1
sed "s/LOCALIP/${LOCALIP}/g" -i /usr/local/crtmpserver/etc/CRTMPServerEP.lua
sed "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.conf
ldconfig
rm /usr/local/crtmpserver/etc/crtmpserver.lua.sample
sh /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_crtmp
install_SM
;;
SP )
echo "SP_INSTALL"
install_crtmp
install_SP $2
install_CHECK
;;
EP )
echo "EP_INSTALL"
install_crtmp
install_EP $2
install_CHECK
;;
* ) echo "CHOOSE A SERVER TYPE: SM/SP/EP" ;;
esac
原文链接:
http://blog.csdn.net/zongcai249/article/details/9342251