主頁 > 資料庫 > MongoDB和Elasticsearch的各使用場景對比

MongoDB和Elasticsearch的各使用場景對比

2023-02-21 08:59:48 資料庫

MongoDB vs Elasticsearch

MongoDB ElasticSearch 備注
定位 (檔案型)資料庫 (檔案型)搜索引擎 一個管理資料,一個檢索資料
資源占用 一般 mongo使用c++, es使用Java開發
寫入延遲 es的寫入延遲默認1s, 可配置, 但是要犧牲一些東西
全文索引支持度 一般 非常好 es本來就是搜索引擎, 這個沒啥可比性
有無Schema 兩者都是無Schema
支持的資料量 PB+ TB+ ~ PB 兩者支持的量并不好說的太死, 都支持分片和橫向擴展, 但是相對來說MongoDB的資料量支持要更大一點
性能 非常好 MongoDB在大部分場景性能比es強的多得多
索引結構 B樹 LSM樹 es追求寫入吞吐量, MongoDB讀寫比較均衡
操作介面 TCP Restful(Http)
是否支持分片
是否支持副本
選主演算法 Bully(霸凌) Bully(霸凌) 相比于Paxos和Raft演算法實作更簡單并有一定可靠性上的妥協,但是選舉速度比較快
擴展難度 容易 非常容易 es真的是我用過的擴展最方便的存盤系統之一
配置難度 非常容易
地理位置 支持 支持
運維工具 豐富 一般
插件和引擎 有多個存盤引擎供選擇 有大量插件可以使用 -

兩者的定位

MongoDBElasticsearch都屬于NoSQL大家族, 且都屬于檔案型資料存盤

所以這兩者的很多功能和特性高度重合, 但其實兩者定位完全不同

MongoDB 是 檔案型資料庫, 提供 資料存盤和管理服務
Elasticsearch是搜索服務, 提供 資料檢索服務

兩者的很大區別在于源資料的存盤和管理

  • MongoDB作為一個資料庫產品, 是擁有源資料管理能力的
  • Elasticsearch作為一個搜索引擎, 定位是提供資料檢索服務, 也就是說我只管查, 不管寫 _, Elasticsearch的Mapping不可變也是為此服務的, 帶來的代價就是es不適合作為資料管理者, es可以從其他資料源同步資料過來提供查詢, 但是不適合自己對資料進行存盤和管理

es更側重資料的查詢, 各種復雜的花式查詢支持的很好, 相比來說 MongoDB的查詢能力就顯得比較平庸了

由此可見, 對于個人, 如果你有一批資料要看, 但是不經常進行修改, 這個時候毫無疑問可以用es, 但是如果你還打算繼續修改資料, 最好就是使用MongoDB,但其實對大多數人公司來講,這兩者的資料管理能力并沒有多大的影響

ps: es修改Mapping的代價非常高, 所以我們一般都是把新資料重新寫入一份新索引,然后直接切換讀取的別名到新的索引

兩者讀寫資料的異同

MongoDBElasticSearch都支持全文索引, 雖然MongoDB的全文索引效果完全無法跟es相比(es畢竟是專業的搜索引擎產品, 著重提供資料的檢所支持, 這方面吊打MongoDB也是可以理解的)

MongoDB雖然在支持的部分查詢功能上稍微弱于es, 但是在大部分場景下性能方面完爆es, 不管是讀性能, 還是寫性能

es的寫入延遲默認為1s, 這個雖然是寫入延遲的范疇, 但是毫無疑問是一大缺點, 雖然可以配置為更短的時間, 但是這樣就要犧牲一定的資料吞吐量, 會造成更頻繁的磁盤重繪操作

es底層使用Lucene作為核心引擎, 很多es的設計就是為了匹配Lucene中的概念, 其實es可以看成一個lucene的proxy層包裝,將lucene的原生介面封裝的更好用, 同時還實作了很多管理和監控等輔助功能, 但是整體來說es上層的模塊和lucene的隔閡還是挺明顯的, 耦合度上有一定的欠缺

MongoDB則是完整的一個單體資料庫產品, 雖然內部的存盤引擎也是可插拔式的, 整體而言還是更加的渾然一體

MongoDB支持多種存盤引擎, 本文所有涉及mongo存盤引擎的只談默認的WiredTiger引擎, 其實還有某些方面更優秀的其他引擎,例如: MongoRocks等

部署和資源占用

單機部署的話其實MongoDB和Elasticsearch都十分的方便, 不過es相對來順澩占用更多一點, 性能也比MongoDB要弱一點

