數據分類及存儲特性——NoSQL數據存儲
NoSQL 數據存儲
傳統的架構方法是在服務之間共享一個數據庫,而微服務卻與之相反,每個微服務都擁有獨立、自主、專門的數據存儲。微服務數據存儲是基礎設施構建的重點,因爲它提供服務解耦、數據存儲自主性、小型化開發、測試設置等特性,有助於應用程序更快地交付或更新。選擇理想的數據存儲的第一步是確定微服務數據的性質,可以根據數據的特點將數據大致做如下劃分。
-
全局共享數據:緩存服務器是存儲短暫數據很好的例子。它是一個臨時數據存儲,其目的是通過實時提供信息來改善用戶體驗。
-
事務數據:從交易(如付款處理和訂單處理)收集的數據必須作爲永久記錄存儲在支持強 ACID 控制的數據庫中。
-
加速數據:日誌、消息和信號等數據通常以高容量和速度到達。數據提取服務通常要在將其傳遞到適當的目的地之前處理該信息,這樣的數據存儲需要支持高速寫入。如果額外支持時間序列數據和內置 JSON 功能,會是一個加分項。瞬態數據的持久性要求高於短暫數據,但不如交易數據高。
-
操作數據:從用戶會話收集的信息(如用戶基本資料、訂單信息)被視爲操作數據。微服務器需要提供更好的用戶體驗與實時反饋,即使存儲在數據庫中的數據不是永久的記錄,架構也必須盡最大努力保留數據以實現業務的連續性。對於操作數據,數據的持久性、一致性和可用性要求很高。通常,企業會把操作數據放在特定的數據模型中。
爲了優化微服務以獲得性能和數據持久性要求,一定要確認所選的數據庫爲數據類型提供了適當的存儲技術。我們可以對微服務及其各自的數據存儲進行分類,如下表所示。
-
如果追求高性能,那麼純內存數據庫是理想的選擇。
-
如果追求持久性,那麼數據複製及磁盤或閃存上的持久性是最好的解決方案。
-
如果追求事務一致性和複雜的關聯查詢,則可以採用數據庫查詢。
-
如 果 追 求 查 詢 性 能 , 高 速 寫 入 數 據 , 則 可 以 選 擇 Elasticsearch。
-
如果是對 JSON 類數據的寫入和讀取,則可以使用文檔數據庫。
-
如果選擇寫入時序類型數據,則可以使用時序性數據庫。
下面是四類常見的 NoSQL 方案。
-
K-V 存儲:解決關係數據庫無法存儲數據結構的問題,主要適合對全局數據進行快速查找的低延時、高性能場景,以 Redis 爲代表。
-
文檔數據庫:解決關係數據庫強 Schema 約束的問題,主要適合動態模式變更和支持敏捷開發的場景,以 MongoDB 爲代表。
-
列式數據庫:解決關係數據庫在大數據場景下的 I/O 問題,主要適合對數據量比較大或者對數據統計 OLAP 和聚合統計的場景,以 HBase 爲代表。
-
全文搜索引擎:解決關係數據庫的全文搜索性能問題,主要適合檢索及過濾,以 Elasticsearch 爲代表。
下面來介紹各種高性能 NoSQL 方案的典型特徵和應用場景。
K-V 存儲
K-V 存儲指按照鍵值(Key-Value)進行的數據存儲,其中 Key 是數據的標識,和關係數據庫中的主鍵含義一樣;Value 是具體的數據。
Redis 是 K-V 存儲的典型代表,它是一款開源(基於 BSD 許可)的高性能 K-V 緩存和存儲系統。Redis 的 Value 是具體的數據結構,包括 string、hash、list、set、sorted set、bitmap 和 hyperloglog,所以常被稱爲數據結構服務器。
K-V 存儲適合作爲分佈式內存緩存的解決方案。在微服務架構中,微服務共享的一些全局數據都保存在 K-V 存儲中,例如,用戶信息(如會話)、分佈式鎖、配置文件、參數、購物車等。這些信息一般都和 ID 掛鉤。通過鍵值操作就可以獲得共享的 Value,Redis 提供的主從複製模式(Replication-Sentinel 模式)和集羣模式(Redis-Cluster 模式)可以很好地提供多數據中心、多向複製等高度可用性和高度擴展性。Redis 高性能的數據存儲總結下來有下面幾個原因。
-
Redis 將所有數據放在內存中,內存的響應時間大約爲 100ns,這是 Redis 達到每秒萬級別訪問的重要基礎。
-
非阻塞 I/O 特性,Redis 使用 epoll 作爲 I/O 多路複用技術的實現,再加上 Redis 自身的事件處理模型,將 epoll 中的鏈接、讀寫、關閉都轉換爲事件,不在網絡 I/O 上耗費時間。
-
單線程避免了線程切換和鎖產生的消耗。
-
Redis 全程使用 hash 結構,讀取速度快,還有一些特殊的數據結構,對數據存儲進行了優化。如壓縮表,對短數據進行壓縮存儲;再如跳錶,使用有序的數據結構加快讀取的速度。
文檔數據庫
爲了解決關係數據庫 Schema 帶來的問題,文檔數據庫應運而生。MongoDB 作爲文檔數據庫的典型代表,是專爲可擴展性、高性能和高可用性設計的數據庫。它可以從單服務器部署擴展到大型、複雜的多數據中心架構。利用內存計算的優勢,MongoDB 能夠提供高性能的數據讀寫操作。MongoDB 的本地複製和自動故障轉移功能使應用程序具有企業級的可靠性和操作靈活性。
文檔數據庫最大的特點就是 No-Schema(不使用表結構)存儲和可讀取任意數據。目前絕大部分文檔數據庫存儲的數據格式是 JSON,因爲 JSON 數據是自描述的,讀取一個 JSON 中不存在的字段也不會導致 SQL 那樣的語法錯誤。文檔數據庫的 No-Schema 特性,爲業務開發帶來了幾個明顯的優勢。
-
新增字段簡單:業務上增加新的字段,無須再像關係數據庫一樣先執行 DDL 修改表結構,程序代碼直接讀寫即可。
-
容易兼容歷史數據:對於歷史數據,即使沒有新增的字段,也不會導致錯誤,只會返回空值,此時對代碼進行兼容處理即可。
-
容易存儲複雜數據:JSON 是一種強大的描述語言,能夠描述複雜的數據結構。使用 JSON 來描述數據,比使用關係數據庫表來描述數據要方便和容易得多,而且更加容易理解。同時,對於很多數據在屬性差別比較大的情況下,也比較適合採用文檔數據庫;對於屬性變更的場景,關係數據庫需要使用 DDL 重新定義表字段,而文檔數據庫則更加方便。
列式數據庫
顧名思義,列式數據庫就是按照列來存儲數據的數據庫,與之對應的傳統關係數據庫被稱爲 “行式數據庫”,關係數據庫就是按照行來存儲數據的。
HBase 是一個開源的非關係分佈式數據庫,它參考了谷歌的 BigTable 建模,實現的編程語言爲 Java。它是 Apache 軟件基金會 Hadoop 項目的一部分,運行於 HDFS 文件系統上,爲 Hadoop 提供類似 BigTable 規模的服務。因此,它可以存儲海量稀疏的數據。HBase 基於 LSM 樹實現,它將對數據的修改增量保持在內存中,達到指定的大小後將這些修改操作批量寫入磁盤。在極端情況下,寫性能比 MySQL 高一個數量級,讀性能低一個數量級,所以列式數據庫的適用場景,以 HBase 爲例說明如下:
-
適合大數據量(100TB 級數據),有快速隨機訪問的需求。
-
適合寫密集型應用,每天寫入量巨大,比如即時消息的歷史消息、遊戲日誌等。
-
適合不需要使用複雜查詢條件來查詢數據的應用。HBase 只支持基於 Rowkey 的查詢,對於 HBase 來說,單條記錄或者小範圍的查詢是可以接受的。但由於分佈式的原因,大範圍的查詢可能在性能上有影響。HBase 不適用於使用級聯、多級索引、表關係複雜的數據模型。
-
適合數據量較大且增長量無法預估的應用,以及需要進行優雅的數據擴展的應用。HBase 支持在線擴展,即使在一段時間內,數據量呈井噴式增長,也可以通過 HBase 橫向擴展來滿足功能需求。
全文搜索引擎
傳統的關係數據庫通過索引來達到快速查詢的目的,但是在全文搜索的業務場景下,索引也無能爲力,主要體現在:全文搜索的條件可以隨意排列組合,如果通過索引來滿足,則索引的數量會非常多。
全文搜索的模糊匹配方式,索引無法滿足,只能用 like 查詢,而 like 查詢是整表掃描的,效率非常低。全文搜索引擎(又稱爲倒排索引)的基本原理是建立單詞到文檔的索引。而正排索引的基本原理是建立文檔到單詞的索引。Elasticsearch 是一個分佈式可擴展的實時搜索和分析引擎,一個建立在全文的搜索引擎。當然 Elasticsearch 並不像 Apache Lucene 那麼簡單,它不僅具有全文搜索功能,還具有下列特性和能力:
-
分佈式實時文件存儲,並將每一個字段都編入索引,使其可以被搜索。
-
實時分析的分佈式搜索引擎。
-
橫向可擴展性:作爲大型分佈式集羣,很容易就能擴展新的服務器到 ES 集羣中,處理 PB 級別的結構化或非結構化數據;也可運行在單機上作爲輕量級搜索引擎使用。
-
更豐富的功能:與傳統的關係數據庫相比,Elasticsearch 提供了全文檢索、同義詞處理、相關度排名、複雜數據分析、海量數據的近實時處理等功能。
-
分片機制提供更好的分佈性:同一個索引被分爲多個分片(Shard),利用分而治之的思想提升處理效率。
-
高可用:提供副本(Replica)機制,一個分片可以設置多個副本,即使在某些服務器宕機後,集羣仍能正常工作。
-
開箱即用:提供簡單易用的 API,使服務的搭建、部署和使用都很容易被操作。
下表是一份簡易的 Elasticsearch 和關係數據庫的術語對照表。
一個 Elasticsearch 集羣可以包含多個索引(數據庫),也就是說可以包含很多類型。這些類型中包含了很多的文檔(行),然後每個文檔中又都包含了很多字段(列)。Elasticsearch 的交互可以使用 Java Native API,也可以使用 HTTP 的 Restful API。Elasticsearch 通過 Lucene 的倒排索引技術可以實現比關係數據庫更快的過濾。
Elasticsearch 可以爲任何形式的數據提供出色的搜索和分析,通過 Kibana 提供交互式控制面板。我們經常使用 Elasticsearch 來調試日誌用例。
來源:
https://www.toutiao.com/article/7097471371168662048/?log_from=3230af473fd71_1654825830746
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/KdaM43qdH1O9TAUGLPEhUw