MongoDB 是一個典型的NoSQL(not only sql)數據庫是開源的面向文檔的數據庫管理系統,主要實現NoSQL數據庫管理系統,用於存儲海量數據(humongous,Mongo名稱的由來)。。
ElasticSearch是基於Apache Lucene 的RESTful 實時搜索和分析引擎。ES基於數據抽取一些值,提供實時存儲、索引、搜索和分析數據功能,這些數據收集自其他數據源(包括MongoDB),可以直接存儲在Elasticsearch集群中。
一、共同點:
面向文檔存儲,無Schema,分布式數據存儲,高可用性,分片和復制等。雖然使用ElasticSearch作為主數據存儲是可行的,但一般做為主數據庫的輔助數據庫。
二、不同點:
1、Elasticsearch是java編寫,通過RESTFul接口操作數據。MongoDB是C++編寫,通過driver操作數據。
2、MongoDB的分片有hash和range兩種方式,Elasticsearch只有hash一種。
3、Elasticsearch是天生分布式,主副分片自動分配和復制,開箱即用。MongoDB的分布式是由“前置查詢路由+配置服務+shard集合”,需要手動配置集群服務。
4、內部存儲ES是倒排索引+docvalues+fielddata。
5、Elasticsearch全文檢索有強大的分析器且可以靈活組合,查詢時智能匹配。MongoDB的全文檢索字段個數有限制。
6、Elasticsearch所有字段自動索引,MongoDB的字段需要手動索引。Elasticsearch 使用 Apache Lucene 實現索引,而 MongoDB 索引是基於傳統的B+ 樹結構。Elasticsearch利用Lucene實現實時索引和搜索功能,默認支持在文檔的每個字段上創建索引。而 MongoDB,我們必須定義索引用於提升查詢性能,但會影響寫操作。
7、Elasticsearch非實時有數據丟失窗口。mongodb實時理論上無數據丟失風險。
8、文檔 - Elasticsearch 存儲 JSON 文檔, MongoDB 采用BSON格式存儲 (Binary JSON)。
9、REST 接口 - Elasticsearch 提供 RESTful接口,MongoDB 不提供 RESTful接口。
10、MapReduce - MongoDB 支持 MapReduce 數據操作。 Elasticsearch 不支持 MapReduce。
三、使用場景:
MongoDB是通用功能的非RESTful風格的 NoSQL 數據庫. 文檔以 BSON 格式存儲,主要用於存儲數據。
Elasticsearch 是分布式全文檢索引擎,可以提供實時Restful風格API處理海量面向文檔的數據。文檔使用JSON格式,主要用於基於文本的數據搜索。
在實際應用中兩者通常同時使用,Elasticsearch一般不作為主存儲數據庫,而是和SQL & NoSQL數據庫一起使用,作為輔助數據庫。
與MongoDb不同, Elasticsearch 默認沒有提供安全特性,如認證和授權。Elasticsearch和 Logstash & Kibana 一起稱為ELK stack,用於快速查詢數據並可視化展現分析數據。
Elasticsearch 非常適合需要基於文本進行快速索引然后進行檢索,其查詢速度非常快,大多數情況速度最多幾十毫秒。
因此,Elasticsearch 通常作為主數據庫存儲的輔助存儲庫。一般數據庫系統更聚焦於約束、准確性和健壯性。當主記錄在事務中更新時,其會同時被推送至Elasticsearch中。
一般典型使用PostgreSQL 和 ZooKeeper 負責數據的存儲, 同時提供給Elasticsearch實現實時檢索。
沒有萬能的產品,沒有所謂的銀彈,沒有一個數據庫可以滿足所有需求。所以我們需要了解不同數據庫的優勢和劣勢,並選擇合適的產品用於特定的需求。