背景
现今有各种数据库来进行数据存储,例如 Elasticsearch、Oracle、Postgres、MongoDB 和 MySQL 等。Elasticsearch 和 MongoDB 是盛行的面向文档的数据库。两者都是分布式和高度可扩展的数据存储。两个数据库都供应备份和规复功能。除了一些共同特色外,它们还具有一些差异,使它们彼此不同。
MongoDB先容
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 措辞编写。旨在为 WEB 运用供应可扩展的高性能数据存储办理方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB供应数据库的社区版和企业版:
MongoDB社区是MongoDB的可用源和免费版本。MongoDB Enterprise作为MongoDB Enterprise Advanced订阅的一部分供应,并包括对MongoDB支配的全面支持。MongoDB Enterprise还添加了以企业为中央的功能,例如LDAP和Kerberos支持,磁盘加密和审计。特点
MongoDB 是一个面向文档存储的数据库,操作起来比较大略和随意马虎。你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。如果负载的增加(须要更多的存储空间和更强的处理能力) ,它可以分布在打算机网络中的其他节点上这便是所谓的分片。Mongo支持丰富的查询表达式。查询指令利用JSON形式的标记,可轻易查询文档中内嵌的工具及数组。MongoDb 利用update()命令可以实现更换完成的文档(数据)或者一些指定的数据字段 。Mongodb中的Map/reduce紧张是用来对数据进行批量处理和聚合操作。Map和Reduce。Map函数调用emit(key,value)遍历凑集中所有的记录,将key与value传给Reduce函数进行处理。Map函数和Reduce函数是利用Javascript编写的,并可以通过db.runCommand或mapreduce命令来实行MapReduce操作。GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。MongoDB许可在做事端实行脚本,可以用Javascript编写某个函数,直接在做事端实行,也可以把函数的定义存储在做事端,下次直接调用即可。MongoDB支持各种编程措辞:RUBY,PYTHON,JAVA,C++,PHP,C#等多种措辞。MongoDB安装大略。基本观点
数据库:数据库是用于存储数据的物理容器,每个数据库在文件系统中都有属于自己的文件集。凑集:凑集便是一组 MongoDB 文档的组合,类似于关系型数据库(例如 MySQL)中的数据表。凑集存在于数据库中,且没有固定的构造,您可以向凑集中插入不同格式或类型的数据。文档:文档是 MongoDB 中数据的基本单位,由 BSON 格式(一种打算机数据交流格式,类似于 JSON)的键/值对组成,类似于关系型数据库中的一行行数据,但要相对繁芜一些。文档具有动态模式,所谓动态模式便是同一凑集中的文档不须要具有相同的字段,纵然是相同的字段也可以是不同的类型,这与关系型数据库有很大的差异,也是 MongoDB 最突出的特点之一。数据模型
MongoDB 供应了两种数据模型,分别是嵌入式数据模型和规范化数据模型,您可以根据须要利用个中的任何一种。
嵌入式数据模型:嵌入式数据模型也称为非规范化数据模型,在该模型中您可以将所有干系的数据存储到一个文档中,例如我们在三个不同的文档等分别存储了一个员工的个人信息、联系办法和地址等信息,您还可以将这些信息整合到一个文档中规范化数据模型:在规范化数据模型中,您可以通过引用来将原始文档与子文档关联起来在 MongoDB 中模型设计须要把稳以下几点:
要根据详细的项目需求来选择得当的设计模式;如果是要同时利用的数据,您可以将它们合并到一个文档中,否则可以选择将它们分成多少个文档;可以有适当的数据冗余,由于与打算韶光比较,磁盘空间更便宜;针对最常用的用例优化您的模型;写入时实行连接,而不是读取时实行连接;在模式中实行繁芜聚合。Elastcisearch
先容
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据剖析引擎。Elasticsearch是用Java措辞开拓的,并作为Apache容许条款下的开放源码发布,是一种盛行的企业级搜索引擎。Elasticsearch 以其易用性迅速赢得了许多用户,被用在网站搜索、日志剖析等诸多方面。由于 ES 强大的横向扩展能力,乃至很多人也会直接把 ES 当做 NoSQL 来用。
特性
搜索引擎:通过 Elasticsearch,您能够实行及合并多种类型的搜索(构造化数据、非构造化数据、地理位置、指标),搜索办法随心而变
剖析引擎:对的是十亿行日志,Elasticsearch 聚合让您能够从大处着眼,探索数据的趋势和规律
检索性能:通过有限状态转换器实现了用于全文检索的倒排索引,实现了用于存储数值数据和地理位置数据的 BKD 树,以及用于剖析的列存储
可扩展性:能够水平扩展,每秒钟可处理海量事宜,同时能够自动管理索引和查询在集群中的分布办法,以实现极其流畅的操作
检索能力:基于各项元素(从词频或新近度到热门度等)对搜索结果进行排序。将这些内容与功能进行混搭,以优化向用户显示结果的办法
数据容错:通过跨集群复制功能,赞助集群可以作为热备份随时投入利用。
实时互动:在 Kibana 中通过炫酷的可视化来探索您的数据,从华夫饼图到热点图,再到时序数据剖析,搜罗万象
数据构造
index(索引):索引是文档(Document)的容器,是一类文档的凑集,类比传统的关系型数据库来说,索引相称于SQL中的一个数据库(Database)
Type(类型):从 6.0.0开始单个索引只能有一个类型,7.0.0往后将不建议利用,8.0.0往后完备不支持
Document(文档):Document Index 里面单条的记录成为Document(文档)。等同于关系型数据库表中的行
Field(字段):属性Fieldl类似于关系型数据库的字段的观点,一样的,每个属性有自己不同的类型,类型包括核心类型、繁芜类型(工具类型[object]和嵌套类型[nested])、地理类型以及分外类型
集群
Elasticsearch 可以横向扩展至数百(乃至数千)的做事器节点,同时可以处理PB级数据。ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大( 垂直扩容 ,或 纵向扩容 ) 或者数量更多的做事器( 水平扩容 ,或 横向扩容 )来实现。虽然 Elasticsearch 可以获益于更强大的硬件设备,但是垂直扩容是有极限的。 真正的扩容能力是来自于水平扩容—为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中。对付大多数的数据库而言,常日须要对运用程序进行非常大的改动,才能利用上横向扩容的新增资源。与之相反的是,ElastiSearch天生便是 分布式的 ,它知道如何通过管理多节点来提高扩容性和可用性。 这也意味着你的运用无需关注这个问题 。
集群支持如下功能:
集群康健故障转移水平扩容应对故障结论MongoDB 是 文档型数据库, 供应 数据存储和管理做事,Elasticsearch 是搜索做事, 供应 数据检索做事,Elastciseach倾向于检索、查询、数据剖析,适用于OLAP系统。MongoDB倾向于大数据规模下的CRUD,适用于对事务哀求不强的OLTP系统。 MongoDB是一个通用性数据库,Elasticsearch是一个Lucene支持的分布式文本检索引擎。针对大型数据集的索引与检索功能,Elasticsearch性能非常优胜。
相同点:
都因此json格式管理数据的nosql数据库。都支持CRUD操作。都支持聚合和全文检索。都支持分片和复制。都支持阉割版的join操作。都支持处理超大规模数据。目前都不支持事务或者叫支持阉割版的事务。不同点:
es是java编写,通过RESTFul接口操作数据。mongodb是C++编写,通过driver操作数据。(es对java开拓更有好,利于排查理解)mongodb的分片有hash和range两种办法,es只有hash一种。es是天生分布式,主副分片自动分配和复制,开箱即用。mongodb的分布式是由“前置查询路由+配置做事+shard凑集”,须要手动配置集群做事。内部存储ES是到排索引+docvalues+fielddata。mongodb暂时未知。es全文检索有强大的剖析器且可以灵巧组合,查询时智能匹配。mongodb的全文检索字段个数有限定。es所有字段自动索引,mongodb的字段须要手动索引。es非实时有数据丢失窗口。mongodb实时理论上无数据丢失风险。