ES的基本概念包括索引、文档、节点和分片。 其中索引、文档偏向开发人员的视角,是一个逻辑概念。而节点和分片偏向的是运维的视角,是一个物理的概念。
文档(Document)
ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位。如
- 日志文件的日志项。
- 一个电影的基本信息。
- 一篇PDF文档中的具体内容
文档会被序列化为JSON格式,保存在ElasticSearch中。
每个文档都有自己的Unique ID,可以自己指定也可以通过ElasticSearch自动生成。
除了文档的信息之外,还有用于描述文档信息的元数据。
_index:文档所属的索引名。_type:文档所属的类型名。_id:文档唯一id。_source:文档的原始JSON数据。_version:文档的版本信息。_score:相关性打分。
索引(Index)
索引是文档的容器,是一类文档的结合。 索引的Mapping定义文档字段的类型,Setting定义不同数据的分布。
节点
节点是一个ES实例。本质上是一个Java进程,一个进程上可以运行多个ES实例,但是生产环境中一个机器只运行一个实例。
每一个节点都有名字,通过配置文件配置。并且每个节点启动后,会分配一个UID,保存在data目录下。
Master-eligible nodes和Master nodes
这是用于分布式集群搭建的。
每个节点启动后,默认就是一个Master eligible节点,这一参加选主流程,成为Master node。
第一个节点启动的时候,会将自己选举为Master 节点。
每个节点都保存着集群的状态,只有Master节点可以修改集群状态,这也是分布式集群的工作方式。
集群状态:
- 所有的节点信息。
- 所有的索引和其相关的Mapping与Setting信息。
- 分片的路由信息。
Data node与Coordinating node
- Data node:用来保存数据的节点。负责保存分片数据,用来进行数据扩展。
- Coordinating node:负责接受Client的请求,将请求分发到合适的节点,最终把结果汇集到一起。每个节点默认都具有这个作用。
其它类型的节点
- 热节点。具有更好的配置的Data node。
- Machine Learning Node:负责跑机器学习任务,用来做任务检测。
- Tribe Node:将会被(Cross Cluster Serarch替代)连接不同的ES集群,并且支持将这些集群当成一个单独的集群处理。
生产环境中,应该设置单一的角色的节点。
分片
- 主分片:用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上。
- 一个分片是一个运行的Lucene实例。
- 主分片在索引创建时指定,后续不允许修改,除非Reindex。
- 副本:用来解决数据高可用的问题。分片时主分片的拷贝。
- 副本分片数,可以动态调整。
- 增加副本数,可以在一定程度上提高程序的可用性。
分片的设定
生产环境中分片的设定,需要提前做好容量规划。
- 分片数过小
- 后续无法增加节点实现水平扩展。
- 单个分片数据量太大,导致数据重新分配耗时。
- 分片数过大
- 影响搜索结果的相关性打分,影响统计结果的准确性。
- 单个节点上过多的分片,会导致资源浪费,也会影响性能。
集群的健康情况
- Green:主分片和副本都正常分配。
- Yellow:主分片全部正常,有副本分片未能正常分配。
- Red:有主分片未能正常分配。
tags: ElasticSearch 搜索引擎