Elasticsearch基本概念

1.文档(document)

  • elasticsearch是面向文档的,文档是所有可搜索数据的最小单位,相当于一个数据的记录;

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

    • JSON对象由字段组成

  • 每个字段都有对应的字段类型(字符串、数值、布尔、日期、二进制、范围类型)

    • 每个文档都有一个Unique ID

    • 或者通过es自动生成

JSON文档

一篇文档包含一系列的字段,类似数据库表中的一条记录

  • JSON文档格式灵活,不需要预先定义格式

  • 字段的类型可以指定或者通过es自动推算

  • 支持数组/支持嵌套

文档的元数据:用于标注文档的相关信息

  • _index:文档所属的索引名

  • _type:文档所属的类型名

  • _id:文档唯一ID

  • _source:文档的原始JSON数据

  • _all:整合所有字段内容到该字段,es7.0已废除

  • -version:文档的版本信息

  • _score:相关性打分

2.索引(index)

索引是文档的容器,是一类文档的结合

index体现了逻辑空间的概念:每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型

share体现了物理空间的概念:索引中的数据分散在shard上

索引的Mapping与Settings

Mapping定义文档字段的类型

Setting定义不同的数据分布

3.类型(type)

7.0之前一个index可以设置多个types

6.0开始type已经被deprecated,7.0开始一个索引只能创建一个type-"_doc"

es和关系型数据库的类比:

RDBMS Elasticsearch
索引(类型)
文档
字段
Schema Mapping
SQL DSL

4.REST API

通过http请求可以被各种语言调用

#分布式系统的可用性和拓展性

高可用性

服务可用性:允许有节点停止服务

数据可用性:部分节点丢失,不会丢失数据

可拓展性

请求量提升/数据的不断增长(将数据分布在所有节点上)

elasticsearch的分布式架构

  • 存储的水平扩容

  • 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响

es不同的分布式集群通过不同的集群名字来区分,默认名字“elasticsearch”,通过配置文件修改或者命令行参数-E =***设定,一个集群有一个或者多个节点

5.节点

节点是一个es实例,本质上就是一个java进程

每一个节点都有名字,通过配置文件配置或者命令行参数-E =***指定

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

不同的节点可以承担不同的角色

Master-eligible node和Master node

每个节点启动后,默认是一个Master eligible节点,可以设置node.master: false禁止

Master eligible节点可以参加选主流程,成为master节点

当一个节点启动时,它会将自己选举成master节点

每个节点都保存了集群的状态,只有master节点可以修改集群的状态信息

  • 集群状态,维护了一个集群中,必要的信息

    • 所有的节点信息

    • 所有的索引和其相关的Mapping与setting信息

    • 分片的路由信息

  • 任何节点都能修改信息会导致数据的不一致性

Data node和Coordinating node

  • data node:可以保存分片数据的节点,在数据拓展上起到至关重要的作用

  • coordinating node:负责接受客户端请求,将请求分发到合适节点,最终把结果汇集到一起,每个节点默认都是coordinating node

其他节点类型

  • Hot & Warm node:不同硬件配置的data node,实现冷热架构,降低集群部署成本

  • Machine learning node:跑机器学习的job,用作异常检测

  • Tribe node

配置节点类型

开发环境中一个节点可以承担多种角色

生产环境中应该设置单一角色的节点(dedicated node)

节点类型 配置参数 默认值
master eligible node.master true
data node.data true
ingest node.ingest true
coordinating only 每个节点默认都是coordinating节点,设置其他类型全部为false
machine learning true(需enable x-pack)

6.分片

  • 主分片(primary shard):用以解决数据水平扩展问题,通过主分片,可以将数据分布到集群的所有节点上

    • 一个分片是一个运行的Lucene实例

    • 主分片数在索引创建时指定,后续不允许修改,除非Reindex

  • 副本:用以解决数据高可用问题,副本分片是主分片的拷贝

    • 副本分片数可以动态调整

    • 增加副本数,可以一定程度上提高服务的可用性(读取的吞吐)

分片的设定

对于生产环境分片的设定,需要提前做好容量规划

  • 分片数设置过小

    • 导致后续无法增加节点实现该分片所属索引的水平扩展

    • 单个分片的数据量太大,导致数据重新分配耗时

  • 分片数设置过大(7.0开始,默认主分片设置为1,解决了over-sharding的问题)

    • 影响搜索结果的相关性打分,影响统计结果的准确性

    • 单个节点上过多的分片,会导致资源浪费,同时也会影响性能

查看集群的健康状况

GET _cluster/health

  • Green:主分片与副本都正常分配

  • Yellow:主分片全部正常分配,有副本分片未能正常分配

  • Red:有主分片未能正常分配,例:当服务器的磁盘容量超过85%时,去创建了一个新的索引