姜 亮, 高瑜雄, 周子涵, 葉婉茹
(中國機(jī)械總院集團(tuán) 云南分院有限公司信息技術(shù)所, 云南 昆明 650000)
隨著科技的進(jìn)步工業(yè)互聯(lián)網(wǎng)平臺建立異構(gòu)的IT 軟硬件資源池,提供高效的資源調(diào)度和管理服務(wù)。為加快企業(yè)數(shù)字化進(jìn)程,并加快轉(zhuǎn)型,工業(yè)生產(chǎn)管理系統(tǒng)的建立和使用越來越重要,數(shù)字視頻、音頻、文檔文件以其直觀性、易于存儲、檢索和共享,是企業(yè)可視信息管理系統(tǒng)的重要組成部分。管理制造企業(yè)的海量數(shù)據(jù),解決企業(yè)文件散落在各部門、員工電腦、業(yè)務(wù)系統(tǒng)的問題。 制造業(yè)企業(yè)下設(shè)多個部門,涉及多個產(chǎn)品,該框架能以部門、產(chǎn)品為維度靈活建庫,分類存儲相關(guān)文件。 并和主流業(yè)務(wù)系統(tǒng)對接,各系統(tǒng)通過該框架存儲、調(diào)用文件,提供文件中臺服務(wù)。支持實時同步, 智能文件去重, 文件上傳增量同步等技術(shù)。 簡化文件上傳,節(jié)省流量和存儲空間,避免重復(fù)文件占用空間、耗費上傳流量。
1.1.1 Docker 容器技術(shù)
Docker 是基于Linux 內(nèi)核實現(xiàn)的,Docker 最早采用了LXC 技術(shù),LXC 是Linux 原生支持的容器技術(shù), 可以提供輕量級的虛擬化.Docker 基于LXC 發(fā)展, 提供了LXC 的高級封裝,標(biāo)準(zhǔn)的配置方法,在LXC 的基礎(chǔ)上,Docker 提供了一系列更強(qiáng)大的功能。
Docker 相比虛擬機(jī)的交付速度更快,資源消耗更低,Docker 采用客戶端/服務(wù)器端架構(gòu), 使用遠(yuǎn)程API 來管理和創(chuàng)建容器,其可以輕松的創(chuàng)建一個輕量級的,可移植的,自給自足的容器.Docker 的三大理念就是build,ship,run.Docker 通過namespace 和cgroup 來提供容器的資源隔離與安全保障等,所以Docker 容器在運行時,不需要類似虛擬機(jī)的額外資源開銷,因此可以大幅度提供資源利用率。
1.1.2 MinIO(對象存儲服務(wù))
MinIO 是一套基于Apache License V2.0 協(xié)議的輕量級、高性能開源對象存儲框架,適用于圖片、視頻、鏡像等海量非結(jié)構(gòu)化數(shù)據(jù)存儲。MinIO 采用Golang 實現(xiàn),客戶端支持Java、Python、JavaScript、Golang 語言,兼容亞馬遜S3云存儲服務(wù)接口,方便與其他應(yīng)用結(jié)合。
(1)存儲機(jī)制。 MinIO 使用糾刪碼(erasure code)和校驗和(checksum)來保護(hù)數(shù)據(jù)免受硬件故障和無聲數(shù)據(jù)損壞,可保證N/2 節(jié)點損壞的情況下數(shù)據(jù)的正常訪問。
(2)擴(kuò)展性。極簡性和擴(kuò)展性是MinIO 集群的兩個重要設(shè)計理念。 MinIO 支持對等擴(kuò)容和聯(lián)邦擴(kuò)容兩種擴(kuò)容方式。對等擴(kuò)容,即通過增加對等的集群節(jié)點和磁盤以擴(kuò)充集群,例如,原集群包含4 個節(jié)點4 塊磁盤,則擴(kuò)容時可同樣增加4 個節(jié)點4 個磁盤(或其倍數(shù)),以此保證系統(tǒng)可維持相同的數(shù)據(jù)冗余SLA,降低擴(kuò)展的復(fù)雜性。 聯(lián)邦擴(kuò)容,其基本原理是引入etcd 作為統(tǒng)一命名空間,將多個MinIO 集群組成一個聯(lián)邦,可在原有聯(lián)邦的基礎(chǔ)上,向聯(lián)邦中增加新集群,此擴(kuò)容方式理論可實現(xiàn)無限擴(kuò)展,且可以實現(xiàn)在原聯(lián)邦服務(wù)不中斷的情況下擴(kuò)容。
(3)對外服務(wù)。 MinIO 完全兼容S3 標(biāo)準(zhǔn)接口,客戶端和服務(wù)端之間通過http/https 進(jìn)行通信。 MinIO 提供客戶端mc(MinIO Client)以支持UNIX 命令,同時支持多語言的客戶端SDK。 此外,其存儲后端除使用磁盤外,還可通過網(wǎng)關(guān)對接其他存儲系統(tǒng)與資源。
1.1.3 Nginx
Nginx(發(fā)音同engine x)是一款輕量級的Web 服務(wù)器/ 反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個BSD-like 協(xié)議下發(fā)行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris, 以及Microsoft Windows 等操作系統(tǒng)中運行。反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet 上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器, 并將從服務(wù)器上得到的結(jié)果返回給internet 上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。 由于我們這里是用Docker 啟動的Nginx,所以我們只需要關(guān)注Nginx 內(nèi)部配置文件即可。
1.1.4 nginx-vod-module 點播模塊
nginx-vod-module 模塊是基于nginx 來提供VOD(video on demand)服務(wù)的第三方模塊,它支持基于DASH、HDS、HLS、MSS 的點播服務(wù)搭建。 點播(VOD,video on demand)即根據(jù)用戶需求播放,音視頻內(nèi)容一般已經(jīng)存放在服務(wù)器上了,不同于先下載再播放,點播要求即點即播。
(1)映射響應(yīng)格式。 當(dāng)配置為在映射模式下運行時,nginx-vod-module 向配置的上游服務(wù)器發(fā)出HTTP 請求,以便接收它應(yīng)該生成的媒體流的布局。 響應(yīng)必須采用JSON 格式。
(2)文件名。 basename+擴(kuò)展名-選項集是打包者特定的(下面的列表適用于默認(rèn)設(shè)置):seqparams-可用于通過id(在映射JSON 中提供)來選擇特定序列,例如mastersseq1.m3u8。fileparams-可用于在使用多個URL 時按索引選擇特定序列。 例如,manifest-f1.mpd 將僅從第一個URL返回一個MPD。 trackparams-可用于選擇特定的音頻/視頻軌道。 例如,manifest-a1.f4m 將返回僅包含每個序列的第一個音頻流的F4M。 默認(rèn)是包含每個文件的第一個音頻和第一個視頻軌道。在文件名中選擇的曲目與使用/tracks/path 參數(shù)選擇的曲目進(jìn)行AND 運算。v0 / a0 分別選擇所有視頻/音頻軌道。
大學(xué)生498人,其中女生342人,男生149人,7人未報告性別;平均年齡19.72歲(標(biāo)準(zhǔn)差為1.78)。
(3)HLS 流媒體協(xié)議。 HLS(HTTP Live Streaming)自適應(yīng)碼率流媒體傳輸協(xié)議,來自Apple 公司,該協(xié)議基于Http 協(xié)議,HLS 誕生之初旨在能夠從iPhone 中刪除flash,如今已成為使用最廣泛的協(xié)議。 HLS 的優(yōu)缺點也比較明顯。Html5 能夠直接支持HLS,有瀏覽器就能播放,不需要安裝額外的app, 不用考慮防火墻或者代理問題;HLS 也支持最新的H.265 編解碼器,H.265 編碼的質(zhì)量要比H.264 高很多。 因為HLS 基本是采用了點播切片的方式實現(xiàn)的直播, 在直播上相對于其它協(xié)議有較高的延遲(5~8s 延遲)。
1.1.5 minio-client 客戶端
是minio 服務(wù)器的客戶端, 對ls,cat,cp,mirror,diff,find 等UNIX 命令提供了一種替代方案,它支持文件系統(tǒng)和兼容Amazon S3 的云存儲服務(wù) (AWS Signature v2 和v4)。 并將minio-client 中的視頻目錄映射到點播服務(wù)的視頻目錄下面,將其他文件目錄映射到nginx 靜態(tài)文件訪問目錄下。
整體架構(gòu)圖如圖1 所示。 整體平臺采用服務(wù)端上傳(提供多語言minio SDK),點播服務(wù)支持hls、 thumb、dash等主流的流格式, 支持終端播放器根據(jù)網(wǎng)絡(luò)情況自動切換到最合適播放的分辨率。 自適應(yīng)碼流也是承載媒體加密、DRM、字幕、廣告等前沿功能的主流格式。 圖片文件、pdf 文件則采用靜態(tài)資源訪問方式。整個平臺具體容器列表如圖2 所示。
圖1 整體架構(gòu)圖
圖2 容器列表
文件存儲服務(wù)的核心為Minio 對象存儲系統(tǒng), 其具有文件上傳、下載、查詢和刪除等功能支撐,采用去中心化無共享架構(gòu)進(jìn)行分布式部署。 整個服務(wù)采用讀寫分離模式,文件上傳和刪除通過Minio java SDK 訪問Minio 對象存儲系統(tǒng)進(jìn)行文件的上傳和刪除。 下載文件則通過nginx 的靜態(tài)文件訪問方式, 中間通過minio-client 進(jìn)行文件實時同步。
nginx-vod-moduled 點播服務(wù)模塊具體實現(xiàn)步驟為:
(1)將minio 存儲服務(wù)添加到minio-client 的配置中。
(2)將minio 存儲的視頻文件同步到minio-client 的視頻目錄下供點播服務(wù)使用。
(3) 修改nginx-vod-moduled 中nginx.conf 的server加入以下hls、thumb、dash 的播放流配置。
(4)nginx 配置,創(chuàng)建一個video.xxx.xn.conf 配置文件,該文件用于編寫實現(xiàn)文件訪問功能server 模塊代碼,映射至nginx-vod-moduled 容器訪問點播服務(wù)。
Nginx 文件訪問模塊具體實現(xiàn)步驟為:
(1)將minio 存儲的圖片文件同步到minio-client 的圖片目錄下供nginx 靜態(tài)文件訪問使用。
(2)將minio 存儲的pdf 文件同步到minio-client 的pdf目錄下供nginx 靜態(tài)文件訪問使用。
(3) nginx 配置。 創(chuàng)建一個file.xxx.xn.conf 配置文件,該文件用于編寫實現(xiàn)文件訪問功能server 模塊代碼。 映射至/file/data 目錄進(jìn)行靜態(tài)資源的訪問。
在Maven 項目中引入minio SDK 包。
采集服務(wù)接收到一個文件的完整數(shù)據(jù)后,調(diào)用Minio sdk 將文件保存至Minio 系統(tǒng)。
核心連接Minio 代碼如下:
核心上傳文件代碼如下:
前端是不能直接訪問服務(wù)器上面的文件的, 但是由于我們對文件目錄配置了Nginx 轉(zhuǎn)發(fā), 這樣就可以通過瀏覽器直接訪問了。
對于點播服務(wù)的使用, 由于我們搭建的點播服務(wù)支持HLS 協(xié)議,Html5 能夠直接支持HLS,有瀏覽器就能播放。 所以我們可以直接使用Html5 的播放器直接播放點播地址。
該基于MinIO 高性能對象存儲框架的視頻點播服務(wù)、文件服務(wù),并使用容器化部署。 解決了企業(yè)生產(chǎn)管理系統(tǒng)海量圖片、文檔文件、視頻大量存儲導(dǎo)致的系統(tǒng)擴(kuò)展差、資源利用率低的問題,MinIO 本身較為輕量,以及服務(wù)容器化能進(jìn)一步降低運維維護(hù)成本。 同時也為企業(yè)生產(chǎn)管理系統(tǒng)中海量數(shù)據(jù)管理提供了一定的參考價值。 在網(wǎng)絡(luò)上傳輸音、視頻等多媒體信息,主要有下載和流式傳輸兩種方案。下載的方式對于體積較大的音、視頻數(shù)據(jù)而言,在使用前下載整個媒體文件耗時很大;流媒體(streaming media) 傳輸提供了一種低延時的方式來避免這個問題,流媒體技術(shù)是指將多媒體數(shù)據(jù)壓縮后,經(jīng)過網(wǎng)絡(luò)分段發(fā)送,在網(wǎng)上即時傳輸音、視頻數(shù)據(jù)供用戶播放的一種技術(shù)。點播(VOD,video on demand)即根據(jù)用戶需求播放,音視頻內(nèi)容一般已經(jīng)存放在服務(wù)器上了, 不同于先下載再播放,點播要求即點即播,各大音視頻網(wǎng)站提供的服務(wù)就是VOD 服務(wù)。