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 搜索引擎