物聯網數據的存儲
1.海量存儲空間;多源異構,數據的表達需要細緻考慮
2.支持多粒度分級存儲和檢索,改善資源利用率,提高資源獲取率
3.具有實時性的多維檢測
4.冗餘數據需要壓縮
- 開放兼容
- 動態擴展
- 可靠高效
- 安全可信
關係型數據庫
概念
域(Domain) :相同類型數據元素值的集合
笛卡爾積:一組域D1, D2,…,Dn,則笛卡爾乘積爲D1XD2X…xDn ={( d1, d2,…, dn)| di∈Di,i=1,2,.,n}
元組(Tuple) : 笛卡爾乘積中每一-個元素(d1, d2,…, dn)稱爲一個元組)
關係模型的特點:
1.每一列不可再分
2.同一關係中屬性(字段)不允許重名
3.關係中不允許有完全相同的元組
4.關係中任意交換兩行位置不影響數據實際含義
關係數據結構
<關係名>(屬性名1,屬性名2,…屬性名N)
關係數據操作
查詢操作:選擇,投影,連接,並,交,差
更新操作:增加,刪除,修改數據的操作
常用的三種關係運算:
選擇運算:選擇若干行組成一個新的關係
投影運算:選擇若干列組成一個新的關係
連接運算:合併成一張表(有一列是相同的)
關係完整性約束
完整性約束=實體完整性+參照完整性+用戶定義完整性
1.實體完整性主要指關係中關鍵字不爲空且唯一
2.參照完整性指外碼的刪除,出現數據不完整性
3.用戶定義完整性指針對某一數據具體約束
非關係型數據庫
1.鍵值存儲數據庫
使用一個哈希表,有一個特定的鍵值和一個指針指向特定的數據
簡單,容易部署
針對部分值更新查詢的效率低下
2.列存儲數據庫
應對分佈式存儲的海量數據
鍵指向多個列,列由列家族安排
3.文檔型數據庫
數據是版本化的文檔,半結構化的文檔
和鍵值存儲時類似的,是鍵值存儲的升級版
4.圖形數據庫
使用圖形模型的數據庫
5感知數據庫
面向工業自動化,物聯網等領域;
既可以進行關係數據管理,也可以在線存儲實時特性的時序數據;
提供SQL標準接口,也提供實時數據的發佈訂閱,歷史查詢,歷史數據分析等服務;
定位於滿足企業級應用的數據庫。
本地文件系統
物理存儲資源直接連接在本地節點上,處理器通過系統總線可以直接訪問
物聯網使用本地 文件系統的方案較少
不同設備上的本地文件系統難以協同
通常運行與獨立的設備:容易丟失
分佈式文件系統
通常使用分佈式文件系統存儲物聯網數據
◆建立於本地文件系統之上
◆通過網絡將若干節點相連
◆提供併發處理
◆解決I/O瓶頸、空間動態擴展等問題
分佈式文件系統優點:
1.簡單配置即可輕鬆擴展集羣
2.併發控制,提高效率
3.節點失效視爲常態,容錯性高;
4.健全的數據恢復與備份,可靠性高;
5.吞吐量大,適合大規模數據應用
6.支持大數據處理工具
GFS (Google FiLe System)
◆GFS集羣由一個主服務器(Master) 和大量的塊伺服器構成,並被許多客戶
(Client)訪問。
◆文件被分爲固定大小的塊,並分配一個全局唯一的塊句柄 (chunk -handLe)
標識。
◆主服務器維護數據所有的元數據。
◆應用程序通過客戶端使用文件系統,客戶端和主服務器只交換元數據:數據通
信直接和伺服器聯繫。
MogilsFS
存儲節點爲實際文件存放的地方,用來完成存儲,刪除重命名等任務
FastDFS文件系統
1.只有兩個角色,tracker server和storage server ,不需要存儲文件索引信息
2.所有服務器都是對等的,不存在Master- SLave關係存儲服務器採用分組方式,同組內存儲服務器上的文件完全相同
TFS (Taobao File System)特點:
◆面向互聯網服務,針對海量非結構化數據
◆扁平化數據組織結構易於擴容
◆提供海量小文件存儲(每個文件通常不超過1M)
HDFS內部機制
- Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。
- Hadoop分佈式文件系統(HDFS)被設計成適合運行在通用硬件(commodity hardware).上的分佈式文件系統。HDFS是Apache Hadoop CoreI項 目的一部分。
- HDFS是一.個主從結構。
- 一個名字節點,管理文件命名空間和客戶端訪問文件的主服務器。
- 若干數據節點,通常是一個節點一個機器,它來管理對應節點的存儲。
- HDFS對外開放文件命名空間並允許用戶數據以文件形式存儲。
內部機制是將一個文件分割成一個或多個塊,這些塊被存儲在一組數據節點中:
名字節點用來操作文件命名空間或目錄操作,如打開,關閉,重命名等等;
數據節點負責來自文件系統客戶的讀寫請求:
數據節點同時還要執行塊的創建,刪除,和來自名字節點的塊複製指令。
客戶端請求文件系統打開文件:
- DFS獲取文件最開始的幾個塊的datanode地址;
- 第一個塊讀取完畢之後,尋找下一個塊的最佳datanode,讀取數據;
- 數據讀取完畢,客戶端關閉流對象。
客戶端寫人,創建新的文件(塊):
- Namenode在文件系統的命名空間中創建一個新文件,此時該文件沒有關聯到任何block;
- 客戶端寫入數據的時候,分解爲packets (數據包), 並寫人到一個數據隊列中,請求Namenode分配新的block存放的數據節點;
- 將packet寫人到管道的第一個節點,第一個節點存放好packet乏後,轉發給下一個節點,下一個節點存放之後繼續往下傳遞;
- 同時維護一個ack queue隊列,等待來自datanode確認消息。當管道上的所有datanode都確認乏後,packet從ack隊列中移除;
- 數據寫人完畢,客戶端cLose輸出流。將所有的packet刷新到管道中,然後安心等待來自datanode的確認消息。