甚麼是NoSQL?

NoSQL包含了各種不同的數據庫技術,這些技術是為了響應構建現代應用程式的需求而開發的:

開發人員正在處理大量新的,快速變化的數據類型 - 結構化,半結構化,非結構化和多態的數據。

十二到十八個月的瀑布式開發週期已經過去了。現在,小團隊以敏捷的衝刺方式工作,快速迭代,每週或每兩週推出一些代碼,甚至每天多次推出代碼。

曾經為有限的受眾服務的應用程式現在作為服務提供,必須始終處於開啟狀態,可以從許多不同的設備訪問,並向全球數百萬用戶擴展。

現在組織正在轉向使用開源軟件,商品伺服器和雲計算的橫向擴展架構,而不是大型的單片式伺服器和存儲基礎架構。

關係數據庫的設計目的不是為了應對現代應用程式所面臨的規模和敏捷性挑戰,也不是為了利用現有的商品存儲和處理能力而建立的。

NoSQL數據庫種類

文檔數據庫 將每個密鑰與稱為文檔的複雜數據結構配對。文檔可以包含許多不同的鍵 – 值對,或鍵 – 數組對,甚至嵌套的文檔。

圖像儲存 用於存儲關於數據網絡的信息,例如社交連接。圖表商店包括Neo4J和Giraph。

重要價值商店儲存 最簡單的NoSQL數據庫。數據庫中的每個項目都以屬性名稱(或“鍵”)的形式存儲在其中。關鍵價值商店的例子是Riak和Berkeley DB。一些鍵值存儲(如Redis)允許每個值都有一個類型,例如“integer”,它增加了功能。

寬列儲存 如Cassandra和HBase針對大型數據集的查詢進行了優化,並將數據列(不是行)存儲在一起。

NoSQL的好處

與關係型數據庫相比,NoSQL數據庫具有更高的可伸縮性和更好的性能,其數據模型解決了幾個關係模型不能解決的問題:

大量快速變化的結構化,半結構化和非結構化數據

敏捷衝刺,快速模式迭代和頻繁的代碼推送

面向對象的編程,靈活並易於使用

在地理上分佈式橫向擴展架構,而不是昂貴的,單一的架構

動態模式

關係數據庫要求在添加數據之前定義模式。例如,您可能希望存儲有關客戶的數據,如電話號碼,姓名,地址,城市和州 – SQL數據庫需要提前知道您正在存儲的內容。

這與適應敏捷的開發方法不太吻合,因為每次完成新功能時,數據庫的架構往往都需要改變。因此,如果您決定進行幾次迭代開發,除了地址和電話號碼之外,您還希望存儲客戶喜歡的項目,則需要將該列添加到數據庫,然後將整個數據庫遷移到新的模式。

如果數據庫很大,這是一個非常緩慢的過程,涉及到顯著的停機時間。如果您經常更改應用程式存儲的數據(因為您正在快速迭代),此宕機時間可能也會頻繁發生。使用關係數據庫也無法事先有效地處理完全沒有結構化或未知的數據。

數據庫的構建允許在沒有預定義模式的情況下插入數據。這樣可以很容易地實時進行重大的應用程式更改,而無需擔心服務中斷 – 這意味著開發速度更快,代碼集成更可靠,並且需要更少的數據庫管理員時間。開發人員通常不得不添加應用程式端代碼來執行數據質量控制,例如強制存在特定的字段,數據類型或允許的值。更複雜的NoSQL數據庫允許在數據庫中應用驗證規則,允許用戶跨數據執行管理,同時保持動態模式的靈活性優勢。

自動分片

由於它們的結構化方式,關係數據庫通常會垂直擴展 – 單個伺服器必須託管整個數據庫,以確保交叉表連接和事務的可接受性能。這會迅速變得昂貴,限制規模,並為數據庫基礎設施創建相對較少的故障點。支持快速增長的應用程式的解決方案是通過添加伺服器而不是在單個伺服器上集中更多容量來水平擴展。

可以通過SQL數據庫實現跨多個伺服器實例的“分片”數據庫,但通常通過SAN和其他復雜的安排來實現,使硬件充當單個伺服器。由於數據庫本身不提供這種功能,因此開發團隊負責在多台機器上部署多個關係數據庫。數據自動存儲在每個數據庫實例中。開發應用程式代碼以分發數據,分發查詢,並在所有數據庫實例中匯總數據結果。必須開發額外的代碼來處理資源故障,在不同數據庫之間執行連接,進行數據重新平衡,複製和其他要求。此外,在使用手動分片時,關係數據庫的許多好處,例如事務完整性,都會被破壞或被消除。

另一方面,NoSQL數據庫通常支持自動分片,這意味著它們可以在任意數量的伺服器上本地自動分發數據,而不需要應用程式甚至不需要知道伺服器池的組成。數據和查詢負載在伺服器之間自動平衡,當伺服器關閉時,可以快速,透明地替換,而不會造成應用程式中斷。

