石蕊,崔圣青
(1.北京浩瀚深度信息技術股份有限公司,北京 100142;2. 中國鐵路濟南局集團有限公司 濟南通信段,山東 濟南 250000)
在鐵路大數據時代,隨著攝像機部署數量和視頻圖像質量的不斷提高,以及反恐防控對鐵路視頻數據存儲時間延長到90 d的要求,使視頻存儲數據量激增。這些不斷增長的數據有90%以上都是不常訪問的數據,稱之為冷數據,如果采用磁帶庫或藍光光盤的離線方案進行存儲,數據回放的響應時間較長,不適用于鐵路視頻監控的應用場景。如果采用傳統的在線存儲系統,將在能源消耗、硬件購置成本及空間利用率等方面面臨很大挑戰。冷存儲同上述方案相比,具有顯著優勢,其低功耗及近似在線存儲的性能,可同時解決上述2種方案面臨的難題,大幅度降低總體擁有成本(TCO)。在實際應用中,不論是既有存儲擴容還是新建存儲系統,冷存儲均可以通過文件系統接口和監控平臺進行無縫對接,以最優的方式延長數據存儲時間。
通常將數據按照訪問頻率分為“冷”“溫”“熱”三大類,在鐵路綜合視頻監控系統(簡稱視頻監控系統)中,1周、1個月及1個季度以上的一些數據訪問次數較少,都屬于冷數據,具體時間界限可根據實際使用情況和投資量來定。
視頻監控系統由視頻節點(包括視頻核心節點、視頻區域節點、Ⅰ類視頻接入節點、Ⅱ類視頻接入節點)、視頻匯集點、視頻采集點、承載網絡和視頻終端(包括視頻管理終端、監視終端)組成(見圖1)。視頻監控系統接口包括 A、B、C、D、E、F、H、Na接口,其中A、B、H是視頻監控系統外部接口,C、D、E、F是視頻監控系統內部接口,Na是設備管理接口。冷儲存作為Ⅰ類視頻接入節點和Ⅱ類視頻接入節點存儲區的擴展,采用用戶空間文件系統(FUSE)/SMB接口接入到應用服務區中,與Q/CR 575—2017規范中接口要求相比,將原Ⅰ類視頻接入節點和Ⅱ類視頻接入節點E調整為E+FUSE/SMB[1-2]。
對于冷存儲技術,采用何種接口方式最大程度地簡化用戶操作,是解決問題的關鍵。目前的冷存儲系統,例如谷歌、微軟等云存儲采用對象存儲,這種存儲以數據對象為最小存儲單元,雖然其IO性能好,協議開銷小,但需要特定的應用程序編程接口(API)進行訪問,不便于用戶使用。而冷存儲采用的文件系統接口可使用戶方便地在該文件系統內進行各種文件操作,不需要復雜的編程開發。
冷存儲最顯著的特點就是存儲量大,可以支持水平擴展,因此必然是由多臺機器組成的分布式系統,而不可能是1臺單獨的機器。當服務器端是多臺機器時,客戶端在連接服務器時就需要進行選擇,在此采用一致性哈希算法來解決。當客戶端成功連接服務器可以對上層提供存儲服務后,上層軟件如何方便地使用冷存儲提供的存儲空間,則需要采用FUSE文件系統接口方案。
在傳統的存儲系統中,全部數據被集中存儲在單獨的存儲服務器,其最大的問題就是不容易擴展。當存儲空間需要增加時,需購買另外一臺更高容量的存儲設備替換之前的設備,造成很大的浪費和運維開銷。
冷存儲的特點之一就是針對大容量存儲而設計,不依賴于單機設備容量,而是由多個獨立的設備組成一個存儲集群,形成分布式存儲系統。這樣的分布式系統可支持水平擴展,隨時添加新的節點就能增加系統容量。而且多個設備之間可以進行負載均衡,每臺設備可達到的性能固然是有上限的,但多臺設備通過負載均衡就可在整體上達到更高的性能。多個設備組成的系統能有效地防止單臺設備崩潰造成的損失,使系統可靠性更高[3-4]。

圖1 視頻監控系統組成及其邏輯接口

