1.1 NoSQL 數據庫的工作原理

NoSQL 數據庫使用各種數據模型來訪問和操作數據。這些類型的數據庫針對需要低延遲和靈活數據模型的數據密集型應用程序進行了優化。所有這一切都是通過放寬對其他類型數據庫的典型嚴格數據一致性要求來實現的。

考慮一個簡單的書籍數據庫的模式建模示例。

  • 在關係數據庫中,書籍條目通常被分成多個部分(或“規範化”)並存儲在單獨的表中,這些表的關係由主鍵和外鍵約束定義。在此示例中,Books表有ISBN書名“ISBN”“Author”Author-ISBN,列Author NameAuthor IDAuthors版本. 關係模型旨在維護數據庫中表之間的引用完整性。數據被規範化以減少冗餘,並且通常針對存儲進行優化。

  • 在 NoSQL 數據庫中,書籍記錄通常存儲為 JSON 文檔。對於每本書或元素,ISBN書名版本號作者姓名作者 ID值都作為屬性存儲在單個文檔中。在此模型中,數據針對直觀開發和水平可擴展性進行了優化。

1.2 NoSQL 數據庫有什麼用?

NoSQL 數據庫非常適合許多現代應用程序,例如移動、遊戲、Web 應用程序,這些應用程序需要靈活、可擴展的數據庫,這些數據庫具有高性能和豐富的功能,可以提供最大的可用性。

  • 靈活性。通常,NoSQL 數據庫提供靈活的模式,允許更快的開發和增量實施。由於使用靈活的數據模型,NoSQL 數據庫非常適合半結構化和非結構化數據。

  • 可擴展性。NoSQL 數據庫旨在使用分佈式硬件集群進行擴展,而不是通過添加昂貴、可靠的服務器來擴展。一些雲服務提供商在後台運行這些操作,提供完全託管的服務。

  • 高性能。NoSQL 數據庫針對特定數據模型和訪問模式進行了優化,以實現比關係數據庫更高的性能。

  • 廣泛的功能。NoSQL 數據庫提供了豐富的 API 和數據類型,這些 API 和數據類型是專門為其各自的數據模型設計的。

1.3 NoSQL 數據庫的類型

NoSQL 數據庫用於不太方便以表格形式存儲數據的地方。因此,它們以非常不同的格式存儲。通常,NoSQL 數據庫有 6 種主要數據類型。

基於鍵值對的數據庫

使用鍵值對的數據庫支持高可分離性,並提供其他類型數據庫無法實現的前所未有的橫向擴展。鍵值數據庫的良好用例是遊戲、廣告和物聯網應用程序。

例如,Amazon DynamoDB 可確保在任何規模下延遲不超過幾毫秒的穩定數據庫操作。這種強大的性能是將 Snapchat Stories 遷移到 DynamoDB 的主要原因,因為此 Snapchat 功能與最大的存儲寫入負載相關聯。

文檔

在應用程序代碼中,數據通常表示為類似 JSON 格式的對像或文檔,因為對於開發人員而言,它是一種高效且直觀的數據模型。文檔數據庫允許開發人員使用他們在應用程序代碼中使用的相同文檔模型在數據庫中存儲和查詢數據。文檔和文檔數據庫靈活的、半結構化的、分層的特性允許它們隨著應用程序的需要而發展。

文檔模型在目錄、用戶配置文件和內容管理系統中運行良好,在這些系統中,每個文檔都是唯一的並且會隨時間變化。Amazon DocumentDB(與 MongoDB 兼容)和 MongoDB 是常見的文檔數據庫,它們為敏捷開發提供功能性和直觀的 API。

圖數據庫

圖形數據庫使開發和運行處理複雜數據集的應用程序變得更加容易。使用圖數據庫的典型例子是社交網絡、推薦服務、欺詐檢測系統和知識圖譜。Amazon Neptune 是一種完全託管的圖形數據庫服務。Neptune 支持 Property Graph 和 Resource Description Framework (RDF),提供兩種圖形 API 可供選擇:TinkerPop 和 RDF/SPARQL。常見的圖數據庫包括 Neo4j 和 Giraph。

