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

本文介绍 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 示例

Elasticsearch 集群

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

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

Elasticsearch 分布式的特性

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

查看集群状态

查看集群的健康状况API

GET _cluster/health 

_cluster API

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

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

使用 kibana 查看集群状态

使用 Kibana查看集群健康状态

使用 cerebro 查看集群状态

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

Node1丢失后的集群变化1

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

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 文本示例

//查看索引相关信息
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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏点云PCL

PCL学习八叉树

建立空间索引在点云数据处理中有着广泛的应用,常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树,KD树,KDB树,R树,四...

15620
来自专栏码神路漫漫

PM2 进程管理工具使用总结

对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管...

30240
来自专栏点云PCL

kd-tree理论以及在PCL 中的代码的实现

通过雷达,激光扫描,立体摄像机等三维测量设备获取的点云数据,具有数据量大,分布不均匀等特点,作为三维领域中一个重要的数据来源,点云主要是表征目标表面的海量点的集...

11030
来自专栏EffectiveCoding

Redis 中List 及 quicklist实现 2

上一篇中看了List的使用方式、quicklist中的各个结构体,这一篇来看看quicklist里面的几个核心函数,quicklistCreate函数、quic...

8850
来自专栏LNMP开发那些事

微信小程序-使用Promise封装微信请求

关于Promise,本身就可以写一篇文章,百度可以找到很多的文章,就不再搬运了,请自行搜索。

13120
来自专栏无敌码农

漫画:什么是一致性哈希?

按Mysql单表存储500万条记录来算,暂时不必分库,单库30个分表是比较合适的水平分表方案。

9130
来自专栏R语言交流中心

R语言实现GO分析

我们上一期介绍了如何实现GO分析的可视化,运行了GOplot包自带的数据并且很畅通。然而我们如何才能获取那些可以直接输入的数据表格或者说前期的工作是怎么实现的。...

25720
来自专栏服务端技术杂谈

接口调用实现请求超时中断,你有几种方法?

在服务化系统中,对于上下游服务的依赖调用往往是通过RPC接口调用实现的,为了系统稳定性,防止被上游服务超时hang死,我们需要对接口调用设置超时,如果在设置的超...

80910
来自专栏菲宇

datatables应用程序接口API

Datatables有一个强大的api,用来处理表格上的数据,你可以添加数据到已经存在的表格,或者对已经存在的数据进行操作。 API旨在能够很好地操作表格中的数...

10630
来自专栏博客同步

JavaScript中的单线程运行,宏任务与微任务,EventLoop

上面这个问题看起来对有的同学可能很简单,到有的同学可能会比较复杂。对你不管是复杂还是简单,这其中涉及到的只是点都是一样的。JavaScript单线程,宏任务与微...

47330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励