Elasticsearch
简介:
Elasticsearch是一个基于Lucene,使用Java开发的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,而且基于RESTful web接口。
主要功能
- 海量数据的分布式存储以及集群管理
- 服务与数据的高可用,水平扩展
- 近实时搜索,性能卓越
- 结构化/全文/地理位置/自动完成
- 海量数据的近实时分析
- 聚合功能
文档(Document)
- Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位
- 日志文件中的日志项
- 电影/MP3/文档的具体信息
- 文档会被序列化喂JSON格式,保存再Elasticsearch 中
- JSON队友由字段组成
- 每个字段都由对应的字段类型
- 每个文档都有一个Unique ID
- ID可以自己指定或者Elasticsearch自动生成
文档的元数据
- _index:文档的索引名
- _type: 文档所属的类型名
- _id:文档的唯一ID
- _source:文档的原始Json数据
- _all:整个字段所有内容到该字段,目前已经被废除
- _version:文档的版本信息
索引
- 索引是文档的容器,是一类文档的结合
- Index体现了逻辑空间的概念,每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型
- Shard 体现了物理空间的盖面,索引中的数据分散再Shard上
- 索引的Mapping和Setting
- Mapping定义文档字段的类型
- Setting定义不同的数据分布
节点
- 节点是一个Elasticsearch的实例
- 本质上就是一个Java进程
- 一台机器上可以运行多个Elasticsearch进程
- 每个节点都有名字,通过配置文件设置,或者启动时候用-E node.name=node1 指定
- 每个节点启动之后,会分配一个UID,保存在data目录下
节点状态
- green:主分片和副本分片都有
- yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的
- red:至少一个主分片(以及它的全部副本)都在缺失中
Master Node 和 Master-eligible nodes
- 节点启动后,默认就是一个Master-eligible 节点。当第一个节点启动时,会将自己选举成为Master节点
- Master-eligible 参加选主流程,成为Master节点
- 每个节点上保存了集群的状态,只有Master节点才能修改
- 集群状态的信息包括:所有节点的信息,所有的索引和相关的Mapping和Setting信息,分片的路由信息
- 任意节点都能修改信息会导致数据的不一致性
Data Node 和Coordinating Node
- Data Node 用于保存数据的节点,负责保存数据分片
- Coordinating Node 负责接收Client端的请求,将请求分发到合适的节点。每个节点默认都起到Coordinating Node的职责
其他类型的节点
- Hot & Warm Node: 不同硬件配置的Data Node,用于实现Hot & Warm 架构
- Machine Learning Node:负责跑机器学习的Job,用于做异常检测
- Tribe Node: 连接不同的集群,并且支持将这些集群当成一个单独的集群处理
分片
主分片(Primary shard)
用于解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点上。一个分片就是一个运行Lucene的实例,并且再索引创建时指定,后续不允许修改,除非Reindex
副本分片(replica shard)
用以解决数据高可用的问题,是主分片的拷贝。副本分片数可以动态调整。
分片的设定
- 分片数设置过小
- 导致后续无法增加节点实现水平扩展
- 单个分片数据太大,导致数据重新分配耗时
- 分片设置过大
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单节点上过多的分片,会导致资源浪费,同时影响性能
Mapping
Mapping类似于数据库中的schema
作用:
- 定义索引中的字段名称
- 定义字段的数据类型
- 字段,倒排索引的相关配置
- Mapping会将JSON格式映射成Lucene所需要的扁平格式
- 一个Mapping属于一个索引的type