Elasticsearch基础知识

Document 文档

  • Elasticsearch 是面向Document文档的,文档是所有可搜索数据的最小单位

  • 文档会被序列化JSON格式,保存在Elasticsearch中

    • JSON对象由字段组成
    • 每个字段都有对应的字段类型 (字符串/数值/布尔/日期/二进制/范围类型)
  • 每个文档都有一个Unique ID

    • 手动指定ID
    • 通过Elasticsearch自动生成
  • 一个文档由Meta Data元数据与Source Data原始数据组成
{
  "_index": "***",                    # 文档所存在的索引名
  "_type": "_doc",                    # 文档所属的类型名
  "_id": "***",                        # 文档的唯一ID
  "_version": 1,                    # 文档的版本信息
  "_score": null,                    # 文档相关性打分
  "_source": { .... },                # 文档的原始JSON数据
  "fields": { "***": [ "***" ] },    # 额外添加的字段
  "sort": [ 1575256044058 ]            # 排序
}

Index 索引

索引,即一系列documents的集合。

Shard 分片

分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request。

分片分为两种类型:主分片(Primary Shard)和副本分片(Replica Shard)

  • 主分片:用以解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点上(主从复制)
    • 主分片在索引创建时指定,后续不允许修改,除非reindex
    • 一个分片是一个运行的Lucene实例,Integer.MAX_VALUE - 128 = 2,147,483,519 个docs。
  • 副本分片:用于解决数据高可用的问题,是主分片的拷贝(可以提高读吞吐量)
    • 副本分片数,可动态调整

主分片和备分片不会出现在同一个节点上(防止单点故障

集群节点类型

一个节点就是一个ElasticSearch的实例,本质上就是一个Java进程。

每个节点都有名字,通过配置文件,或者启动时候 -E node.name = node1指定

每一个节点在启动之后,会分配一个UID,保存在data目录下

生产环境中一个节点应该设置单一的角色(意味着节点可以多角色)

节点类型 配置参数 默认值 作用 备注
master eligible node.master true 每个节点启动后,默认就是一个Master eligible节点(可以设置node.master:false 禁止),Master-eligible节点可以参与选主流程,成为Master节点每个节点上都保存了集群的状态信息(所有节点信息,所有的索引和其相关的Mapping和Setting信息,分片路由信息),只有Master节点可以修改集群状态信息 可以参加选主
data node.data true 当第一个节点启动,它会将自己选举成Master节点保存包含索引文档的分片数据,执行CRUD、搜索、聚合相关的操作。属于内存、CPU、IO密集型,对硬件资源要求高。 存储数据
ingest node.ingest True ingest节点可以运行一些pipeline的脚本
Coordinating 负责接收Client请求,将请求分发到合适的节点,最终把结果汇聚在一起返回给客户端。每个节点默认都起到了Coordinating Node的职责 每个节点默认都是coordinating节点,设置其他类型全部为false
machine learning node.ml true(需要enable x-pack) 机器学习

集群状态

ES集群状态有三种:

  • Green:所有主分片和备份分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成Yellow状态
  • Yellow:所有主分片准备就绪,但存在至少一个主分片(假设是A)对应的备份分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好A所在的机器挂了,并且你只设置了一个备份(已处于未就绪状态),那么A的数据就会丢失(查询结果不完整),此时集群进入Red状态
  • Red::至少有一个主分片没有就绪(直接原因是找不到对应的备份分片成为新的主分片),此时查询的结果会出现数据丢失(不完整)

Elasticsearch的写入请求

  • Elasticsearch的写入请求主要包括:index、create、update、delete、bulk。bulk是实现对前四种的批量操作。

  • 在6.x版本以后实际上走的都是bulk接口了。

  • create/index是直接新增doc,delete是直接根据_id删除doc。

img

ES的任意节点都可以作为协调节点(coordinating node)接受请求,当协调节点接受到请求后进行一系列处理,然后通过_routing字段找到对应的primary shard,并将请求转发给primary shard, primary shard完成写入后,将写入并发发送给各replica, raplica执行写入操作后返回给primary shard, primary shard再将请求返回给协调节点

Elasticsearch写入过程

  • Elasticsearch中每个index由多个shard组成,默认是5个,每个shard分布在不同的机器上。shard分为主分片和副本分片。

这里写图片描述

​ 红色:Client Node(客户端节点)绿色:Primary Node(主分片节点)蓝色:Replica Node(副本分片节点)

Elasticsearch索引过程

Elasticsearch搜索过程

Elasticsearch的准实时

Elasticsearch的核心优势就是近乎实时,为什么说是近乎实时而非真实意义上的实时呢,因为Elasticsearch能够做到准实时,而并不是完全的实时。

Copyright Curiouser all right reserved,powered by Gitbook该文件最后修改时间: 2022-07-27 18:11:45

results matching ""

    No results matching ""