• 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

  • 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

2 Elasticsearch基本概念

2025-01-29

我们根据这张图过一下Elasticsearch上的各个概念。

集群

概念对比

ES有一些逻辑概念和物理概念,逻辑概念可以直接类比MySQL,能帮我们更好的使用ES开发业务。物理概念和Kafka等比较相似,能帮我们更好的运维。从逻辑概念上对比:

概念 类比MySQL
Elasticsearch 关系型数据库(RDBMS),和MySQL同维度
集群(Cluster) 库,如用户库,一个库里有多张表
索引(Index) 表,如用户表
文档(Document) 一行数据
Filed 对应表中的列
Mapping 对应表结构,Schema
领域特定语言(DSL) 对应SQL

详细信息

我们按照图里结构,从大到小解释。

集群(Cluster)

  1. 不同的集群通过不同的名字来区分,默认名字“elasticsearch”
  2. 可以通过配置文件或者在命令行中 -E cluster.name=****进行设定
  3. 一个集群可以有多个节点
  4. 集群有状态
  • red:某些数据不可用,注意此时仍然有部分功能是可用的
  • yellow:所有数据均可用,但有一些副本尚未分配,即还不是处于高可用的状态
  • green:运行正常

索引(Index)

说明

  1. 索引可以类比为MySQL的表,它包含逻辑空间的概念和物理空间的概念。
  • 逻辑空间:对应Mapping,用于定义包含的文档的字段名和字段类型,类似于MySQL表结构
  • 物理空间:对应Setting,用于定义数据存放在哪些分片上
  1. 一个集群内可以创建N个索引

实例

这是一个Document,是根据Elasticsearch家族成员及安装创建的。

image-20250123150833463

对应的索引Mapping和Setting为:

image-20250123151108464

image-20250123151145644

文档(Document)

image-20250123152105094

  1. source:上一篇文章用logstash导入的原始数据
1
2
movieId,title,genres
1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
  1. index:文档所属的索引名,可以自己指定,也可以通过Elasticsearch自动生成
  2. type:文档所属的类型名,7.0开始只能定义为_doc了
  3. id:文档的唯一id
  4. version:文档的版本信息,文档经过多少次改动
  5. score:相关性打分

所以Document是原始数据与基础性数据

节点(Node)

说明

  1. 节点是一个Elasticsearch的实例,本质上是一个JAVA进程。一台机器上可以运行多个进程,但生产环境一般建议一台机器值运行一个进程
  2. 每个节点都有名字,可以通过配置文件配置,或者启动时候 -E node.name=node1指定
  3. 每一个节点在启动之后,会分配一个UID,保存在data目录下

类型

节点名称 说明
Master-eligible Node 1. 节点启动默认是Master eligible节点,可通过设置node.master:false禁止
2. 该节点可以参加选主流程,成为Master节点
3. 保存了集群状态(所有节点信息,所有的索引和其Mappting/Setting信息,分片的路由信息)
Master Node 从Master-eligible Node变成的,只有Master才能修改集群的状态信息
Data Node 保存数据的节点,负责保存分片的数据,在数据扩展上起到了至关重要的作用
Coordinating Node 1. 负责接受Client的请求,将请求分发到合适的节点,最终把结果汇集到一起,返回给Client
2. ES中的每一个节点,默认都起到Coordinating Node的职责
Machine Learning Node 负责跑机器学习Job,用来做异常检测

配置节点类型

ES启动的时候,通过读取elasticsearch.yaml控制node角色。一个节点可以承担多种角色。

image-20250123155830564

分片(Shard)

主分片(Primary Shard)

因为要解决单机容量限制,所以采取集群方案,引入分片概念。通过主分片,可以将索引的数据分布到集群内的所有节点上,这个过程叫sharding。

  • 一个分片是一个运行的Lucene实例
  • 主分片数在索引创建时指定,后续不允许修改,除非Reindex

副本分片(Replica Shard)

用于解决高可用的方案,以防止数据丢失,为每个分片创建冗余,它允许你扩展吞吐量,因为在副本上也可以执行搜索。

  • 副本分片数,可以动态调整
  • 增加副本数,还可以提高服务可用性(读取的吞吐量)

分片数量

在索引的Setting中有两个字段

  • number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同的节点,提高了ES的处理能力和高可用性,7.x默认为1。
  • number_of_replicas:设置副本的数量,设置副本是为了提高ES的高可靠性,默认为1。

分片数需要提前做好容量规划,避免过小或者过大。

  • 分片数太小,如果后续数据太多,很难进行扩展。
  • 分片数太大,如果超过Node数量,价值不大,而且太大了会影响搜索结果的相关性打分,影响统计结果的准确性

开发机配置多Nodes

从Cerebro发现是yellow的

image-20250123170715397

首先检查副本节点失败的原因

http://localhost:9200/_cat/shards?v&h=index,shard,prirep,state,unassigned.reason

image-20250123171222018

我怀疑是因为主节点不会将主分片分配给与其副本相同的节点,也不会将同一分片的两个副本分配给同一个节点。我们增加一个试试,新建一个集群,有三个节点(配置文件需要改为初始情况)。

1
2
3
4
5
6
7
bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data -d
bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data -d
bin/elasticsearch -E node.name=node3 -E cluster.name=geektime -E path.data=node3_data -d

#关闭方式
ps | grep elasticsearch
kill pid

重新导入数据

image-20250123173402480

资料

  1. ElasticSearch7.x 之 elasticsearch.yml详细配置
  2. 一网打尽!处理 Elasticsearch 中未分配的分片问题(附完整 DSL 示例
  3. elasticsearch 未分配分片unassigned导致集群为Yellow状态修复

扫一扫,分享到微信

微信分享二维码
3 Elasticsearch索引简介
论语第七篇-述而
© 2025 John Doe
Hexo Theme Yilia by Litten