數據存儲的 6 種可選技術
業務問題的範圍太廣、太深、太複雜,一種工具無法解決所有問題,在大數據和分析領域尤其如此. 本文介紹數據存儲的 6 種可選技術。
1. 結構化數據存儲
結構化數據存儲已經存在了幾十年,是人們最熟悉的數據存儲技術。大多數事務型數據庫(如Oracle、MySQL、SQL Server和PostgreSQL)都是行式數據庫,因為要處理來自軟件應用程序的頻繁數據寫入。
企業經常將事務型數據庫同時用於報表,在這種情況下,需要頻繁讀取數據,但數據寫入頻率要低得多。隨著數據讀取的需求越來越強,有更多的創新進入了結構化數據存儲的查詢領域,比如列式文件格式的創新,它有助於提高數據讀取性能,滿足分析需求。
基於行的格式將數據以行的形式存儲在文件中。基於行的寫入方式是將數據寫入磁盤的最快方式,但它不一定能最快地讀取,因為你必須跳過很多不相關的數據。
基於列的格式將所有的列值一起存儲在文件中。這樣會帶來更好的壓縮效果,因為相同的數據類型現在被歸為一組。通常,它還能提供更好的讀取性能,因為你可以跳過不需要的列。
我們來看結構化數據存儲的常見選擇。例如,你需要從訂單表中查詢某個月的銷售總數,但該表有50列。在基於行的架構中,查詢時會掃描整個表的50個列,但在列式架構中,查詢時只會掃描訂單銷售列,因而提高了數據查詢性能。我們再來詳細介紹關係型數據庫,重點介紹事務數據和數據倉庫處理數據分析的需求。
企業經常將事務型數據庫同時用於報表,在這種情況下,需要頻繁讀取數據,但數據寫入頻率要低得多。隨著數據讀取的需求越來越強,有更多的創新進入了結構化數據存儲的查詢領域,比如列式文件格式的創新,它有助於提高數據讀取性能,滿足分析需求。
基於行的格式將數據以行的形式存儲在文件中。基於行的寫入方式是將數據寫入磁盤的最快方式,但它不一定能最快地讀取,因為你必須跳過很多不相關的數據。
基於列的格式將所有的列值一起存儲在文件中。這樣會帶來更好的壓縮效果,因為相同的數據類型現在被歸為一組。通常,它還能提供更好的讀取性能,因為你可以跳過不需要的列。
我們來看結構化數據存儲的常見選擇。例如,你需要從訂單表中查詢某個月的銷售總數,但該表有50列。在基於行的架構中,查詢時會掃描整個表的50個列,但在列式架構中,查詢時只會掃描訂單銷售列,因而提高了數據查詢性能。我們再來詳細介紹關係型數據庫,重點介紹事務數據和數據倉庫處理數據分析的需求。
(1)關係型數據庫
RDBMS比較適合在線事務處理(OLTP)應用。流行的關係型數據庫有Oracle、MSSQL、MariaDB、PostgreSQL等。其中一些傳統數據庫已經存在了幾十年。
許多應用,包括電子商務、銀行業務和酒店預訂,都是由關係型數據庫支持的。關係型數據庫非常擅長處理表之間需要復雜聯合查詢的事務數據。從事務數據的需求來看,關係型數據庫應該堅持原子性、一致性、隔離性、持久性原則,具體如下:
原子性:事務將從頭到尾完全執行,一旦出現錯誤,整個事務將會回滾。
一致性:一旦事務完成,所有的數據都要提交到數據庫中。
隔離性:要求多個事務能在隔離的情況下同時運行,互不干擾。
持久性:在任何中斷(如網絡或電源故障)的情況下,事務應該能夠恢復到最後已知的狀態。
通常情況下,關係型數據庫的數據會被轉存到數據倉庫中,用於報表和聚合。
RDBMS比較適合在線事務處理(OLTP)應用。流行的關係型數據庫有Oracle、MSSQL、MariaDB、PostgreSQL等。其中一些傳統數據庫已經存在了幾十年。
許多應用,包括電子商務、銀行業務和酒店預訂,都是由關係型數據庫支持的。關係型數據庫非常擅長處理表之間需要復雜聯合查詢的事務數據。從事務數據的需求來看,關係型數據庫應該堅持原子性、一致性、隔離性、持久性原則,具體如下:
原子性:事務將從頭到尾完全執行,一旦出現錯誤,整個事務將會回滾。
一致性:一旦事務完成,所有的數據都要提交到數據庫中。
隔離性:要求多個事務能在隔離的情況下同時運行,互不干擾。
持久性:在任何中斷(如網絡或電源故障)的情況下,事務應該能夠恢復到最後已知的狀態。
通常情況下,關係型數據庫的數據會被轉存到數據倉庫中,用於報表和聚合。
(2)數據倉庫
數據倉庫更適合在線分析處理(OLAP)應用。數據倉庫提供了對海量結構化數據的快速聚合功能。數據需要分批加載,使得倉庫無法在熱數據上提供實時洞察。
現代數據倉庫使用列式存儲來提升查詢性能。得益於列式存儲,這些數據倉庫提供了非常快的查詢速度,提高了I/O效率。
數據倉庫是中央存儲庫,可以存儲來自一個或多個數據庫的累積數據。它們存儲當前和歷史數據,用於創建業務數據的分析報告。
雖然,數據倉庫集中存儲來自多個系統的數據,但它們不能被視為數據湖。數據倉庫只能處理結構化的關係型數據,而數據湖則可以同時處理結構化的關係型數據和非結構化的數據,如JSON、日誌和CSV數據。
數據倉庫更適合在線分析處理(OLAP)應用。數據倉庫提供了對海量結構化數據的快速聚合功能。數據需要分批加載,使得倉庫無法在熱數據上提供實時洞察。
現代數據倉庫使用列式存儲來提升查詢性能。得益於列式存儲,這些數據倉庫提供了非常快的查詢速度,提高了I/O效率。
數據倉庫是中央存儲庫,可以存儲來自一個或多個數據庫的累積數據。它們存儲當前和歷史數據,用於創建業務數據的分析報告。
雖然,數據倉庫集中存儲來自多個系統的數據,但它們不能被視為數據湖。數據倉庫只能處理結構化的關係型數據,而數據湖則可以同時處理結構化的關係型數據和非結構化的數據,如JSON、日誌和CSV數據。
2. NoSQL數據庫
NoSQL數據庫(如Dynamo DB、Cassandra和Mongo DB)可以解決在關係型數據庫中經常遇到的伸縮和性能挑戰。顧名思義,NoSQL表示非關係型數據庫。 NoSQL數據庫儲存的數據沒有明確結構機制連接不同表中的數據(沒有連接、外鍵,也不具備範式)。
NoSQL運用了多種數據模型,包括列式、鍵值、搜索、文檔和圖模型。 NoSQL數據庫提供可伸縮的性能、具有高可用性和韌性。
NoSQL通常沒有嚴格的數據庫模式,每條記錄都可以有任意數量的列(屬性),這意味著某一行可以有4列,而同一個表中的另一行可以有10列。分區鍵用於檢索包含相關屬性的值或文檔。 NoSQL數據庫是高度分佈式的,可以復制。 NoSQL數據庫非常耐用,高可用的同時不會出現性能問題。
NoSQL運用了多種數據模型,包括列式、鍵值、搜索、文檔和圖模型。 NoSQL數據庫提供可伸縮的性能、具有高可用性和韌性。
NoSQL通常沒有嚴格的數據庫模式,每條記錄都可以有任意數量的列(屬性),這意味著某一行可以有4列,而同一個表中的另一行可以有10列。分區鍵用於檢索包含相關屬性的值或文檔。 NoSQL數據庫是高度分佈式的,可以復制。 NoSQL數據庫非常耐用,高可用的同時不會出現性能問題。
3. NoSQL數據庫類型
NoSQL數據庫的主要類型如下:
列式數據庫:列式數據存儲有助於在查詢數據時掃描某一列,而不是掃描整行。如果物品表有10列100萬行,而你想查詢庫存中某一物品的數量,那麼列式數據庫只會將查詢應用於物品數量列,不需要掃描整個表。
文檔數據庫:最流行的文檔數據庫有MongoDB、Couchbase、MarkLogic、Dynamo DB和Cassandra。可以使用文檔數據庫來存儲JSON和XML格式的半結構化數據。
圖數據庫:圖數據庫存儲頂點和頂點之間的鏈接(稱為邊)。圖可以建立在關係型和非關係型數據庫上。
內存式鍵值存儲:它們將數據存儲在內存中,用於數據讀取頻率高的場景。應用程序的查詢首先會轉到內存數據庫,如果數據在緩存中可用,則不會衝擊主數據庫。內存數據庫很適合存儲用戶會話信息,這些數據會導致複雜的查詢和頻繁的請求數據,如用戶資料。
NoSQL有很多用例,但要建立數據搜索服務,需要對所有數據建立索引。
列式數據庫:列式數據存儲有助於在查詢數據時掃描某一列,而不是掃描整行。如果物品表有10列100萬行,而你想查詢庫存中某一物品的數量,那麼列式數據庫只會將查詢應用於物品數量列,不需要掃描整個表。
文檔數據庫:最流行的文檔數據庫有MongoDB、Couchbase、MarkLogic、Dynamo DB和Cassandra。可以使用文檔數據庫來存儲JSON和XML格式的半結構化數據。
圖數據庫:圖數據庫存儲頂點和頂點之間的鏈接(稱為邊)。圖可以建立在關係型和非關係型數據庫上。
內存式鍵值存儲:它們將數據存儲在內存中,用於數據讀取頻率高的場景。應用程序的查詢首先會轉到內存數據庫,如果數據在緩存中可用,則不會衝擊主數據庫。內存數據庫很適合存儲用戶會話信息,這些數據會導致複雜的查詢和頻繁的請求數據,如用戶資料。
NoSQL有很多用例,但要建立數據搜索服務,需要對所有數據建立索引。
4. Elasticsearch
Elasticsearch是大數據場景(如點擊流和日誌分析)最受歡迎的搜索引擎之一。搜索引擎能很好地支持對具有任意數量的屬性(包括字符串令牌)的溫數據進行臨時查詢。 Elasticsearch非常流行。一般的二進製或對象存儲適用於非結構化、不可索引和其他沒有專業工具能理解其格式的數據。
日誌搜索和分析是常見的大數據應用場景,Elasticsearch可以幫助你分析來自網站、服務器、物聯網傳感器的日誌數據。 Elasticsearch被大量的行業應用使用,如銀行、遊戲、營銷、應用監控、廣告技術、欺詐檢測、推薦和物聯網等。
日誌搜索和分析是常見的大數據應用場景,Elasticsearch可以幫助你分析來自網站、服務器、物聯網傳感器的日誌數據。 Elasticsearch被大量的行業應用使用,如銀行、遊戲、營銷、應用監控、廣告技術、欺詐檢測、推薦和物聯網等。
5. 非結構化數據存儲
當你有非結構化數據存儲的需求時,Hadoop似乎是一個完美的選擇,因為它是可擴展、可伸縮的,而且非常靈活。它可以運行在消費級設備上,擁有龐大的工俱生態,而且運行起來似乎很划算。
Hadoop採用主節點和子節點模式,數據分佈在多個子節點,由主節點協調作業,對數據進行查詢運算。 Hadoop系統依託於大規模並行處理(MPP),這使得它可以快速地對各種類型的數據進行查詢,無論是結構化數據還是非結構化數據。
在創建Hadoop集群時,從服務器上創建的每個子節點都會附帶一個稱為本地Hadoop分佈式文件系統(HDFS)的磁盤存儲塊。你可以使用常見的處理框架(如Hive、Ping和Spark)對存儲數據進行查詢。但是,本地磁盤上的數據只在相關實例的生命期內持久化。
如果使用Hadoop的存儲層(即HDFS)來存儲數據,那麼存儲與計算將耦合在一起。增加存儲空間意味著必須增加更多的機器,這也會提高計算能力。為了獲得最大的靈活性和最佳成本效益,需要將計算和存儲分開,並將兩者獨立伸縮。
總的來說,對象存儲更適合數據湖,以經濟高效的方式存儲各種數據。基於雲計算的數據湖在對象存儲的支持下,可以靈活地將計算和存儲解耦。
Hadoop採用主節點和子節點模式,數據分佈在多個子節點,由主節點協調作業,對數據進行查詢運算。 Hadoop系統依託於大規模並行處理(MPP),這使得它可以快速地對各種類型的數據進行查詢,無論是結構化數據還是非結構化數據。
在創建Hadoop集群時,從服務器上創建的每個子節點都會附帶一個稱為本地Hadoop分佈式文件系統(HDFS)的磁盤存儲塊。你可以使用常見的處理框架(如Hive、Ping和Spark)對存儲數據進行查詢。但是,本地磁盤上的數據只在相關實例的生命期內持久化。
如果使用Hadoop的存儲層(即HDFS)來存儲數據,那麼存儲與計算將耦合在一起。增加存儲空間意味著必須增加更多的機器,這也會提高計算能力。為了獲得最大的靈活性和最佳成本效益,需要將計算和存儲分開,並將兩者獨立伸縮。
總的來說,對象存儲更適合數據湖,以經濟高效的方式存儲各種數據。基於雲計算的數據湖在對象存儲的支持下,可以靈活地將計算和存儲解耦。
6. 數據湖
數據湖是結構化和非結構化數據的集中存儲庫。數據湖正在成為在集中存儲中存儲和分析大量數據的一種流行方式。它按原樣存儲數據,使用開源文件格式來實現直接分析。由於數據可以按當前格式原樣存儲,因此不需要將數據轉換為預定義的模式,從而提高了數據攝取的速度。
數據湖的優勢如下:
從各種來源攝取數據:數據湖可以讓你在一個集中的位置存儲和分析來自各種來源(如關係型、非關係型數據庫以及流)的數據,以產生單一的真實來源。它解答了一些問題,例如,為什麼數據分佈在多個地方?單一真實來源在哪裡?
採集並高效存儲數據:數據湖可以攝取任何類型的數據,包括半結構化和非結構化數據,不需要任何模式。這就回答瞭如何從各種來源、各種格式的數據中快速攝取數據,並高效地進行大規模存儲的問題。
隨著產生的數據量不斷擴展:數據湖允許你將存儲層和計算層分開,對每個組件分別伸縮。這就回答瞭如何隨著產生的數據量進行伸縮的問題。
將分析方法應用於不同來源的數據:通過數據湖,你可以在讀取時確定數據模式,並對從不同資源收集的數據創建集中的數據目錄。這使你能夠隨時、快速地對數據進行分析。這回答了是否能將多種分析和處理框架應用於相同的數據的問題。
數據湖的優勢如下:
從各種來源攝取數據:數據湖可以讓你在一個集中的位置存儲和分析來自各種來源(如關係型、非關係型數據庫以及流)的數據,以產生單一的真實來源。它解答了一些問題,例如,為什麼數據分佈在多個地方?單一真實來源在哪裡?
採集並高效存儲數據:數據湖可以攝取任何類型的數據,包括半結構化和非結構化數據,不需要任何模式。這就回答瞭如何從各種來源、各種格式的數據中快速攝取數據,並高效地進行大規模存儲的問題。
隨著產生的數據量不斷擴展:數據湖允許你將存儲層和計算層分開,對每個組件分別伸縮。這就回答瞭如何隨著產生的數據量進行伸縮的問題。
將分析方法應用於不同來源的數據:通過數據湖,你可以在讀取時確定數據模式,並對從不同資源收集的數據創建集中的數據目錄。這使你能夠隨時、快速地對數據進行分析。這回答了是否能將多種分析和處理框架應用於相同的數據的問題。