Elasticsearch集群工作原理

简介

ELasticsearch作为一个分布式搜索引擎,能够出色地支持集群模式、动态水平扩容、故障转移等分布式系统特性,这是其作为全文搜索引擎首选的重要原因。

本文从零开始描述集群的配置和扩容过程,让你对Elasticsearch集群的工作原理有初步的理解。

首先,一个Elasticsearch集群时由多个节点组成,同个网络内的节点通过指定cluster.name加入同一个集群,所有的节点共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。

Elasticsearch节点分为主节点和数据节点,主节点负责管理协调Elasticsearch集群,包括索引的增加、删除,节点的加入、移除等,但主节点不负责数据存储和搜索,这使得主节点不会有太大的压力,而是保持轻量的状态。数据节点主要负责数据存储和搜索。

节点是否可以作为主节点通过node.master配置设置,true表示可以作为主节点,false表示不可以作为主节点。

节点是否可以作为数据节点通过node.data配置设置,true表示可以作为数据节点,false表示不可以作为数据节点。

默认情况下node.masternode.data都为true,特别注意node.master设置为true只是表示此节点有作为主节点的资格,但是不代表一定成为主节点,主节点是通过集群选举产生,具体选举的策略后续文章再进行讲解。
##集群配置

空集群

当我们启动了一个Elasticsearch节点,默认就是创建了一个Elasticsearch集群,只是这个集群只有一个节点。此时如果没有创建索引,则集群处于一种"空"的状态。
空集群
此时通过_cluster API查看集群状态

$ curl -X GET "localhost:9200/_cluster/health?pretty"

结果如下,可以看到statusgreen,节点数量number_of_nodes为1,数据节点数量number_of_data_nodes也为1,因为没有创建索引,所以分片数目为0。

status字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下:

  • green 所有的主分片和副本分片都正常运行
  • yellow 所有的主分片都正常运行,但不是所有的副本分片都正常运行。
  • red 有主分片没能正常运行。
    由于当前不存在主分片也不存在副本分片没正常运行的,所以状态为green
{"cluster_name" : "elasticsearch","status" : "green","timed_out" : false,"number_of_nodes" : 1,"number_of_data_nodes" : 1,"active_primary_shards" : 0,"active_shards" : 0,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0
}

单节点集群

为当前集群添加索引,指定主分片数量为3,副本分片数量为1。

$ curl -X PUT "localhost:9200/cumstomer?pretty" -H 'Content-Type: application/json' -d'
{"settings" : {"number_of_shards" : 3,"number_of_replicas" : 1}
}
'

此时再次查看集群的状态

{"cluster_name" : "elasticsearch","status" : "yellow","timed_out" : false,"number_of_nodes" : 1,"number_of_data_nodes" : 1,"active_primary_shards" : 3,"active_shards" : 3,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 3,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 50.0
}

可以看到此时活动的主分片数量为3,未分片的分片数量也为3,未分配的分片主要是三个主分片对应的副本分片,由于主分片与副本分片不能存在于同个节点,所以副本分片无法分配,此时集群的状态为yellow

两节点集群

如上所述,因为副本分片不能跟主分片分配于同一个节点,那么要实现所谓的副本分片都能够被正常分配,则需要多一个节点。为集群加入一个新的节点,只需要新节点指定集群名字cluster.name与第一个节点相同就能够加入到集群中,加入以后集群会自动进行分片的重新分片,由于存在三个副本分片未被分配,所以三个副本分片会被分配到新的节点,如下图所示。

两个节点
此时查看集群的状态可以发现,所有的分片都被正常分配,此群的状态变为green

{"cluster_name": "elasticsearch","status": "green", "timed_out": false,"number_of_nodes": 2,"number_of_data_nodes": 2,"active_primary_shards": 3,"active_shards": 6,"relocating_shards": 0,"initializing_shards": 0,"unassigned_shards": 0,"delayed_unassigned_shards": 0,"number_of_pending_tasks": 0,"number_of_in_flight_fetch": 0,"task_max_waiting_in_queue_millis": 0,"active_shards_percent_as_number": 100
}

水平扩容

主分片的扩容

经过上述增加了两个节点以后我们可以看到三个主分片都处于同一个节点上,共享这个节点的CPU、IO和内存资源,这样子当系统访问量增大时容易出现性能瓶颈,可以考虑增加节点,分担一部分主分片提高性能。例如增加一个节点,组成3个节点的集群,集群中分片的分配如下图所示

增加三个节点
节点最多可以增加到6个节点,平均每个节点分配一个分片,可以最大化提高每个分片的性能。这里注意到,继续增加节点已经无法扩展主分片了,所以主分片的数量决定了整个集群的容量,在进行索引设计的时候需要特别注意,仔细规划。

副本分片的扩容

虽然主分片无法继续扩容,但是副本分片却是可以动态进行扩容的,动态分片的增加一方面使得高可用性更强,另外一方面副本分片可以提供查询搜索功能,多个副本分片可以扩展搜索的性能,例如修改副本分片的数量为2。

