ElasticSearch 基本概念
目录
文档(Document)
-
ES是面向文档的,文档是所有可搜索数据的最小单位
- 日志文件中的日志项
- 一本电影的具体信息 / 一张唱片的详细信息
- MP3 播放器里的一首歌/ 一篇 PDF 文档中的具体内容
- 关系型数据库中的一条记录
-
文档会被序列化成 JSON 格式保存在ES中
- JSON对象由字段组成
- 每个字段都有对应的字段类型(字符串 / 数组 / 布尔 / 日期 / 二进制 / 范围类型)
- 字段类型可以指定或者通过ES自动推算,支持数组 / 支持嵌套
-
每个文档都有一个 Unique ID
- 支持指定ID
- 或者通过 ES 自动生成。自动生成的ID,长度为20个字符,URL安装,base64编码,GUID,分布式系统并行生成时不可能会发生冲突
文档元数据,元数据用于标注文档的相关信息
- _index: 文档所属的索引名
- _type: 文档所属的类型名
- _id: 文档唯一ID
- _source 文档的原始JSON数据
- _version: 文档的版本信息
- _socre: 相关性打分
_all: 整合所有字段内容到该字段,7.0以上版本已被废除
索引(Index)
-
索引是文档的容器,是一类文档的结合
- Index 体现了逻辑空间的概念:每个索引都有自己的 Mapping 定义,用于定义包含的文档的字段名和字段类型
- Shard(分片)体现了物理空间的概念:索引中的数据分散在 Shard 上
-
Mapping 与 Settings
- Mapping 定义文档字段的类型
- Setting 定义不同的数据分布
索引的不同语意
- 名词:一个ES集群中,可以创建很多个不同的索引
- 动词:保存一个文档到ES中的过程也称索引(Indexing)
ES中,创建一个倒排的过程- 名词:一个B树索引,一个倒排索引
Type
- 在7.0版本之前,一个Index可以设置多个Types,7.0版本后,一个索引只能创建一个Type: _doc
ElasticSearch对比关系型数据库
关系型数据库 | ElasticSearch |
---|---|
Table(表) | Index(Type)(索引) |
Row(行) | Document(文档) |
Column(列) | Field(字段) |
Schema(表结构) | Mapping(映射) |
SQL | DSL |
集群与节点
- 一个集群可以有一个或者多个节点
- 节点是一个 ElasticSearch 的实例
- 本质上就是一个 JAVA 进程
- 一台机器上可以运行多个 ElasticSearch 进程,但是生产环境一般建议一台机器上只运行一个 ElasticSearch 实例
- 每一个节点都有名词,可以通过配置文件或者或者启动时 -E node.name 参数指定
- 每一个节点在启动之后,会分配一个 UID,保存在 data 目录下
Master-eligible nodes 和 Master Node
- 每个节点启动后,默认就是一个 Master eligible 节点
- node.master: false禁止,默认true
- Master-eligible 节点可以参加选主流程,成为Master节点
- 当第一个节点启动时,它会将自己选举成功Master节点
- 每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息
- 集群状态(Cluster State),维护了一个集群中必要的信息
- 所有的节点信息
- 所有的索引的其相关的 Mapping 与 Setting 信息
- 分片的路由信息
- 任意节点都能修改信息会破坏数据的一致性
- 集群状态(Cluster State),维护了一个集群中必要的信息
Data Node 和 Coordinating Node
- Data Node:可以保存数据的节点称作Data Node。该节点负责保存分片数据,在数据扩展上起到了至关重要的作用
- node.data配置项,默认true
- Coordinating Node
- 负责接受 Client 的请求,将请求分发到合适的节点,最终把结果汇集到一起
- 每个节点默认都起到了 Coordinating Node 职责
其他的节点类型
- Hot/Warm Node:不同硬件配置的 Data Node,用来实现 Hot & Warm 架构,降低集群部署的成本
- Machine Learning Node:负责跑机器学习的Job,用来做异常检测
- Tribe Node:Tribe Node 连接到不同的 ES 集群,并且支持将这些集群作为一个单独的集群处理。5.3版本后开始使用Cross Cluster Search
分片(Primary Shard & Replica Shard)
- 主分片:用来解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
- 一个分片是一个运行的 Lucene 实例
- 主分片数在索引创建时指定,后续不允许修改,除非 Reindex
- 副本:用来解决数据高可用的问题。副本分片时主分片的拷贝
- 副本分片数,可以动态调整
- 增加副本数,可以在一定程序上提高服务的可用性(增加读取的吞吐量)
- 生产环境中分片的设定,需要提前做好容量规划
- 分片数设置过小
- 导致后续无法增加节点实现水平扩展
- 单格分片的数据量太大,导致数据重新分片耗时
- 分片数设置过大
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单格节点上设置过多的分片,会导致资源浪费,同时也会影响性能
- 分片数设置过小