首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Elasticsearch 中的基本概念-文档/索引/节点/分片/集群

Elasticsearch 中的基本概念-文档/索引/节点/分片/集群

原创
作者头像
懒人的小脑
修改于 2019-08-15 16:56:30
修改于 2019-08-15 16:56:30
2.8K0
举报

本文介绍 Elasticsearch 的基本概念,包括文档和索引、节点和分片,以及 Elasticsearch 和关系型数据库的类比和 REST API。

文档和索引

文档

Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位。例如:

  • 日志文件的一条日志项
  • 一部电影或一张唱片的的具体信息
  • 音乐播放器中的一首歌曲
  • 一篇 PDF 文件中的具体内容

在 elasticsearch 中,文档会被序列化成 JSON 格式并保存。

JSON 对象由字段组成,每个字段都有相对应的字段类型,如字符串、数值、布尔、日期、二进制、范围类型。

每个文档都有一个唯一 ID,Unique ID 可以手动指定也可以通过 Elasticsearch 自动生成。

一篇文档包含了一系列字段,类似于数据库中的一条记录。JSON 文档格式灵活,不需要预先定义格式,字段的类型可以指定或通过 Elasticsearch 自动推算,JSON 文档还支持数组和嵌套。

文档的元数据

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

元数据

描述

_index

文档所属的索引名

_type

文档所属的类型名

_id

文档唯一 ID

_source

文档的原始 JSON数据

_all

整合所有字段内容到该字段(已废除)

_version

文档版本信息

_score

相关性打分

索引

索引 Index是文档的容器,是一类文档的集合。

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

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

索引的 Mapping 定义文档字段的类型,Setting 定义不同的数据分布。

索引的不同语义 名词:一个 Elasticsearch 集群中,可以创建多个不同的索引,索引是文档的集合。 动词:将文档写入到 Elasticsearch(indexing) 名词:B 树索引、倒排索引

Elasticsearch 和关系型数据库的类比

RDBMS

Elasticsearch

Table

Index(Type)

Row

Doucment

Column

Filed

Schema

Mapping

SQL

DSL

在7.0之前,一个 Index 可以设置多个 Types,目前 Type 已经被 Deprecated,从7.0开始,一个索引只能创建一个 Type-“_doc”。

REST API

Elasticsearch 提供 REST API 供其他程序调用。

API 调用
API 调用

以下列举了一些 API 示例:

API 示例
API 示例

Elasticsearch 集群

分布式系统的可用性和扩展性

  • 高可用性
    • 服务可用性:允许有节点停止服务
    • 数据可用性:部分节点丢失,不会丢失数据
  • 可扩展性
    • 面对请求量提升和数据的不断增长,可以将数据和请求分布到所以节点

Elasticsearch 分布式的特性

  • Elasticsearch 分布式架构的好处
    • 存储的水平扩容
    • 提高系统的可用性,部分节点停止服务,整个集群不受影响
  • Elasticsearch 的分布式架构
    • 不同的集群通过不同的名字来区分,默认的集群名称是“elasticsearch”
    • 通过配置文件修改或者在命令行中 -E cluster.name=myes 
    • 一个集群可以有一个或多个节点

查看集群状态

查看集群的健康状况API

GET _cluster/health 

_cluster API
_cluster API

集群的健康程度使用3中颜色表示:

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

使用 kibana 查看集群状态

使用 Kibana查看集群健康状态
使用 Kibana查看集群健康状态

使用 cerebro 查看集群状态

当集群中节点发生变化后,集群状态颜色由绿色变成黄色

Node1丢失后的集群变化1
Node1丢失后的集群变化1

集群发生变化后,副本和主分片的变化

Node1丢失后的集群变化2
Node1丢失后的集群变化2

节点和分片

节点

节点是一个 Elasticsearch 的实例,本质上就是一个 JAVA 进程,一台机器上可以运行多个 Elasticsearch 进程,生产环境中建议一台机器只运行一个 Elasticsearch 实例。