$ curl -X PUT "localhost:9200/customer/_settings?pretty" -H 'Content-Type: application/json' -d'
{"number_of_replicas" : 2
}

修改后分片的分配如下图所示,总共9个分片,副本分片为两个,分别在两个节点之上,搜索时两个节点均能提供搜索服务,性能有了巨大提升。当然还可以继续增加节点和副本分片不断扩大搜索性能。
扩容副本分片

故障转移

上面我们反复提到,多个副本分片时为了保证Elasticsearch的高可用性。现在我们在模拟以下Elastic search出现故障时会如何保证这种可用性。

首席停掉Node 1节点,Node1节点是master节点,包含了P1、P2、R0三个分片,由于Elasticsearch集群的运行必要要有一个master节点,所以会在剩下两个节点中重新选举一个master节点,并且由于P1、P2主分片丢失,所以会从其两个副本分片R1和R2中选择两个升级为主分片继续提供服务,最终的集群状态如下,由于此时P1、P2都只有一个副本分片,而我们指定的是两个副本分片,所以存在未正常运行的副本分片,故集群的状态为yellow
宕机一个节点后

分布式索引和搜索

集群包含了多个节点,一个索引包含了多个分片,那么数据是如何被索引的呢?又是如何搜索的呢?

实际上我们可以访问集群中的任意一个节点获取完整的数据集,就是取决于Elasticsearch分布式的索引和搜索方式。

当我们索引一篇文档时,Elasticsearch首先会根据文档的ID进行散列计算,通过散列值选择一个主分片,然后将文档发送到该分片上,此分片不一定在所访问的节点上,也能在任意其他的节点上,但是当然所访问的节点会自动地将请求进行转发,完成文档在主分片地存储以后,该文档还会被发送到该主分片的所有副本分片中去,达到主副分片数据一致。

当我们搜索一篇文档时,同样将请求发送到任意一个节点,不管是数据节点还是主节点,甚至既不是数据节点也不是主节点,但是都处于本集群中,具备搜索功能。收到请求的节点会使用round-robin的轮询机制选择可用的主分片或者副本分片,将请求转发过去,然后将所有的的各个节点返回的响应数据进行聚合之后返回给客户端。

由此我们可以看出,水平扩展增加节点数量是提高Elasticsearch搜索性能的一个很好的方案,即便是不进行数据存储的普通节点,也能够进行请求的转发和响应结果的计算和聚合,减少主节点和数据节点的压力,提高系统的整体性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523721.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

mmdetection学习——模型对比实验

1. 安装配置mmdetection环境,直接看官网 开始你的第一步 — MMDetection 3.0.0 文档 最好用conda新建环境管理,防止包冲突 git clone mmdetection源码到本地 2. 开始实验 2.1 准备数据集 需要使用COCO数据集格式 2.2 配置训练文件 在configs文件夹…

【PyTorch][chapter 27][李宏毅深度学习][transformer-1]

前言: transformer 是深度学习四大基础架构之一,最早Google 发表在NIPS(NeurIPS 全称神经信息处理系统大会), 是一种seq2seq 的模型.采用的Encoder-Decoder 结构,应用比较广泛。 比如文本生成,语音转换,视频生成. 相对RNN, LSTM …

基于PLC的粮食自动烘干机控制系统设计

基于PLC的粮食自动烘干机控制系统设计是一个综合性的工程任务,旨在通过PLC(可编程逻辑控制器)实现对粮食烘干过程的自动化控制,以提高烘干效率、保证烘干质量并降低能耗。以下是一个基于PLC的粮食自动烘干机控制系统设计的基本框架和关键要点: 前言 在我国,作为农业大国…

深度学习(八)-图像色彩操作

图像色彩调整 亮度调整 对HSV空间的V分量进行处理可以实现对图像亮度的增强。 直接将彩色图像灰度化,也可以得到代表图像亮度的灰度图进行图像处理,计算量比HSV颜色空间变化低。但在HSV空间中进行处理可以得到增强后的彩色图像。 opencv读取图片是BGR…

mac的使用

mac使用python的问题 对于python的虚拟环境,其实是基于已经安装到本地的python来安装不同的包。(之前我的mac上只安装了python3.9.6 ,安装的位置为/usr/bin/python3)然后我在vscode里怎么找都找不到如何弄一个python3.7.6 的版本…

论文阅读笔记:RepViT: Revisiting Mobile CNN From Vit Perspective

文章目录 RepViT: Revisiting Mobile CNN From Vit Perspective动机现状问题 贡献实现Block设置独立的token融合器和通道融合器减少膨胀并增加宽度 宏观设计stem的早期卷积简单分类器整体阶段比率 微观设计内核大小选择Squeeze-and-excitation层放置网络架构 实验ImageNet-1K上…

Codeforces Round 970 (Div. 3)