集群化的部署, 我們一般都會選擇分片+副本的部署方式, 這種方式下, es部署起來比MongoDB方便太多, MongoDB要部署一套完整的分片 + 副本模式還是比較麻煩的, 沒有經驗的人部署起來需要一定的學習成本

資源占用方面, MongoDB可以支持存盤檔案型別的資料, 作為資料庫也有資料壓縮能力, es則因為大量的索引存在需要占用大量的磁盤和記憶體空間

可用性和容錯

MongoDB和ElasticSearch作為天生分布式的代表產品都支持資料分片和副本

兩者都通過分片支持水平擴展, 同時都通過副本來支持高可用(HA)

分片就是一個資料集的資料分為多份, 同時分布在多個節點上存盤和管理, 主流分片方式有兩種: hash分片和range分片, 兩種分片方式各有優勢, 適合不同的場景

副本就是一份資料集同時有一個或者多個復制品(有些地方叫主從), 每份復制品都一模一樣, 但是為了保證資料的一致性, 往往多個副本中只有一個作為Primary副本(通過選主演算法從多個副本中選出Primary), 提供寫服務, 其他副本只提供讀, 或者只提供備份服務

ps:es和MongoDB都可以通過副本增強讀能力, 這與kafka很不一樣(kafka的副本只有備份功能)

兩者分布式方案的一些不同

MongoDB和Elasticsearch雖然都是分布式服務, 但是還是有一些不同方案的選擇的

  • 分片和副本單位的劃分

MongoDB是以節點為單位劃分角色, 一旦一個節點被指定為副本, 其上面的資料都是副本

Elasticsearch是以分片為單位劃分角色, 一個節點上即可以擁有某分片的主分片和可以同時擁有另一個分片的副本分片, 同時es還支持自動的副本負載均衡, 如果一個新節點上面什么資料都沒有, 系統會自動分配分片資料過來

  • 架構模式

MongoDB的副本和分片是兩種不同的模式, 雖然可以同時使用但是依然有各自的架構設計, 用戶可以任意選擇選型進行搭配, 每個節點的職責更加專一, 方便據此調整機器配置和進行優化

Elasticsearch中的分片 + 副本是一套統一的架構設計, 每個節點具有接近同等的地位, 配置使用起來更加簡單, 但是如果要針對節點所負責的功能對機器進一步做定制就不如MongoDB靈活

檔案型資料庫的特點和問題

無schema

檔案型資料存盤既能享受無schema限制帶來的靈活, 又能享受索引查詢的快速和類SQL查詢的便捷

使他們用起來不像傳統的RDBMS那么麻煩, 又不像 Redis,Hbase這種資料庫查詢功能不夠強大, 處在一個傳統RDBMS和經典K-V存盤之間的比較均衡的位置

我個人很喜歡這個特性, 沒有schema的限制, 存盤資料更方便也更靈活了, 但是有得有失, 很多固定schema的好處就無法享受到了, 比如: 對資料的高效壓縮

雞肋的Collection 和 Type

早期為了跟傳統rdbms資料庫保持概念一致 ,mongodb和elasticsearch都設計了跟傳統資料庫里面的庫->表->記錄行對應的概念,具體如下

RDBMS MongoDB Elasticsearch
索引
集合 型別
記錄 檔案 檔案

其實對于nosql資料庫來講, 集合/型別的意義其實不大, Nosql資料庫幾乎都是k-v型別的存盤結構,完全可以通過key進行業務隔離和區分,真的沒有必要為了跟傳統資料庫對應強行搞出來一個中間概念 _

Elasticsearch從6.x版本開始強制只允許一個索引使用一個type, 其實就是意識到這個這個設計的失誤, 不想讓你用這個type型別, 因為type和傳統資料庫里面的表概念其實是不一樣的,這種概念類比給人造成了誤解,到了es的7.x版本會默認取消type型別, 就說明這個type欄位真的是雞肋的不行

弱事務

MongoDB以前只是支持同一檔案內的原子更新, 以此來實作偽事務功能, 不過Mongo4.0支持Replica Set事務, 大大加強了事務方面的能力

es在這方面倒沒有什么進展,因為從應用場景上es對事務的需求不高,不過用戶其實也可以使用同檔案更新或者通程序式自己來實作事務機制

無join支持

檔案型資料庫大多數都不支持join(也有少量支持的), 但是我一般也用不上多表join的功能, 即便真的需要使用join也可以通過應用層或者通過耦合資料來實作(不過據說未來Mongo4.2版本會帶來對join的支持)

