我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ElasticSearch中怎么实现集群分布式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ElasticSearch中怎么实现集群分布式

本篇文章为大家展示了ElasticSearch中怎么实现集群分布式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

索引(index)

“索引” 这个词在 ElasticSearch 语境中包含多重意思: 索引(名词): 类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。

索引(动词): 索引一个文档就是存储一个文档到一个索引(名词)中以便它可以被检索和查询到。这非常类似于SQL语句中的 INSERT关键词,除了文档已存在时新文档会替换旧文档情况之外。

倒排索引: 关系型数据库通过增加一个“索引”比如一个B树(B-tree)索引到指定的列上,以便提升数据检索速度。ElasticSearch 和 Lucene 使用了一个叫做 “倒排索引” 的结构来达到相同的目的。

举个例子,文档和词条之间的关系如下图:

ElasticSearch中怎么实现集群分布式

图1:文档和词条的关系

字段值被分析之后,存储在倒排索引中,倒排索引存储的是分词(Term)和文档(Doc)之间的关系,简化版的倒排索引如下图:

ElasticSearch中怎么实现集群分布式

图2:倒排索引

类型(Type)

类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。类比传统的关系型数据库领域来说,类型相当于“表”。

文档(Document)

文档类似于一行完整的数据,在ElasticSearch里面文档是基于JSON格式进行表示的,文档是索引和搜索的原子单位,它是包含了一个或多个域(Field)的容器。每个文档可以存储不同的域集,但同一类型(Type)下的文档至少应该有某种程度上的相似之处。

节点(Node)

一个运行中的 ElasticSearch实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。

ES集群中的节点有三种不同的类型:

  • 主节点:负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 主节点并不需要涉及到文档级别的变更和搜索等操作。可以通过属性node.master进行设置。

  • 数据节点:存储数据和其对应的倒排索引。默认每一个节点都是数据节点(包括主节点),可以通过node.data属性进行设置。

  • 协调节点:如果node.master和node.data属性均为false,则此节点称为协调节点,用来响应客户请求,均衡每个节点的负载。

分片(Shard)

一个索引中的数据保存在多个分片中,相当于水平分表。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

一个分片可以是主分片或者副本分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。一个副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

集群分布式底层实现

以上我们对ElasticSearch的基本概念有了一个初步认识,接下来我们深入这些内部细节来帮助你更好的理解数据是如何在分布式系统中存储和查询的。

ES实际上就是利用分片来实现分布式。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, ES会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。默认情况下,一个索引会有5个主分片,而其副本可以有任意数量。

主分片和副本分片的状态决定了集群的健康状态。每一个节点上都只会保存主分片或者其对应的一个副本分片,相同的副本分片不会存在于同一个节点中。如果集群中只有一个节点,则副本分片将不会被分配,此时集群健康状态为yellow,存在丢失数据的风险。

分布式文档CRUD

索引新文档(Create)

当用户向一个节点提交了一个索引新文档的请求,节点会计算新文档应该加入到哪个分片(shard)中。每个节点都存储有每个分片存储在哪个节点的信息,因此协调节点会将请求发送给对应的节点。注意这个请求会发送给主分片,等主分片完成索引,会并行将请求发送到其所有副本分片,保证每个分片都持有最新数据。

每次写入新文档时,都会先写入内存中,并将这一操作写入一个translog文件(transaction log)中,此时如果执行搜索操作,这个新文档还不能被索引到。

ElasticSearch中怎么实现集群分布式

图3:新文档被写入内存,操作被写入translog

ES会每隔1秒时间(这个时间可以修改)进行一次刷新操作(refresh),此时在这1秒时间内写入内存的新文档都会被写入一个文件系统缓存(filesystem cache)中,并构成一个分段(segment)。此时这个segment里的文档可以被搜索到,但是尚未写入硬盘,即如果此时发生断电,则这些文档可能会丢失。

ElasticSearch中怎么实现集群分布式

图4:在执行刷新后清空内存,新文档写入文件系统缓存

不断有新的文档写入,则这一过程将不断重复执行。每隔一秒将生成一个新的segment,而translog文件将越来越大。

ElasticSearch中怎么实现集群分布式

图5:translog不断加入新文档记录

每隔30分钟或者translog文件变得很大,则执行一次fsync操作。此时所有在文件系统缓存中的segment将被写入磁盘,而translog将被删除(此后会生成新的translog)。

