Elasticsearch 基础篇【ES】

前言:

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,它的用途非常广泛,主要用于全文检索、结构化搜索、数据分析以及将这三者混合使用,本篇我们来初步认识一下 ELasticsearch ,分享一些 ELasticsearch 的基本概念。

什么是 Elasticsearch ?

Elasticsearch是一个分布式的、开源的、实时的搜索和分析引擎。它是基于Apache Lucene 构建的,旨在提供快速、可扩展、高性能的搜索解决方案。Elasticsearch 支持多种数据格式,包括文本、数字、地理位置等,并提供了灵活的查询语言来满足各种搜索需求。它通常用于大规模的文本搜索,例如网站搜索,日志分析,实时数据分析等场景。Elasticsearch 还可以与其他 Elastic Stack 组件(如 Logstash 和Kibana)结合使用,以实现更复杂的数据分析和可视化功能。

Elasticsearch 官方网站

Elasticsearch有哪些优势?

Elasticsearch是一个功能非常强大的搜索和分析引擎,其优势主要体现在以下几个方面:

  • 大规模数据处理:Elasticsearch能够处理大量的数据并提供实时的搜索和分析能力。它使用了分布式架构,可以在多个服务器上扩展,从而处理PB级别的数据。
  • 高性能搜索:Elasticsearch提供了高性能的全文搜索功能,用户可以快速地从大量数据中检索到所需的信息。
  • 实时分析:它能够对数据进行实时分析和聚合计算,这对于需要快速做出决策的业务环境至关重要。
  • 灵活性和多样性:Elasticsearch支持多种数据类型,包括文本、数字、日期、地理位置等,并能够处理各种复杂的查询,包括模糊查询、范围查询、正则表达式查询等。
  • 易于集成:Elasticsearch具备高度的RESTful API兼容性,可以很容易地与现有的应用程序和服务集成,例如日志分析平台、监控系统、内容管理系统等。
  • 可扩展性:随着数据量的增长,Elasticsearch可以通过水平扩展(增加新节点)来提升性能和容量。
  • 容错性与高可用性:通过自动分片(sharding)和复制(replication)机制确保数据在节点失败时的安全性和可用性。
  • 开源社区支持:Elasticsearch是开源软件,有着活跃的社区和丰富的资源,提供大量的插件和工具来满足不同场景的需求。

Elasticsearch 最大的优势就是全文检索和大规模数据分析。

Elasticesearch 的核心术语

索引(Index)

Elasticsearch 中的索引类似于传统数据库中的库的概念,它是存储相关文档(Document)的地方。Elasticsearch 索引是分布式的。它会将数据分散存储在多个节点(Node)上,以实现高可用性和可扩展性。

倒排索引(Inverted Index)

Elasticsearch 采用的是倒排索引(Inverted Index),传统的索引是正向索引,就像书籍的目录按照章节顺序排列。而倒排索引则是一种反向的数据结构。它是根据文档中出现的词来建立索引,例如有文档 A “好好学习,回馈社会” 和文档 B “好好学习,报效祖国”,倒排索引会记录 “好好学习” 这个词出现在文档 A 和 B 中,当用户搜索 “好好学习” 时,系统可以快速定位到包含这个词的文档是 A 和 B,这种创建索引的方式就是倒排索引,这种索引结构使得搜索关键词时候定位到相关的文档会非常高效。

类型(Type)

在老版本的 Elasticsearch 中类型(type)对应关系型数据库中的表,在新版本中的 Elasticsearch 中已经去除了类型(type)这个概念,因为在数据存储的时候,一个索引下所有的类型(type)都存储在一个索引中,如果索引下有多个类型(type),那反倒会拖慢查询的速度,因此在新版本的 Elasticseacrch 中去掉了类型(type)的概念。

文档(document)

文档是可以被索引的基本数据单位,也就是一条一条的数据,相当于关系型数据库中的行,不同的是文档是以 json 来格式来存储数据。

字段(field)

字段(field) 相当于关系型数据库中的字段(column),每个 field 都有自己的数据类型,不同的数据类型存储不同的数据,关系型数据库必须先定义固定的数据类型和属性长度,而 Elasticsearch 则可以不设定数据类型,在写入数据时会根据数据值自动生成对应的数据类型。

映射(Mapping)

映射(Mapping)类似于数据库中的表结构定义,它定义了索引(index)中的文档(document)的字段类型、存储方式、如何进行索引以及如何被搜索等,简单来说映射(Mapping)告诉 Elasticsearch 如何理解和处理存储在索引中的数据,它对于正确地存储、索引和搜索数据起着关键的作用,合理地定义和管理映射(Mapping)可以提高搜索性能和数据质量。

