本項目爲車聯網監控系統,系統由車載硬件設備、雲服務端構成。車載硬件設備會定時採集車輛的各類狀態信息,並經過移動網絡上傳到服務器端。
服務器端接收到硬件設備發送的數據首先須要將數據進行解析,校驗,隨後會將該消息轉發到國家汽車監測平臺和地方汽車監測平臺,最後將解析後的明文數據和原始報文數據存儲到系統中。
車輛的數據和其餘數據須要經過web頁面或rest API接口進行查詢訪問。
要求半年內的數據查詢響應時間在毫秒級別內,超過半年的數據須要放到更加低成本的介質上,查詢延遲在3s之內,這些數據的查詢頻次比較低。
系統的主要參數有如下幾項:golang
系統的技術選型對初創公司來講相當重要,因此在設計系統的時候尤其當心。通過仔細分析,咱們要求新系統必須知足如下幾個條件:web
由於車輛的監控數據很是大,傳統關係型數據庫(如Mysql、pg等)已經沒法勝任存儲工做,因此咱們須要選用一種分佈式數據庫用於存儲車輛實時數據。
咱們在市場上可以找到分佈式數據庫有MongoDB和 HBase。 sql
通過對這幾種數據庫的分析,咱們最終選用HBase,其知足咱們前面提到的四個要求,並且還提供Phoenix插件用於SQL語句的查詢。數據庫
做爲初創公司,咱們的運維能力有限,咱們須要業務的快速落地。因此自建機房以及運維團隊意味着前期較大的投入以及高昂的運維成本,因此咱們決定使用雲方案。緩存
通過比較國內的各大雲廠商,咱們最終選用了阿里雲平臺,由於阿里雲提供SaaS化的HBase服務,同時阿里雲HBase支持很全面的多模式,支持冷數據存放在OSS之中,節約成本;
支持備份恢復等特性,作到了真正的native cloud的數據庫服務。
另外,HBase 在阿里內部部署超過12000臺機器,歷經7年天貓雙11的考驗,這些實際數據以及經驗加強了咱們對阿里雲HBase的技術信心,同時知足了咱們的技術和業務需求。服務器
系統採用層級架構以方便後期擴展和維護,如今主要分爲如下幾層:網絡
最終新能源監控系統的系統架構設計以下架構
圖中最左端爲監控的車輛,它會實時採集車輛的各項數據,並把採集到的數據經過移動互聯網發送到平臺。
平臺驗證完數據會將其寫入到Kafka消息隊列中。流式計算服務器從Kafka消息隊列中取出車輛的原始數據,並對車輛的數據進行解析、存儲、轉發等操做。
HBase集羣負責存儲車輛實時數據,MySQL負責存儲組織關係數據。同時,咱們還會將超過必定時間(好比半年前)的數據轉存到OSS存儲介質中,以便下降存儲成本。
Spark ML會對系統中的各項數據進行分析。終端用戶會從HBase中查詢一些數據。併發
團隊在使用HBase以前一直使用MySQL關係型數據庫,在系統設計之初並無考慮HBase的特性,而是按照關係型數據庫的設計原則設計。
通過一段時間的瞭解後才知道HBase主要使用Row key進行數據查詢。Row key的設計相當重要。
目前系統中設計的Row key以下app
雖然經過Row key的設計能夠解決部分數據查詢的需求,可是在面對複雜需求時難以經過Row key 直接索引到數據,若索引沒法命中,則只能進行大範圍或全表掃描纔可以定位數據。
因此咱們在使用HBase時儘可能避免複雜的查詢需求。但業務方面仍然會有部分較爲複雜的查詢需求。針對這些需求,咱們主要使用兩種方式來創建二級索引。
目前新能源監控系統中主要使用Phoenix實現二級索引,大大增長了數據的查詢使用場景。
雖然Phoenix可以經過二級索引實現較爲複雜的數據查詢,但對於更爲複雜的查詢與分析需求就顯得捉襟見肘。因此咱們選用了Spark等其餘數據分析組件對數據進行離線分析,分析後對結果經過接口提供給用戶。
團隊使用Python語言構建系統,但HBase使用Java語言編寫,原生提供了Java API,並未對Python語言提供直接的API。
咱們使用happybase鏈接HBase,由於它提供了更爲Pythonic的接口服務。另外咱們也是用QueryServer 做爲Python組件和Phoenix鏈接的紐帶。
系統中車輛數據分爲熱數據和冷數據,熱數據須要HBase中實時可查,冷數據雖不須要實時可查,但卻須要一直保存在磁盤中。
阿里雲HBase支持將冷數據直接存儲在OSS中,而這些數據的轉存只須要簡單的設置表相關屬性,操做很是簡單。將冷數據存儲在OSS之中大大減小了數據的存儲成本。
首先,本文介紹了新能源車輛監控系統的項目背景,隨後分析了本項目的項目難點,並介紹了咱們團隊的各類解決方案。
針對項目需求,介紹了咱們選擇HBase的緣由,及在HBase數據庫使用過程當中的經驗和痛點。
將來,咱們會在系統接入大量車輛後,使用golang重寫高性能組件以知足後期的併發性能需求。因爲項目初期考慮到開發時間的問題,並未採用服務拆分的方式進行開發,這限制了系統的可擴展性,後期咱們會根據實際業務需求,將系統切分紅相對獨立的模塊,加強擴展性可維護性。另外,車輛數據積累到必定程度後,咱們能夠利用這些數據進行大數據分析, 如車輛的故障診斷,車輛狀態預測等,這樣就能夠在車輛出現問題前提早發出預警,爲車主和保險公司避免更大的損失,下降運營成本。