ElasticSearch中怎么实现集群分布式

图6:执行fsync后segment写入磁盘,清空内存和translog

由上面的流程可以看出,在两次fsync操作之间,存储在内存和文件系统缓存中的文档是不安全的,一旦出现断电这些文档就会丢失。所以ES引入了translog来记录两次fsync之间所有的操作,这样机器从故障中恢复或者重新启动,ES便可以根据translog进行还原。

当然,translog本身也是文件,存在于内存当中,如果发生断电一样会丢失。因此,ES会在每隔5秒时间或是一次写入请求完成后将translog写入磁盘。可以认为一个对文档的操作一旦写入磁盘便是安全的可以复原的,因此只有在当前操作记录被写入磁盘,ES才会将操作成功的结果返回发送此操作请求的客户端。

此外,由于每一秒就会生成一个新的segment,很快将会有大量的segment。对于一个分片进行查询请求,将会轮流查询分片中的所有segment,这将降低搜索的效率。因此ES会自动启动合并segment的工作,将一部分相似大小的segment合并成一个新的大segment。合并的过程实际上是创建了一个新的segment,当新segment被写入磁盘,所有被合并的旧segment被清除。

ElasticSearch中怎么实现集群分布式

图7:合并segment

ElasticSearch中怎么实现集群分布式

图8:合并完成后删除旧segment,新segment可供搜索

更新(Update)和删除(Delete)文档

ES的索引是不能修改的,因此更新和删除操作并不是直接在原索引上直接执行。

每一个磁盘上的segment都会维护一个del文件,用来记录被删除的文件。每当用户提出一个删除请求,文档并没有被真正删除,索引也没有发生改变,而是在del文件中标记该文档已被删除。因此,被删除的文档依然可以被检索到,只是在返回检索结果时被过滤掉了。每次在启动segment合并工作时,那些被标记为删除的文档才会被真正删除。

更新文档会首先查找原文档,得到该文档的版本号。然后将修改后的文档写入内存,此过程与写入一个新文档相同。同时,旧版本文档被标记为删除,同理,该文档可以被搜索到,只是最终被过滤掉。

读操作(Read):查询过程

查询的过程大体上分为查询(query)和取回(fetch)两个阶段。这个节点的任务是广播查询请求到所有相关分片,并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端。

查询阶段

当一个节点接收到一个搜索请求,则这个节点就变成了协调节点。

查询过程分布式搜索

ElasticSearch中怎么实现集群分布式

图9:查询过程分布式搜索

第一步是广播请求到索引中每一个节点的分片拷贝。 查询请求可以被某个主分片或某个副本分片处理,协调节点将在之后的请求中轮询所有的分片拷贝来分摊负载。

每个分片将会在本地构建一个优先级队列。如果客户端要求返回结果排序中从第from名开始的数量为size的结果集,则每个节点都需要生成一个from+size大小的结果集,因此优先级队列的大小也是from+size。分片仅会返回一个轻量级的结果给协调节点,包含结果集中的每一个文档的ID和进行排序所需要的信息。

协调节点会将所有分片的结果汇总,并进行全局排序,得到最终的查询排序结果。此时查询阶段结束。

取回阶段

查询过程得到的是一个排序结果,标记出哪些文档是符合搜索要求的,此时仍然需要获取这些文档返回客户端。

协调节点会确定实际需要返回的文档,并向含有该文档的分片发送get请求;分片获取文档返回给协调节点;协调节点将结果返回给客户端

ElasticSearch中怎么实现集群分布式

上述内容就是ElasticSearch中怎么实现集群分布式,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ElasticSearch中怎么实现集群分布式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ElasticSearch的基本概念和集群分布式底层实现

本文试图通过总结ElasticSearch基本概念和底层原理,加深自身理解,同时希望对使用者有所帮助,避免不必要的踩坑。

Elasticsearch分布式集群搭建与管理实践(如何构建并管理一个高效的Elasticsearch分布式集群?)

本文详细讲解了构建和管理高效Elasticsearch分布式集群的实践。涵盖了集群架构、硬件和网络、安装和配置、集群管理、性能优化以及最佳实践等方面。遵循文中指导,可以构建一个可靠且满足搜索和分析需求的Elasticsearch集群。
Elasticsearch分布式集群搭建与管理实践(如何构建并管理一个高效的Elasticsearch分布式集群?)
2024-04-02