圖2 冷存儲分布式系統結構
冷存儲分布式系統結構見圖2,右側是前置節點組成的服務器集群,左側是存儲節點組成的存儲集群,用戶的請求首先到達前置節點,然后通過前置節點把用戶數據分片,發送到左側存儲集群中不同節點中的多個硬盤進行數據存儲。雙集群結構是為了在前置服務器集群中進行數據分片計算糾刪碼等對性能要求比較高的操作,而在后端存儲節點僅進行數據讀寫等基本操作,因此可以大規模擴展后端存儲集群,支持更大的容量,而無需配置很多計算資源,從而達到最佳的性價比。這是在分布式存儲系統中一種針對冷數據場景的獨特優化方案,其他分布式存儲系統都是一個集群,每個獨立設備的性能要求都比較高,這樣雖然可以達到更高的性能,但成本也很高,并不適合大規模冷數據低成本存儲的要求。
在此研究的分布式存儲系統具有多個前置節點(見圖2右框部分),每個節點均可處理用戶的操作,為了實現負載均衡和失效備援,需要有一種機制來選擇正常的節點進行操作,這種機制還能夠處理節點失效、節點添加等問題,以保證整體服務正常運行。
通常方案采用集中式的信息共享方式,即采用單機服務器來保存集群中的節點狀態,例如集群中有多少臺設備是正??捎玫模颗_設備的負載情況如何等??蛻舳耸紫认蜻@臺狀態服務器發出申請,狀態服務器根據自己掌握的信息分配1臺具體的服務器給客戶端,客戶端再正式向這個分配的服務器發出業務請求。狀態服務器集中分配的方式存在2個主要問題:一是形成了單點故障,如果這臺狀態服務器崩潰,則整個系統不可用;二是影響性能,每次客戶端都需要建立一個連接申請分配服務器,這個過程增加了時間消耗、降低了性能。
為解決集中式分配方案的問題,冷存儲系統采用一致性哈希算法進行節點選擇,同時解決節點增刪帶來的數據平衡問題,消除了單點故障,降低了客戶端申請分配服務器的時間消耗。
2.2.1 哈希算法基本原理
一致性哈希(Hash)用一個圓環來劃分整個哈希值空間。假設存在一個值域為0~232-1的哈希函數(見圖3)。哈希值空間按順時針排序,0和232-1在同一點重合。隨后對各個需要加入集群的服務器使用哈希函數進行映射,可以通過服務器之間不同的標識作為哈希函數的輸入(如IP或主機名),然后進行映射,每臺服務器都能確定自己的位置且互不重合,假設存在4臺服務器,進行映射后的位置關系見圖4。
對數據和服務器進行算法設計,使兩者之間有良好的容錯性和可擴展性。對數據進行哈希函數的映射,計算出該數據對應哈希值在環上的位置,從該位置順時針遍歷,遇到的第1臺服務器就是該數據需要連接的服務器。

圖3 哈希值空間示意圖

圖4 服務器在哈希值空間上的映射位置
例如,存在Object A、Object B、Object C、Object D 4個數據對象,經過上述算法后,數據和服務器對應關系見圖5。由一致性哈希算法,數據A、B、C、D分別被對應到Node A、Node B、Node C、Node D上。
2.2.2 哈希算法容錯性分析

圖5 數據和服務器對應關系
假設Node D由于某種原因離開了集群,按照一致性哈希算法,數據A、B、C依然會找到原來的服務器,而數據D會重新在哈希環上進行尋找,最終會找到Node A。因此,1臺服務器的崩潰僅對此服務器到其環空間中前1臺服務器的數據產生影響,不會對其他數據產生影響。如果在存儲時把Object A在Node D和A上都保存一份,則在Node D被從哈希環上移除時,會由Node A上找到Object A,因此數據的可靠性得以大大提高。
如果在系統中增加1臺服務器Node X(見圖6),此時數據A、B、D對應的服務器不會變化,只有數據C會重新尋找,最終找到Node X。因此,1臺服務器的添加僅對此服務器到其環空間中前1臺服務器的數據產生影響,不會對其他數據產生影響。系統只需要把Object C拷貝一份放到Node X上,就完成了數據的重新分布。

圖6 添加服務器映射關系
在節點刪除和添加后,需要按照新的哈希環來對數據進行重新分布,稱為數據再平衡。從以上例子可知,使用一致性哈希算法,可以保證只有一小部分數據在節點的刪除或添加后受到影響,需要拷貝遷移的數據也會盡量少。因此采用一致性哈希算法,客戶端選擇節點更簡單,數據再平衡的速度也更快,系統的容錯性和可擴展性都能得到保證[5-7]。
文件系統是用來存儲計算機文件、目錄及其包含數據的方法,它使文件目錄和數據的搜索和訪問得以簡化。通用操作系統的重要組成部分就是文件系統。傳統上,操作系統在內核級別支持文件系統,FUSE則是實現在用戶態的文件系統框架。
例如,FUSE內核模塊的位置和Linux自帶的其他文件系統xfs、ext4等是在一個層次,但后續操作發生不同,xfs等文件系統還會持續在內核態進行操作直到硬盤,而FUSE則結束內核態,轉而進入用戶態(見圖7)。具體到冷存儲的客戶端開發,則都是與服務器端的網絡操作。