雲計算使得這個過程變得非常容易,諸如亞馬遜網絡服務(Amazon Web Services)等服務提供商可以根據需求提供幾乎無限的容量,並且負責所有必要的基礎架構管理任務開發人員不再需要構建複雜,昂貴的平台來支持他們的應用程式,並且可以專注於編寫應用程式代碼。商品伺服器可以提供與單個高端伺服器相同的處理和存儲功能,價格只是其中的一小部分。

複製

複雜的NoSQL數據庫完全自我修復,提供自動化故障轉移和恢復,以及跨多個地理區域分佈數據庫的能力,以抵禦區域故障並實現數據本地化。與關係數據庫不同,NoSQL數據庫通常不需要單獨的應用程式或昂貴的附件來實現複製。

集成緩存

許多產品為SQL數據庫系統提供了一個緩存層。這些系統可以顯著提高讀取性能,但不會提高寫入性能,並增加系統部署的操作複雜性。如果您的應用程式被讀操作占主導地位,那麼可以考慮使用分佈式緩存,但是如果您的應用程式僅具有適度的寫入量,那麼分佈式緩存可能不會改善最終用戶的整體體驗,並會增加管理緩存失效的複雜性。

許多NoSQL數據庫技術具有出色的集成緩存功能,盡可能將常用數據保留在系統內存中,並且不再需要單獨的緩存層。一些NoSQL數據庫還為要求最高吞吐量和最低延遲的工作負載提供完全託管的,集成的內存數據庫管理層。

NoSQL與SQL的比較

SQL 數據庫 NOSQL 數據庫
種類 一種類型(SQL數據庫),稍有不同 多種不同的類型,包括鍵值存儲、文檔數據庫、寬列存儲和圖形數據庫
發展歷史 在70年代開發處理第一波數據存儲應用程式 在2000年代後期開發,以處理SQL數據庫的局限性,特別是可伸縮性,多結構化數據,地理分佈和敏捷開發衝刺
例子 MySQL,Postgres,Microsoft SQL Server,Oracle數據庫 Cloudant, CouchDB, MongoDB, Cassandra, HBase, Neo4j
數據存儲模型 個人記錄(例如,“僱員”)作為行存儲在表格中,每一列存儲關於該記錄的特定數據片段(例如“經理”,“聘用日期”等),非常像電子表格。相關數據存儲在單獨的表中,然後在執行更複雜的查詢時連接在一起。例如,“辦公室”可能存儲在一張表中,“僱員”存儲在另一張表中。當用戶想要查找員工的工作地址時,數據庫引擎將“員工”和“辦公室”表一起加入,以獲取所有必要的信息。 根據數據庫類型而變化。例如,鍵值存儲的功能類似於SQL數據庫,但只有兩列(“鍵”和“值”),其中更複雜的信息有時以“值”列存儲為BLOB。文檔數據庫完全消除了表和行模型,將所有相關數據以JSON,XML或其他格式存儲在單個“文檔”中,這些格式可以分層嵌套值。
基模 結構和數據類型是事先確定的。要存儲有關新數據項的信息,必須更改整個數據庫,在此期間數據庫必須脫機。 通常是動態的,有一些強制的數據驗證規則。應用程式可以隨時添加新的字段,與SQL表行不同,可以根據需要將不同的數據存儲在一起。對於某些數據庫(例如,寬列商店),動態添加新字段更具挑戰性。
縮放比例 垂直方式,意味著單一的伺服器必須越來越強大,以應付增加的需求。可以將SQL數據庫分佈在許多伺服器上,但通常需要大量額外的工程,而且諸如JOIN,參照完整性和事務等核心關係特性通常會丟失。 水平方式,為了增加容量,數據庫管理員可以簡單地添加更多的商品伺服器或云實例。數據庫根據需要自動在伺服器之間分發數據。
發展模式 開放源代碼(例如Postgres,MySQL)和封閉源代碼(例如Oracle數據庫) 開源
支持交易 是的,更新可以配置完全或完全不完成 在某些情況下和某些級別(例如,文檔級別與數據庫級別)
數據操作 使用Select,Insert和Update語句的特定語言,例如選擇字段從表WHERE … 通過面向對象的API
統一性 可以進行強大的一致性配置 取決於產品。有些提供了很強的一致性(例如,MongoDB,讀取的可調整一致性),而另一些提供最終的一致性(例如Cassandra)。

實現NoSQL數據庫

通常情況下,組織將首先在其組織中對NoSQL數據庫進行小規模試用,這使得以低風險的方式了解該技術成為可能。大多數NoSQL數據庫也是開源的,這意味著它們可以下載,實施和縮減成本很低。由於開發週期更快,組織也可以更快地創新,以更低的成本提供卓越的客戶體驗。

在考慮傳統基礎架構的替代方案時,您可能會有幾個動機:擴展或超越現有系統的功能,找出昂貴的專有軟件的可行替代方案,或提高開發速度和靈活性。

想更深入了解我們的服務 ?

歡迎向我們查詢,我們的專業團隊會為你解答。
與我們聯絡
>