#include <iostream> #include <cmath> using namespace std;// 函数 is 用于判断给定的字符串 s 是否表示一个满足条件的正方形数。 bool is(const string &s, int n) {// 首先计算 n 的平方根 k。int k sqrt(n); // 如果 k 的平方不等于 n&#xff0c;那么 …

Java | Leetcode Java题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; class Solution {public int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step s…

3012家!第六批专精特新“小巨人”企业名单和第三批复核通过企业名单公示

工业和信息化部开展了第六批专精特新“小巨人”企业培育和第三批专精特新“小巨人”企业复核工作&#xff0c;已完成相关审核。今日&#xff0c;各地陆续公示了第六批专精特新“小巨人”企业和第三批专精特新“小巨人”复核通过企业名单。 第六批专精特新“小巨人”企业和第三…

TikTok店群模式:从盈利到管理的全方位指南

北京时间9月2日&#xff0c;TikTok举办了“Grow With TikTok”研讨会。此次盛会不仅深入探讨了品牌如何利用TikTok平台实现快速成长与业务拓展&#xff0c;还针对TikTok店群运营模式中遇到的实际问题&#xff0c;提供了宝贵的指导意见。基于会议的精髓&#xff0c;本文将探讨如…

Oceanbase 透明加密TDE

官方文档&#xff1a;数据库透明加密概述-V4.3.2-OceanBase 数据库文档-分布式数据库使用文档 OceanBase 数据库社区版暂不支持数据透明加密。 数据存储加密是指对数据和 Clog 等保存在磁盘中的数据进行无感知的加密&#xff0c;即透明加密&#xff08;简称 TDE&#xff09;。…

5G ARMxy边缘计算网关依靠 SPI加密芯片保障工业数据传输

数字化进程迅猛推进的时代&#xff0c;数据的采集、处理以及传输所占据的地位愈发关键。ARM 边缘计算机以其超乎寻常的强大性能和丰富多彩的功能特性&#xff0c;为形形色色的应用场景奉献出了高效且值得信赖的解决方案。 ARM 边缘计算机对于多种操作系统均予以支持&#xff0…

TCP协议 配合 Wireshark 分析数据

在TCP连接中&#xff0c;无论是客户端还是服务端&#xff0c;都有可能成为发送端或接收端&#xff0c;这是因为TCP是一个全双工协议&#xff0c;允许数据在同一连接中双向流动 客户端&#xff08;Client&#xff09;&#xff1a;通常是指主动发起连接请求的一方。例如&#xf…

Python脚本实现向飞书发送卡片消息

目录 1 先创建一个卡片消息2 Python脚本2.1 告警测试2.2 告警恢复 总结 1 先创建一个卡片消息 飞书卡片搭建工具 根据自己的需要创建一个消息卡片&#xff1a; 可以在 卡片源代码 中看到这个卡片的代码信息 2 Python脚本 2.1 告警测试 test.py 文件 ""&quo…

Table表格td之间有空隙?你少设了border-collapse

设置之前 设置之后 table {border:solid 1px #cccccc;border-collapse: collapse;border-spacing: 0; }

2024最新PyCharm下载安装激活汉化教程!(附激活码)

激活码&#xff08;文末附带精品籽料&#xff09;&#xff1a; K384HW36OB-eyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6I…

TripoSR模型构建指南

一、介绍 TripoSR 是由 Tripo AI 和 Stability AI 合作开发的最先进的开源模型&#xff0c;用于从单个图像进行快速前馈 3D 重建。利用大型重建模型&#xff08;LRM&#xff09;的原理&#xff0c;TripoSR 带来了关键的进步&#xff0c;大大提高了 3D 重建的速度和质量。该模型…

【ISSCC】论文详解-34.6 28nm 72.12TFLOPS/W混合存内计算架构

本文介绍ISSCC34.6文章&#xff0c;题目是《A 28nm 72.12TFLOPS/W Hybrid-Domain Outer-Product Based Floating-Point SRAM Computing-in-Memory Macro with Logarithm Bit-Width Residual ADC》&#xff08;一种28nm 72.12TFLOPS/W混合域外积浮点SRAM存内计算宏单元&#xff…

AI Dify + 大模型+ Agent 详细教程 从0-1教你构建小助手

前言 Dify 是一个易于使用的 LLMOps 平台&#xff0c;提供了多种应用程序类型和模板&#xff0c;包括 AI 聊天机器人、代码转换器、SQL 生成器、新闻内容编写、创意脚本等。团队使用 Dify&#xff0c;可以基于 GPT-4 等模型快速「开发部署」 AI 应用程序并进行可视化操作&…

python学习13:对excel格式文件进行读写操作

读取excel的话需要下载第三方库&#xff1a; 常用的库:xlrd(读),xlwt(写),xlutils,openpyxl[-----pip install xxx-------] 这里推荐openpyxl pip install openpyxl excel读取的基本操作 # 2)基本操作: # 2.1)打开文件,获取工作簿 filename rD:\stdutyZiLiao\pythoneProje…