Elasticsearch学习(1)—— 简介

【简介】

  1. Elasticsearch ( ES ) 是一个基于 Lucene实时分布式开源的全文搜索和分析引擎。它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的。
  2. Elasticsearch 通常用于单页面应用 ( Single Page Application ) 项目中,这个应用程序像 Google 和百度一样,提供一个搜索框用于输入关键字,然后返回一个包含搜索结果的列表。
  3. Elasticsearch 使用 Java 语言开发,使用 Elastic 开源协议,已经被世界各地的各个大型的公司或组织使用。
  4. Elasticsearch 通过 RESTful Web 服务接口访问,并使用 JSON 文档来存储数据。

【Elasticsearch 优点】

  1. 跨平台:Elasticsearch 使用 Java 作为开发语言,所以可以运行在任何平台上;

  2. 近实时:在Elasticsearch和磁盘之间是文件系统缓存,内存buffer生成一个新的segment,刷到文件系统缓存中,Lucene即可检索到这个新的segment。刷到文件系统缓存中这个步骤,Elasticsearch默认1s的时间间隔,这也就是说相当于是实时搜索的

  3. 分片机制提供更好的分布性:同一个索引分成多个分片(sharding),这点类似于HDFS的块机制;分而治之的方式来提升处理效率,相信大家都不会陌生;

  4. 横向可扩展性:只需要增加一台服务器,做一点儿配置,启动一下ES进程就可以并入集群;各种规模的公司都可以选用,根据自己的数据规模选择集群的大小,并且有合理的分布式架构,单个计算节点宕机不会造成整体系统的崩溃;
  5. 高可用:提供复制(replica)机制,一个分片可以设置多个复制,使得某台服务器宕机的情况下,集群仍旧可以照常运行,并会把由于服务器宕机丢失的复制恢复到其它可用节点上;这点也类似于HDFS的复制机制(HDFS中默认是3份复制);
  6. 弹性:硬件故障。网络瞬断。Elasticsearch 为您检测这些故障并确保您的集群(数据)安全和可用。

  7. 灵活性:数字、文本、地理位置、结构化、非结构化。所有的数据类型都欢迎。应用搜索、安全分析或是日志分析只是全球众多公司利用 Elasticsearch 解决各种挑战的冰山一角。

  8. 多租户:与 Apache Solr 相比,Elasticsearch 中处理多租户非常容易;

  9. Elasticsearch 使用 JSON 对象作为响应,这是当下最流行的数据交换格式;

  10. Elasticsearch 几乎支持所有文档类型,但不能渲染的文本除外,例如二进制数据;

【Elasticsearch 缺点】

  1. 各节点的一致性问题:其默认的机制是通过多播机制,同步元数据信息,但是在比较繁忙的集群中,可能会由于网络的阻塞,或者节点处理能力达到饱和导致各节点元数据不一致——也就是所谓的脑裂问题,这样会使集群处于不一致状态。目前并没有一个彻底的解决方案来解决这个问题,但是可以通过将工作节点与元数据节点分开的部署方案来缓解这种情况。
  2. 没有细致的权限管理机制,也就是说,没有像MySQL那样的分各种用户,每个用户又有不同的权限。所以在操作上的限制需要自己开发一个系统来完成;

==================================================

Elasticsearch分布式搜索引擎架构图

RESTful API:使用 HTTP 作为传输协议,使用 JSON 作为数据交换格式,所有的语言都可以使用 RESTful API,通过 9200 端口的与 Elasticsearch 进行通信。

常见的请求格式:

curl -X<VERB> -HContent-Type:application/json '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

参数说明
VERBHTTP 请求方法:GET, POST, PUT, HEAD, DELETE
Content-Type:application/json可选,用于指定请求正文的数据格式为 JSON
PROTOCOLhttp 或者 https 协议,只有在 Elasticsearch 前有 https 代理的时候可用
HOSTElasticsearch 集群中的任何一个节点的主机名,如果是在本地的节点,则是 localhost
PORTElasticsearch HTTP 服务所在的端口,默认为9200
PATHAPI 路径 ( 例如 _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的重新分配。

目前支持的自动发现机制:

  1. Azure discovery 插件方式,多播
  2. EC2 discovery 插件方式,多播
  3. Google Compute Engine (GCE)discovery 插件方式多播
  4. 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 云存储服务。

转载于:https://my.oschina.net/liyurong/blog/1841902

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值