圖7 FUSE在Linux系統中的位置
將連接分布式集群的客戶端代碼寫在內核態還是用戶態,會帶來一系列的區別。首先,內核態的開發和調試都比較困難,在內核態出現的問題造成的影響也較大,經常造成死機等后果。其次,內核的版本繁多,如果每個內核版本都要編寫對應的存儲客戶端代碼也是一個繁復的任務,且容易出錯??紤]到冷存儲的應用場景,采用FUSE做用戶態的存儲客戶端開發,避開了高風險的內核開發和繁雜的版本支持,以簡單的方式快速實現,并具有較高的通用性[8-11]。
分布式集群、一致性哈希及FUSE文件系統必須協同工作,冷存儲系統接口工作流程見圖8。
視頻監控程序運行在一臺服務器上,該服務器相對于冷存儲集群來說就是存儲的客戶端,冷存儲集群是服務端,之間通過網絡連接。視頻監控程序會對多個視頻文件進行讀寫,這些文件邏輯上是在視頻監控的服務器上(通過FUSE接口提供的文件系統),但實際上是存儲在冷存儲集群上(通過一致性哈希選擇服務器,并傳輸給服務器端進行實際存儲),文件的寫入過程如下:
(1)視頻監控程序打開一個文件,寫入一些數據,該請求被操作系統發送給FUSE內核模塊。
(2)FUSE內核模塊將寫請求轉給FUSE用戶態程序,在此就是冷存儲集群的客戶端程序。
(3)FUSE用戶態程序中采用一致性哈希算法,用文件的全路徑作為哈希的參數,計算出1個哈希值,在哈希環上選擇1臺服務器進行連接。不同的文件會計算出不同的哈希值,也就會選擇不同的服務器去連接,即可實現負載均衡。

圖8 冷存儲系統接口工作流程
(4)數據通過網絡被發送到冷存儲集群的前置機上,開始在后端進行實際的存儲,然后返回結果給客戶端。
(5)FUSE用戶態程序收到返回后,發給FUSE內核模塊。
(6)FUSE內核模塊收到返回后,發給上層調用的視頻監控程序。視頻監控程序即可得知剛才的數據寫入是否成功,然后進行相應后續工作。
首先需要對FUSE文件系統和一致性哈希的基本功能進行測試,然后測試某款視頻監控軟件是否可以平滑遷移到該接口上,最后針對Windows客戶端進行測試。
測試方案見圖9。
(1)測試目標:冷存儲的文件系統與普通的文件系統是否相符,是否可通過一致性哈希達到失效備援。
(2)測試流程:①下載配置文件。在裝好FUSE的Linux服務器上,下載存儲系統提供的FUSE配置文件;②掛載。運行掛載命令,掛載后可以看到系統分區多了1個FUSE分區,該命令將存儲系統掛載到相應的目錄上,掛載后可以看到文件系統多了1個設定的分區,接下來用戶即可在該目錄進行正常的文件操作;③執行文件系統操作;④一致性哈希支持的失效備援。通過關閉其中1個計算節點,查看剛才的文件內容,向文件追加新內容,啟動此前被關閉的節點,再次查看文件內容是否有更新。

圖9 測試方案示意圖
(3)測試結果:每個命令后經過查看,文件內容均為預期輸出。
(4)測試結論:冷存儲的文件系統與普通的文件系統操作相符,可以通過一致性哈希達到失效備援。
(1)測試目標:冷存儲系統與鐵路局集團公司現有視頻監控系統進行對接,視頻監控軟件可以平滑切換到冷存儲系統上,視頻的錄制和回放正常。
(2)測試流程:①修改視頻服務的配置文件, 更改存儲的路徑配置,使其指向冷存儲FUSE客戶端的掛載點;②啟動視頻監控服務,視頻服務識別到FUSE文件系統后,從視頻服務的日志中可以看到,之后的分區即為掛載后產生的新分區;③檢查視頻錄制,確認所有攝像頭均正常寫入;④檢查視頻回放,通過視頻軟件可以看到攝像頭的回放視頻(見圖10)。當視頻回放出現“加載中”的情況時,說明其讀取到已經冷藏的數據,此時后臺先點亮硬盤,然后從數據庫中讀取文件的信息并從硬盤中進行讀取,最后將讀取完成的文件返回給視頻回放程序(見圖11)。
(3)測試結果:按照測試流程進行操作,可以看到正常的視頻錄制和回放。
(4)測試結論:在此研究的存儲系統提供FUSE文件系統接口,為目前大部分第三方服務提供了極大方便,一般無需修改其程序,即可方便快速地與存儲系統完成對接。
(1)測試目標:冷存儲系統的客戶端主要應用于Linux系統上,為了使Windows用戶也可使用存儲系統,其FUSE文件系統還可通過Samba服務進行網絡共享,將Linux的FUSE文件系統共享到Windows系統上。

圖10 視頻監控平臺回放界面

圖11 冷數據回放界面
(2)測試流程:①在Linux服務器進行FUSE掛載;②在Linux服務器進行Samba服務配置;③在Windows服務器進行遠程登錄,即可訪問FUSE文件系統(見圖12);④在Linux服務器的掛載目錄可查看到相關信息。

圖12 共享目錄查看
(3)測試結果:冷存儲系統的FUSE文件系統可以通過Samba共享給Windows使用。
(4)測試結論:冷存儲的文件系統可通過Samba共享給Windows使用,提高了冷存儲接口的適應性。
隨著鐵路大數據的高速發展,鐵路綜合視頻監控系統數據存儲成為新的熱點,海量的視頻數據如何存儲才能降低存儲成本和能源消耗、提升空間利用率,同時又能給用戶帶來便捷的操作體驗是解決方案的關鍵。在此探討的冷存儲系統可滿足上述需要,系統采用簡單通用的FUSE文件系統,通過一致性哈希實現負載均衡和失效備援,在應用中效果良好。