不支持join帶來的問題就是我們需要自己對資料進行連接, 但是這在擅長使用分布式計算的大資料領域不算什么問題, 相應的缺少join功能可能對善于使用SQL的資料分析師就不大友好

Bully的選主演算法的缺陷

elasticsearch和MongoDB選擇的選主演算法實作很簡單, 但是代價就是有幾率出現腦裂的情況, 當然, 具體情況跟配置也有關系(比如:你有三個es節點但是設定的最小主節點數為1, 將最小主節點數設定為2可以避免腦裂情況)

不過腦裂問題一方面發生概率較低,另一方面即使出現了腦裂的情況, 使用重啟大法一般就能解決 _

總體來說, 這方面不如使用Paxos和Raft演算法或者使用zk做協調器的其他分布式系統靠譜

其他

  • 運維工具

兩者背后都有商業公司的支持

MongoDB的很多客戶端和運維工具更豐富, 但是MongoDB作為一個資料庫產品, 相對應的對運維人員的要求也要更高一點

Elasticsearch則有整套的資料分析和收集工具提供, 配套的kibana就是一個很不錯的管控es的工具

  • 操作介面

es使用Restful來提供統一的操作介面, 屏蔽了各種語言之間的障礙, 但是同樣帶來了表達能力和性能的損失

MongoDB則使用TCP, 降低了序列化和網路這一層的性能損耗, 并最大程度保留了介面的內容表達能力, 但是相對的使用起來就不如http那么的方便

適用場景

兩者其實在很多使用場景上有重合之處, 是可以互相替代, 比如日志收集

但是某些方面兩者又各有特色,比如: 如果打算使用一個檔案型的業務資料庫, 那最好還是選mongodb, 如果你有要求復雜查詢又并發性能要求高的場景,類似搜索服務,那最好的選擇是elasticsearch

除此之外:

MongoDB有多個存盤引擎可以選擇, 而且MongoDB不僅看重資料的分析, 對資料的管理同樣看重, 總的來說MongoDB更傾向于資料的存盤和管理, 可以作為資料源對外提供, 未來說不定還會有支持join和支持倒排索引的mongo引擎出現

Elasticsearch則有很多插件可以使用, 相對來講Elasticsearch更傾向于資料的查詢, 一般情況下elasticsearch僅作為資料檢索服務和資料分析平臺, 不直接作為源資料管理者

  • MongoDB適合
  1. 對服務可用性和一致性有高要求
  2. 無schema的資料存盤 + 需要索引資料
  3. 高讀寫性能要求, 資料使用場景簡單的海量資料場景
  4. 有熱點資料, 有資料分片需求的資料存盤
  5. 日志, html, 爬蟲資料等半結構化或圖片,視頻等非結構化資料的存盤
  6. 有js使用經驗的人員(MongoDB內置操作語言為js)
  • Elasticsearch適合
  1. 已經有其他系統負責資料管理
  2. 對復雜場景下的查詢需求,對查詢性能有要求, 對寫入及時性要求不高的場景
  3. 監控資訊/日志資訊檢索
  4. 小團隊但是有多語言服務,es擁有restful介面,用起來最方便

總結

MongoDB和Elasticsearch都是我比較喜歡的存盤產品

兩者的功能特性也存在很多重合的地方, 其實作在很多資料庫產品都在互相借(chao)鑒(xi), 功能和特性都在逐漸變得相似, 這也是未來很多存盤產品的發展趨勢, 大家都希望自己能覆寫盡量多的場景和用戶群體

很多產品總是在不斷的從沒有->->功能豐富,但是功能豐富一定是做了很多的妥協, 于是又有了 功能眾多的單體服務->多個功能單一的子服務 方向的轉變,就像三國里面說的 “天下大勢, 分久必合合久必分”.

現在NoSQL資料庫產品就在這個路上, NoSQL歸根到底都是 RDBMS的某個方面的妥協, 現在各種NoSQL 也都在加入對經典SQL和傳統RDBMS的 join, 事務的支持, 但是我相信等到兩者區別足夠小的時候, 一定會有放棄了大而全, 而專注于某一場景的新的存盤產品出現,到時候搞不好又是一波新的Nosql潮流

轉載:https://blog.csdn.net/kongliand/article/details/108691847

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/544511.html

標籤:NoSQL

上一篇:數倉在線運維:如何進行在線增刪CN?

下一篇:sql中exists 和 in的對比

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more