Elasticsearch原理(上)
Elasticsearch原理
-
ES是啥:
- Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;
-
ES应用场景:
- 站内搜索
- 日志解析:日志,事物数据,分析和挖掘,趋势,统计,摘要和异常
- 价格提醒
- 商业统计:快速调查,分析,可视化,从一堆数据中获取问题答案
-
倒排索引:
- 倒排索引:一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射
是一种将词项映射到文档的数据结构
-
Lucence简介:
- Lucence:高效、可扩展、全文检索库(开发工具包),java编写,支持跨平台
- 特征:
- 可扩展,高性能索引
- 强悍,准确,高效的搜索算法
- 跨平台
- Apache软件基金
-
ES基本概念:
- 集群:由多个节点组成,提供一个完整的数据索引,并结合所有节点进行查询,一个集群有唯一的集群名(cluster_name),默认为elasticsearch,配置文件中指定
- 节点:集群一部分,是一个单独的服务器,参与索引并查询数据,通过集群名加入集群
- 索引:一些有相似特征的文档的集合,数据索引结构是倒排索引
- 类型:一个索引中可以有多个类型,每个类型有自己的映射结构
- 文档:是一个可被索引的基础信息单元
- 分片:把一个索引分成多个部分,水平分割扩展内容,分布式并行操作分片
- 副本;分片的备份,提高分片和节点的容错性,但是占空间
-
基本概念:
- Master node:有资格成为master
- Data node:存储数据并执行数据操作
- Ingets node:在真正对文档进行索引之前对文件进行预处理,通过定义包含了多个process的pipeline来实现
- Coordinnating node:负责转发请求到对应数据节点,然后汇总各个节点返回的结果,每个节点隐含都是一个coordinating node,如果其他三个参数都是false,那他就单纯是个coordinating node
-
ES相关概念与关系型数据库对应关系:
-
为什么要移除type:
-
REST介绍:
-
REST典型应用:
-
集群扩容:
-
集群健康状态:
- 绿色:所有主分片和副本分片都可用
- 黄色:所有主分片可用,但不是所有副本分片可用
- 红色:不是所有主分片可用
-
ES分布式架构:
- Gateway代表ElasticSearch索引的持久化存储方式, ElasticSearch默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。
当集群关闭或者再次重新启动时就会从Gateway中读取索引数据。Gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器。 - Directory 存储模块
Directory模块它是Lucene里的一些列索引文件组成的目录。它负责管理这些索引文件。包括数据的读取、写入,以及索引的添加和合并等。 - Index 索引模块
每个索引产生一个。下有Analysis(文本分析),Shard allocation(索引分片分配),Field data(域数据)等子模块。 - Search 检索模块
全文搜索、短语搜索等各种搜索方式的支持。 - Mapper 映射
Mapper模块主要负责将类型映射的定义添加到索引上。同时也支持预先没有定义的动态映射类型。
动态映射:
当遇到一个新的字段类型时,Elasticsearch可以自动检测数据类型并能自动添加类型_default_映射。任何建索引或者添加映射时指定的映射将覆盖掉默认值。 - River 数据源
River代表的是一个数据源,这也是其它存储方式(比如:数据库)同步数据到Elasticsearch 的一个方法。它是以插件方式存在的一个 Elasticsearch 服务,通过读取River中的数据并把它索引到Elasticsearch当中去。 - Discovery节点发现模块
Discovery节点发现模块,主要是负责集群的master节点发现。比如某个节点突然离开或进来的情况,进行一个分片重新分片等。这里有个发现机制。
其中Zen发现机制是ElasticSearch中默认的用来发现新节点的功能模块。首先它会通过以广播的方式去寻找存在的节点,然后再通过多播协议来进行节点之间的通信,于此同时也支持点对点的交互操作。
发现机制默认的实现方式是单播和多播的形式,即Zen,同时也支持点对点的实现。另外一种是以插件的形式,即EC2。 - Scripting即脚本语言。包括很多,这里不多赘述。如mvel、js、python等。
- Transport交互模块
Transport代表Elasticsearch内部的节点或者集群与客户端之间的交互方式。
默认的内部是使用 TCP 协议来进行交互的,同时它支持HTTP 协议(json格式)、thrift、servlet、memcached、zeroMQ等多种的传输协议(通过插件方式集成)。 - RESTfull Stype通过RESTful方式来实现API编程
- 3rd plugins:代表第三方插件。
- Java(Netty),开发框架
- JMX:监控
-
ES启动:
- 集群启动是通过discoverty模块发现同一个集群下的其他节点
- Es节点向网络中发送广播请求,已找到同集群名其他节点
- 根据请求响应建立连接
-
故障检测:
- 管理节点监控所有节点,检查是否正常工作
- 管理节点发送ping请求到其他节点,若无响应(ping多少次无响应为失效可定义,超时时间也可定义)
- 所有节点也会向主节点发送ping来确定主节点是否正常
- 若实效则移出节点,重新平衡集群分片或者选择新主节点
-
master选举:
- Master作用
Elasticsearch中的Master并不像mysql、hadoop集群的master那样,它既不是集群数据的唯一流入点,也不是所有元数据的存放点。所以,一般情况下Elasticsearch的Master负载是很低的。
Elasticsearch的Master有一项工作是其他节点做不到的,那就是维护集群状态。 - 集群状态中包括以下信息:
集群层面的设置
集群内有哪些节点
各索引的设置,映射,分析器和别名等
索引内各分片所在的节点位置
上述的集群状态信息,由Master节点进行维护,并且同步到集群中所有节点。也就是说集群中的任何节点都存储着集群状态信息,但只有Master能够改变信息。 - 选举过程:
Ping所有节点,过滤出有master资格的候选节点
看当前集群是否有master,有的话就选为临时master,没有就从候选节点中选出一个临时master,参选人不够重新选
判断选的mater是否是自己,
如果不是就向master发送请求申请加入集群,加入群后获取集群状态发现集群master鱼选的不一致就重选
如果是就等别人选自己的票数过半时,成为matster
-
脑裂:
- 这个配置的意思是说在选举Master的过程中,需要多少个节点通信,说白点就是票数。如果达不到N/2+1,就是超过半数,就会选举失败,重新选举。
资料都是自己从网上查询总结,能力有限,望大家多指导交流