內存中的數據庫

遊戲和廣告應用程序通常使用排行榜、會話存儲和實時分析。這種能力需要在幾微秒內做出響應,而流量的急劇增加隨時都可能發生。

Amazon MemoryDB for Redis 是一種與 Redis 兼容的可靠內存數據庫服務,可將讀取延遲降低至毫秒,並提供跨多個可用區的持久性。MemoryDB 專為超高性能和可靠性而構建,因此它可以用作現代基於微服務的應用程序的主數據庫。

Amazon ElastiCache 是一種完全託管的 Redis 和 Memcached 兼容內存緩存服務,用於處理低延遲、高吞吐量的工作負載。像 Tinder 這樣需要應用程序實時響應的客戶正在使用內存而不是磁盤存儲系統。另一個專門構建的數據倉庫示例是 Amazon DynamoDB Accelerator (DAX)。DAX 允許 DynamoDB 以數倍的速度讀取數據。

搜索數據庫

許多應用程序都會生成日誌,以便開發人員更輕鬆地進行故障排除和修復問題。Amazon OpenSearch 是一項專門構建的服務,通過索引、聚合和搜索半結構化日誌和指標,對自動生成的數據流進行近乎實時的可視化和分析。

此外,Amazon OpenSearch 是一項功能強大的高性能全文搜索服務。Expedia 利用 150 多個 Amazon OpenSearch 服務域、30 TB 數據和 300 億份文檔來處理各種關鍵任務用例,從運營監控和故障排除到分佈式應用程序堆棧跟踪和成本優化。

1.4 SQL(關係型)和NoSQL(非關係型)數據庫的比較

NoSQL有很多優點,所以你至少應該在理論上知道你需要的工具在你自己寫之前已經存在了。下面我將給出NoSQL和SQL數據庫的對比:

合適的工作負載

關係數據庫專為事務性和高度一致的實時事務處理 (OLTP) 應用程序而設計,非常適合實時分析處理 (OLAP)。

NoSQL 數據庫旨在處理一系列數據訪問模式,包括低延遲應用程序。NoSQL 搜索數據庫專為分析半結構化數據而設計。

數據模型

關係模型規範化數據並將其轉換為由行和列組成的表。模式嚴格定義表、行、列、索引、表之間的關係以及其他數據庫元素。這樣的數據庫確保表之間關係中參考數據的完整性。

NoSQL 數據庫提供了多種數據模型,例如針對高性能和可擴展性進行了優化的鍵值對、文檔和圖形。

酸性物質

關係數據庫提供一組 ACID 屬性:原子性、一致性、隔離性、可靠性。

  • 原子性要求事務全部執行或根本不執行。
  • 一致性意味著事務一旦完成,數據就必須符合數據庫模式。
  • 隔離要求並行事務彼此分開運行。
  • 可靠性是指在意外的系統故障或斷電後恢復到上次保存狀態的能力。

NoSQL 數據庫通常會做出折衷,放寬對 ACID 屬性的嚴格要求,支持允許水平擴展的更靈活的數據模型。這使得 NoSQL 成為需要水平擴展到單個實例之外的高帶寬、低延遲用例的絕佳選擇。

表現

性能主要取決於磁盤子系統。通常需要優化查詢、索引和表結構以獲得最佳性能。

性能通常取決於底層硬件集群的大小、網絡延遲和調用應用程序。

縮放

關係數據庫通常通過增加硬件的計算能力或通過為讀取工作負載添加單獨的副本來擴展。

NoSQL 數據庫通常通過基於分佈式架構的可擴展訪問模式來支持高可分離性。這提高了吞吐量並在幾乎無限的規模下提供一致的性能。

應用程序接口

寫入和檢索數據的請求是用 SQL 編寫的。這些查詢由關係數據庫解析和執行。

面向對象的 API 允許應用程序開發人員輕鬆編寫和檢索數據結構。使用分區鍵,應用程序可以搜索鍵值對、列集或包含串行對象和應用程序屬性的半結構化文檔。