分片(Shards)

当一个索引(Index)的数据量过大时,为了能够高效地存储、查询数据,Elasticsearch 会把索引(Index)的数据分成多个分片,每个分片是一个 Lucene 索引,Elasticsearch 分片可以类比关系型数据库中的分表,如果一个表数据量很大,就会导致单库写入和查询压力很大,就可以使用分库分表的方式来分担压力。

副本(Replicas)

副本(Replicas)就是分片(Shards)的副本,副本(Replicas)存在的价值是提升可用性和吞吐量,我们知道网络环境是非常复杂的,如果只有一个分片,那处于某种原因到值该分片处于离线状态,那就会导致整个系统不可用,同时如果系统的访问量很大,副本(Replicas)就可以承载访问流量,来提高系统的问题性,默认情况下 Elasticsearch 中的每个索引分片会有一个主分片和一个副本(Replicas)分片。

分配(Allocation)

分配(Allocation)顾名思义就是将分片分配给某个节点的过程,包括主分片和副本(Replicas)的分配以及副本(Replicas)的数据同步,分配(Allocation)是由 Master 节点来完成的。

Elasticesearch 系统架构

Elasticsearch 支持集群部署的,Elasticsearch 集群部署是,主分片都在 master 节点上(Elasticeserach 分为主分片和副本分片),副本分片会分布在其他 Node 节点上,简易架构图如下:

Elasticsearch 基础篇【ES】_第1张图片

Elasticsearch 的集群选举算法

Elasticsearch 发现 master 节点不可用的时候就会触发选举,Elasticsearch 的选举算法主要有以下两种:

  • Bully 算法。
  • Paxos算法。

Bully 算法

Bully 算法的逻辑十分简单,就是对 Node 节点的 ID 进行排序,选出 ID 最大的节点作为 Leader 节点。

选举过程:

  • 当一个 Node 节点通过心跳检测发现 Leader 节点不可用的时候,就会发起选举。
  • 发起选举的节点会所有比它节点 ID 大的节点发送选举消息,例如集群中有1、2、3、4、5 共计 5个节点,如果节点 2 发起了选举,则会对 3、4、5 节点发选举消息,如果节点 3 发起了选举,则会对节点 4、5 发送选举消息。
  • 收到选举消息的节点如果处于正常状态,就会回复一个我正在参与选举的消息,并向比自己大的节点发送选举消息。
  • 如果一个节点收到了没有收到比自己节点 ID 大的节点的回复消息,那么就可以宣布自己是 Leader 节点,如果有节点 ID 比自己大的节点,就等待其他节点宣布 Leader 节点的消息。

Paxos 算法

Paxos 算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,Paxos 算将参与算法集群中的所有服务分为三种角色:提议者(Proposer)、决策者(Acceptor)、决策学习者(Learner)。

  • 提议者(Proposer):提出议案,在分布式系统中有多个提议者。
  • 决策者(Acceptor):决策者负责对对提议者提出的议案进行接受和决策,多个决策者来决策这个议案是否能够被通过,只有足够数量(一般是超过半数)的决策者通过了议案,则该议案被通过。
  • 学习者(Learner):主要是获取达成一致的值,决策者确定了一个提案后,决策学习者会得到这个确定的结果,从而使分布式系统知道这个知道这个决议结果。

Paxos 算法选举过程

Paxos 算法分为准备阶段(Prepare)、接受阶段(Accept)、学习阶段(Learn),如下:

  • 准备阶段(Prepare):提议者(Proposer) 收到来自多数决策者(Acceptor)的响应,如果响应中包含已经接受的提案值,那么 提议者(Proposer)会选择编号最大的提案值作为自己的提案值,如果响应中没有已经接受的提案值,则提议者(Proposer) 可以自己选择一个提案值,然后 提议者(Proposer)向所有的决策者(Acceptor)发送决策请求,这个请求包含提案编号和提案值,决策者(Acceptor)收到请求后,如果这个请求的提案编号不小于它已经响应过的最大提案编号,决策者(Acceptor)则会接受这个提案。
  • 接受阶段(Accept):提议者受到足够多的响应后,发送接受请求给决策者(Acceptor),请求他们接受议案。
  • 学习阶段(Learn):当决策者(Acceptor)接受这个议案后,就会通知学习者(Learner),说明该议案已经被接受。

总结:本篇简单分享了 Elasticsearch 的基础概念和集群的一些相关知识,希望可以帮助到不太熟悉 Elasticsearch 的朋友们。

如有不正确的地方欢迎各位指出纠正。

你可能感兴趣的:(elasticsearch,大数据,搜索引擎,es,Java,后端,全文检索)