Elasticsearch分布式搜索引擎的集群发现与自动扩展(Elasticsearch如何自动发现集群并实现自动扩展?)

Elasticsearch的集群发现基于ZenDiscovery,它使用gossip协议让节点相互通信并更新集群状态。自动扩展通过CloudAutoScaling实现,根据指标(如CPU使用率)自动调整节点数量。ZenDiscovery机制允许节点发现彼此并建立集群视图,而自动扩展确保高可用性和可扩展性,并优化成本,无需停机或重新配置。最佳实践包括使用ZenDiscovery、配置自动扩展触发器、监控集群指标和测试扩展功能,以优化集群性能。
Elasticsearch分布式搜索引擎的集群发现与自动扩展(Elasticsearch如何自动发现集群并实现自动扩展?)
2024-04-02

mysql分布式集群怎么搭建

要搭建一个 MySQL 分布式集群,可以采用以下步骤:选择合适的分布式架构:MySQL 分布式集群可以采用主从复制、主从同步复制、主从多从复制等不同的架构方式。根据实际需求和性能要求,选择合适的分布式架构。部署数据库节点:在不同的服务器上
mysql分布式集群怎么搭建
2024-04-18

mysql分布式集群实现的原理是什么

MySQL分布式集群实现的原理主要依靠数据分片、数据复制和数据同步来实现。具体原理如下:数据分片:将数据库中的数据划分为多个片段,每个片段称为一个分片。每个分片可以存储在不同的物理服务器上,实现数据的分布式存储和处理。数据复制:在每个分片内
mysql分布式集群实现的原理是什么
2024-04-09

Hadoop2.7.5+Spark2.2.1分布式集群怎么搭建

这篇文章主要介绍“Hadoop2.7.5+Spark2.2.1分布式集群怎么搭建”,在日常操作中,相信很多人在Hadoop2.7.5+Spark2.2.1分布式集群怎么搭建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
2023-06-03

hadoop伪分布式集群怎么安装

Hadoop伪分布式集群是在单台机器上模拟多台机器的Hadoop集群环境,可以用来进行开发和测试。以下是Hadoop伪分布式集群的安装步骤:下载并解压Hadoop首先,从Hadoop官网下载最新版本的Hadoop压缩包,并解压到指定目录。
hadoop伪分布式集群怎么安装
2024-03-13

Ubuntu Spark集群的分布式锁实现方案

在分布式系统中,分布式锁是一种常见的同步机制,用于确保在多个节点上同时运行的进程或线程不会同时访问共享资源,从而避免数据不一致和其他并发问题。以下是在Ubuntu Spark集群中实现分布式锁的几种方案:基于Redis的分布式锁Redi
Ubuntu Spark集群的分布式锁实现方案
2024-10-22

windows怎么搭建Redis分布式集群

要搭建Redis分布式集群,您可以按照以下步骤进行操作:1. 下载Redis的稳定版本,并解压到不同的目录,例如:redis1、redis2、redis3。2. 分别进入redis1、redis2、redis3目录,并分别编辑redis.c
2023-09-11

分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择优秀实践

Citus 的分布式执行器然后将这些单独的查询片段发送到 PostgreSQL worker 实例。分布式规划器和执行器都有几个方面可以调整以提高性能。

怎么理解Ceph分布式存储集群

怎么理解Ceph分布式存储集群,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在规划Ceph分布式存储集群环境的时候,对硬件的选择很重要,这关乎整个Ceph集群的
2023-06-06

docker下怎么搭建fastdfs分布式集群

这篇文章主要讲解了“docker下怎么搭建fastdfs分布式集群”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“docker下怎么搭建fastdfs分布式集群”吧!本文在centos6.8下
2023-06-19

Redis的集群模式怎么实现数据分片

在Redis集群模式中,数据分片是通过将数据分散存储在多个节点上来实现的。具体实现数据分片的步骤如下:哈希槽分配:Redis集群将所有数据分成16384个哈希槽,每个槽对应一个整数值。当一个键需要存储到集群中时,Redis会根据键的哈希值来
Redis的集群模式怎么实现数据分片
2024-05-07

编程热搜

目录