彭方翔 廣東南方新媒體股份有限公司
從2017年起,以抖音、快手作為領頭羊的短視頻社交類手機應用引領著網絡視頻行業的發展;進入2018年,在經歷了20個版本迭代和半年近12倍的用戶增長之后,抖音的發展步入了一個新的階段,抖音實現了自增長[1];到了今年6月,抖音短視頻公布了今年上半年數據——日活超過1.5億,月活超過3億[2]。在網絡視頻業務快速發展的今天,在架構設計時就要充分考慮系統具有高模塊化、高可靠性和高可擴展性的能力。
非實時網絡視頻業務系統主要包括三個部分:流媒體服務系統、內容分發網絡和客戶端軟件。流媒體服務系統收集原始音視頻數據,對音視頻數據進行流化處理后輸出到內容分發網絡,由內容分發網絡完成對終端用戶的內容分發,讓用戶使用播放器觀看點播視頻。
1.常用的流媒體協議主要有基于HTTP 漸進下載的HLS流媒體協議和基于RTP實時流媒體的RTMP/RTSP協議。HLS是由蘋果公司開發的流媒體協議,與RTP不同,HLS不需要服務端來提供播放控制,目前在非實時網絡視頻業務中比較流行。
2.內容分發網絡,也叫CDN,負責接收客戶端發送的請求,通過全局和本地負載均衡系統調度請求到最接近的網絡節點上,將封裝的流媒體分片文件連同索引文件一起發送給客戶端。目前互聯網CDN服務的技術成熟、適配簡單,主流技術架構是:自有流媒體服務系統+租用互聯網CDN服務。
3.客戶端軟件負責確定應該請求的具體媒體流,下載索引文件和流媒體分片文件,并在下載后通過拼接分片將流媒體重新展現給用戶。客戶端軟件通常是播放器或者帶有播放器插件的應用或瀏覽器。
流媒體服務系統作為支撐網絡視頻業務的核心系統,其性能決定了網絡視頻業務服務質量。衡量流媒體服務系統,最關鍵的指標是流輸出能力和支持并發請求的數量。下面我們以單臺HLS流媒體服務器為例,分析系統的工作流程。
1.媒體文件注入過程
(1)從硬盤中分段讀取流媒體文件,存儲到內存中。
(2)CPU對內存中的流媒體文件進行解碼、重新編碼、切片、封裝、存儲、索引等流化處理。
(3)處理完的播放列表數據,放在內存;處理完的切片數據經過,從內存寫入硬盤。
2.響應訪問請求過程
(1)網絡Web容器收到訪問請求解包后將播放列表和切片數據請求發到相應模塊進行索引定位。
(2)播放列表直接從內存讀取;切片數據從硬盤讀取放入到內存。
(3)在Web容器對內存中的數據打包發送。
總結以上兩個過程,推流服務系統大量消耗的系統硬件資源主要是CPU、內存、磁盤I/O和存儲容量。
分布式架構主要面對高并發、高性能和高可用的應用場景,通過系統拆分成不同的子系統模塊,具有以下優點:(1)模塊間低耦合度,系統整體可靠性高;(2)各模塊利用率高、方便橫向擴展;(3)各模塊之間的邊界明確,有利于靈活部署和運維管理。
關于分布式系統,不同的業務需求面對的應用場景不一樣,使用的架構設計也不一樣。因此,針對網絡視頻業務大并發量的應用場景,結合流媒體服務系統功能對CPU處理能力、內存、磁盤I/O能力和磁盤容量的要求,選擇把系統分成三個服務節點:(1)負載均衡服務節點;(2)流媒體服務節點;(3)存儲節點。
平面4參數轉換屬于兩維坐標轉換,對于三維坐標,需將坐標通過高斯投影變換得到平面坐標再計算轉換參數[9]。
負載均衡節點主要解決大量用戶回源數據的請求分配到HLS服務節點的多臺服務器上。負載均衡分為四層和七層,四層負載均衡主要基于TCP協議,可以做任何基于TCP/IP協議的軟件的負載均衡;七層負載均衡,又叫反向代理,基于HTTP、RTMP協議實現web服務、圖片、視頻等靜態文件的訪問服務。從軟件層面實現負載均衡的主流工具 有Nginx(七 層)、Haproxy(四 層)和LVS(四層)等。
1. Nginx
Nginx作為一種高性能的Web和反向代理服務,Nginx以支持高并發連接、低資源消耗、部署運維簡單等優點而聞名。對于請求視頻內容這一類靜態服務,Nginx以多連接對應一個進程的異步非阻塞請求處理能夠支持更多的并發請求。Nginx還具有多種負載均衡算法實現不同的調度功能[3]。
2.虛擬路由冗余協議(VRRP)
負載均衡節點作為用戶訪問的第一節點,必須具備高可用性,這就需要在節點上部署多臺負載均衡服務器來集群。目前,較多使用VRRP來把幾臺路由設備聯合組成一臺虛擬的路由設備,保證當主機的下一跳設備出現故障時,可以及時再次選擇新路由器來接替業務,保持了內部網絡和外部網絡通訊的連續性和可靠性。
因為有了負載均衡節點,HLS服務節點在響應請求過程變得簡單了許多,只需要由Nginx來分配訪問請求即可。HLS服務節點的大部分硬件資源可以用來承擔媒體文件注入的任務。
通常,HLS服務節點上游的媒資管理平臺通過接口方式以FTP注入點播媒資數據、以UDP注入直播媒資數據。根據機械磁盤小文件讀寫性能非常低,所以通常選擇把m3u8文件放入內存,把TS文件放入磁盤。
流媒體服務系統中切片文件數據占了所有數據的95%以上。一套注入了10萬小時時長視頻的流媒體服務系統,切片文件的數據量就有幾百T。因此采用由“緩存節點+共享式存儲節點”的兩級存儲架構,能夠提高推流服務系統的整體效率和穩定性,便于節點擴容。
1.緩存節點
部署在負載均衡節點上的Nginx還有一個重要功能--緩存。Nginx能夠對客戶已經訪問過的內容在本地建立副本,這樣在一段時間內(該時間長度可配置)再次訪問該數據,就不用再次向HLS服務節點發出請求。同時,當后端服務器宕機時,Nginx服務器上的副本資源還能夠回應相關的用戶請求,在一定程度上提高了系統整體的魯棒性。
2.網絡附屬存儲(NAS)
NAS作為一種特殊的專用數據存儲服務器,包括可熱插拔存儲器件和內嵌文件讀取系統,能夠支持多種訪問協議,目前廣泛應用于各種信息系統中。通過把NAS掛載在HLS服務節點的服務器下,存儲所有注入媒資文件的切片文件,既滿足了大量數據的存儲要求,又具有良好的系統擴展能力。
本文從當前網絡視頻快速變化的業務場景出發,提出“負載均衡節點+HLS服務節點+存儲節點”的架構以建設高模塊化、高可靠性和高可擴展性的流媒體服務系統。圍繞該架構的實現,本文進行了解決方案的分析和選擇,討論了利用Ningx軟件同時實現把負載均衡節點和緩存節點、利用VRRP實現負載均衡主備、利用NAS提供大容量存儲等實現方法,提供了技術上的探索,具有重要意義。