每一个节点都有名称,通过配置文件或启动时 -E node.name=node1 指定。每一个节点在启动之后,会分配一个 UID,保存在 data 目录。

Master-eligible nodes 和 Master Node

每个节点启动后,默认为 Master eligible节点(取消设置 node.master:false ),Master-eligible节点可以参加选主流程,成为 Master 节点。当第一个节点启动的时候,它会将自己选举成 Master 节点。每个节点都保存了集群的状态,只有 Master 节点才能修改集群状态信息,如果任意节点都能修改信息会导致数据的不一致性。

集群状态(Cluster State)维护了一个集群中必要的信息,包括所有的节点信息、所有的索引和其相关的 Mapping 和 Setting信息、分片的路由信息。

Data Node 和 Coordinating Node

Data Node是可以保存数据的节点,用于保存分片数据,在数据扩展上起到了至关重要的作用。

Coordinating Node 负责接收 Client 的请求,将请求分发到合适的节点,最终把结果汇集到一起,集群中的每个节点默认拥有 Coordinating Node 的功能。

其他节点类型

  • Hot & Warm Node:不同硬件配置的 Data Node ,用来实现 Hot & Warm 架构,降低集群部署的成本
  • Machine Learning Node:负责运行机器学习的 Job,用来做异常检测
  • Tribie Node: 连接到不同的 Elasticsearch 集群,并且支持将这些集群当成一个单独的集群处理。5.3开始使用 Cross Cluster Search

配置节点类型

开发环境中一个节点可以承担多种角色。生产环境中,应该设置单一角色的节点。

节点类型

配置参数

默认值

master eligible

node.master

true

data

node.data

true

ingest

node.ingest

true

coordinating only

无

每个节点默认都是 coordinating 节点

machine learning

node.ml

true(需要 enable x-pack)

分片

主分片(Primary Shard)

主分片用来解决数据水平扩展的问题。通过主分片可以将数据分布到集群内的所有节点之上。主分片数在索引创建时指定,后续不可以修改(reindex 可以)。

副本(Replica Shard)

副本用来解决数据高可用的问题,是主分片的的拷贝。副本的分片数可以动态调整,增加副本数还可以在程度上提高服务的可用性(读取的吞吐)

分片的设定

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

  • 分片数设置过小
    • 后续无法增加节点实现水平扩展
    • 单个分片的数据量太大导致数据的重新分配耗时
  • 分片数设置过大
    • 影响搜索结果的相关性打分,影响统计结果的准确性
    • 单个节点上过多的分片会导致资源浪费,同时会影响性能
    • 7.0开始默认主分片为1,解决了 over-sharding 的问题
主分片和副本分片
主分片和副本分片

总结

本文介绍了 Elasticsearch 的相关概念:文档和索引、API、以及节点的分类和分片。另外将 Elasticsearch 和关系型数据库进行对比。以及 Elasticsearch 集群的相关内容。

本文相关文件

API 文本示例

代码语言:txt
复制
//查看索引相关信息
GET kibana_sample_data_ecommerce

//查看索引的文档总数
GET kibana_sample_data_ecommerce/_count

//查看前10条文档,了解文档格式
POST kibana_sample_data_ecommerce/_search
{
  
}

//_cat indices API
//查看 indices
GET /_cat/indices/kibana*?v&s=index

//查看状态为绿的索引
GET /_cat/indices?v&health=green

//按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc

//查看具体的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs,count,mt

//查看每个索引占用内存
GET /_cat/indices?v&h=i,tm&s=tm:desc


//查看集群健康
GET /_cat/health?v

//查看集群节点
GET /_cat/nodes

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 文档和索引
    • 文档
    • 索引
    • Elasticsearch 和关系型数据库的类比
  • REST API
  • Elasticsearch 集群
    • 查看集群状态
    • 查看集群的健康状况API
    • 使用 kibana 查看集群状态
    • 使用 cerebro 查看集群状态
  • 节点和分片
    • 节点
    • 分片
  • 总结
  • 本文相关文件
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档