【简介】html
【Elasticsearch 优势】java
跨平台:Elasticsearch 使用 Java 做为开发语言,因此能够运行在任何平台上;node
近实时:在Elasticsearch和磁盘之间是文件系统缓存,内存buffer生成一个新的segment,刷到文件系统缓存中,Lucene便可检索到这个新的segment。刷到文件系统缓存中这个步骤,Elasticsearch默认1s的时间间隔,这也就是说至关因而实时搜索的;python
分片机制提供更好的分布性:同一个索引分红多个分片(sharding),这点相似于HDFS的块机制;分而治之的方式来提高处理效率,相信你们都不会陌生;数据库
弹性:硬件故障。网络瞬断。Elasticsearch 为您检测这些故障并确保您的集群(数据)安全和可用。json
灵活性:数字、文本、地理位置、结构化、非结构化。全部的数据类型都欢迎。应用搜索、安全分析或是日志分析只是全球众多公司利用 Elasticsearch 解决各类挑战的冰山一角。缓存
多租户:与 Apache Solr 相比,Elasticsearch 中处理多租户很是容易;安全
Elasticsearch 使用 JSON 对象做为响应,这是当下最流行的数据交换格式;服务器
Elasticsearch 几乎支持全部文档类型,但不能渲染的文本除外,例如二进制数据;网络
【Elasticsearch 缺点】
RESTful API:使用 HTTP 做为传输协议,使用 JSON 做为数据交换格式,全部的语言均可以使用 RESTful API,经过 9200 端口的与 Elasticsearch 进行通讯。
常见的请求格式:
curl -X<VERB> -HContent-Type:application/json '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
参数 说明 VERB HTTP 请求方法:GET, POST, PUT, HEAD, DELETE Content-Type:application/json 可选,用于指定请求正文的数据格式为 JSON PROTOCOL http 或者 https 协议,只有在 Elasticsearch 前有 https 代理的时候可用 HOST Elasticsearch 集群中的任何一个节点的主机名,若是是在本地的节点,则是 localhost
PORT Elasticsearch HTTP 服务所在的端口,默认为9200 PATH API 路径 ( 例如 _count
将返回集群中文档的数量
PATH 能够包含多个组件,例如_cluster/stats
或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如 ?pretty
参数将使请求返回更加美观易读的JSON
数据BODY 一个 JSON
格式的请求主体,若是请求须要的话
网络层使用Netty,提供http rest和RPC两种协议。
Rest 和 RPC:
Elasticsearch 的rest请求的传递流程如上图(这里对实际流程作了简化): 1. 用户发起http请求,Elasticsearch 的9200端口接受请求后,传递给对应的RestAction。 2. RestAction作的事情很简单,将rest请求转换为RPC的TransportRequest,而后调用NodeClient,至关于用客户端的方式请求RPC服务,只不过transport层会对本节点的请求特殊处理。
Transport:elasticsearch 内部的节点或者集群与客户端之间的交互方式。同时兼有client和server功能,server端接收其余节点的链接,client维持和其余节点的链接,承担了节点之间请求转发的功能。Elasticsearch 为了不传输流量比较大的操做堵塞链接,因此会按照优先级建立多个链接,称为channel。
默认的内部是使用 tcp 协议来进行交互的,同时它支持 http 协议(json格式)、thrift、servlet、memcached、zeroMQ等多种的传输协议(经过插件方式集成)。
- recovery: 2个channel专门用作恢复数据。若是为了不恢复数据时将带宽占满,还能够设置恢复数据时的网络传输速度。
- bulk: 3个channel用来传输批量请求等基本比较低的请求。
- regular: 6个channel用来传输通用正常的请求,中等级别。
- state: 1个channel保留给集群状态相关的操做,好比集群状态变动的传输,高级别。
- ping: 1个channel专门用来ping,进行故障检测。
每一个节点默认都会建立13个到其余节点的链接,而且节点之间是互相链接的,每增长一个节点,该节点会到每一个节点建立13个链接,而其余每一个节点也会建立13个连回来的链接。
JMX:(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX能够跨越一系列异构操做系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
Discovery:该模块主要负责集群中节点的自动发现和Master节点的选举。节点之间使用p2p的方式进行直接通讯,不存在单点故障的问题。Elasticsearch中,Master节点维护集群的全局状态,好比节点加入和离开时进行shard的从新分配。
目前支持的自动发现机制:
- Azure discovery 插件方式,多播
- EC2 discovery 插件方式,多播
- Google Compute Engine (GCE)discovery 插件方式多播
- zen discovery 默认实现 多播/单播
Scripting:使用脚本语言能够计算自定义表达式的值,好比计算自定义查询相关度评分。支持的脚本语言有groovy,js,mvel(1.3.0废弃),python等。
Index,Search,Mapping以后讲
River:表明的是一个数据源,这也是其它存储方式(好比:数据库)同步数据到 elasticsearch 的一个方法。它是以插件方式存在的一个 elasticsearch 服务,经过读取 river 中的数据并把它索引到 elasticsearch 当中去,官方的 river 有 couchDB、RabbitMQ、Twitter、Wikipedia。
Distributed Lucene Directory:Elasticsearch是基于Lucene的搜索引擎。
一个 Lucene 的索引是由多个Segment构成的,一个段又是一个完整的倒排索引。段是不可变的,使 Lucene 能够将新的文档以增量的形式加入到索引,无须对索引进行重建,每一个段都会消耗 CPU 时钟,文件句柄和内存。这也意味着段越多,搜索的性能将会越差。
为了解决这个问题,Elasticsearch 会将不少小段合并成大的段(以下图所示),并将新的合并的段提交到磁盘,而后删除老的小段。
这个过程是在后台自动执行的,不会影响索引或搜索。由于段合并会占用资源并影响搜索的性能,Elasticsearch 会对合并进程节流,保证搜索有足够可用的资源。
Gateway:gateway 表明 elasticsearch 索引的持久化存储方式,elasticsearch 默认是先把索引存放到内存中去,当内存满了的时候再持久化到硬盘里。当这个 elasticsearch 集群关闭或者再次从新启动时就会从 gateway 中读取索引数据。elasticsearch 支持多种类型的 gateway,有本地文件系统(默认),分布式文件系统,Hadoop 的 HDFS 和 amazon 的 s3 云存储服务。