`
weitao1026
  • 浏览: 1058077 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ElasticSearch架构概述

 
阅读更多

ElasticSearch架构概述

 

ElasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台。ES让人惊艳的是他强大的搜索相关能力和灾备策略,ES开放了一些接口供开发者研发自己的插件,ES结合中文分词的插件会给ES的搜索和分析起到很大的推动作用。ElasticSearch是使用开源全文检索库ApacheLucene进行索引和搜索的,说架构必须和Lucene的一些东西打交道。

 

关于Lucene:

ApacheLucene将写入索引的所有信息组织成一种倒排索引(Inverted Index)的结构之中,该结构是种将词项映射到文档的数据结构。其工作方式与传统的关系数据库不同,大致来说倒排索引是面向词项而不是面向文档的。且Lucene索引之中还存储了很多其他的信息,如词向量等等,每个Lucene都是由多个构成的,每个段只会被创建一次但会被查询多次,段一旦创建就不会再被修改。多个段会在段合并的阶段合并在一起,何时合并由Lucene的内在机制决定,段合并后数量会变少,但是相应的段本身会变大。段合并的过程是非常消耗I/O的,且与之同时会有些不再使用的信息被清理掉。在Lucene中,将数据转化为倒排索引,将完整串转化为可用于搜索的词项的过程叫做分析。文本分析由分析器(Analyzer)来执行,分析其由分词器(Tokenizer),过滤器(Filter)和字符映射器(Character Mapper)组成,其各个功能显而易见。除此之外,Lucene有自己的一套完整的查询语言来帮助我们进行搜索和读写。

 

 [注]ES中的索引指的是查询/寻址时URI中的一个字段如:[host]:[port(9200)]/[index]/[type]/[ID]?[option],而Lucene中的索引更多地和ES中的分片的概念相对应。

 

回到ElasticSearch,ES的架构遵循的设计理念有以下几个特征:

 

1. 合理的默认配置:只需修改节点中的Yaml配置文件,就可以迅捷配置。这和Spring4中对配置的简化有相似的地方。

2. 分布式工作模式:ES强大的Zen发现机制不仅支持组广播也支持点单播,且有“知一点即知天下”之妙。

3. 对等架构:节点之间自动备份分片,且使分片本身和样本之间尽量”远离“,可以避免单点故障。且Master节点和Data节点几乎完全等价。

4. 易于向集群扩充新节点:大大简化研发或运维将新节点加入集群所需的工作。

5. 不对索引中的数据结构增加任何限制:ES支持在一个索引之中存在多种数据类型。

6. 准实时:搜索和版本同步,由于ES是分布式应用,一个重大的挑战就是一致性问题,无论索引还是文档数据,然而事实证明ES表现优秀。

 

 

(一)分片策略

 

选择合适的分片数和副本数ES的分片分为两种,主分片(Primary Shard)和副本(Replicas)。默认情况下,ES会为每个索引创建5个分片,即使是在单机环境下,这种冗余被称作过度分配(Over Allocation),目前看来这么做完全没有必要,仅在散布文档到分片和处理查询的过程中就增加了更多的复杂性,好在ES的优秀性能掩盖了这一点。假设一个索引由一个分片构成,那么当索引的大小超过单个节点的容量的时候,ES不能将索引分割成多份,因此必须在创建索引的时候就指定好需要的分片数量。此时我们所能做的就是创建一个新的索引,并在初始设定之中指定这个索引拥有更多的分片。反之如果过度分配,就增大了Lucene在合并分片查询结果时的复杂度,从而增大了耗时,所以我们得到了以下结论:

我们应该使用最少的分片!

主分片,副本和节点最大数之间数量存在以下关系:

节点数<=主分片数*(副本数+1)

 

 控制分片分配行为。以上是在创建每个索引的时候需要考虑的优化方法,然而在索引已创建好的前提下,是否就是没有办法从分片的角度提高了性能了呢?当然不是,首先能做的是调整分片分配器的类型,具体是在elasticsearch.yml中设置cluster.routing.allocation.type属性,共有两种分片器even_shard,balanced(默认)。even_shard是尽量保证每个节点都具有相同数量的分片,balanced是基于可控制的权重进行分配,相对于前一个分配器,它更暴漏了一些参数而引入调整分配过程的能力。

每次ES的分片调整都是在ES上的数据分布发生了变化的时候进行的,最有代表性的就是有新的数据节点加入了集群的时候。当然调整分片的时机并不是由某个阈值触发的,ES内置十一个裁决者来决定是否触发分片调整,这里暂不赘述。另外,这些分配部署策略都是可以在运行时更新的,更多配置分片的属性也请大家自行Google。

 

 

(二)路由优化

 

ES中所谓的路由和IP网络不同,是一个类似于Tag的东西。在创建文档的时候,可以通过字段为文档增加一个路由属性的Tag。ES内在机制决定了拥有相同路由属性的文档,一定会被分配到同一个分片上,无论是主分片还是副本。那么,在查询的过程中,一旦指定了感兴趣的路由属性,ES就可以直接到相应的分片所在的机器上进行搜索,而避免了复杂的分布式协同的一些工作,从而提升了ES的性能。于此同时,假设机器1上存有路由属性A的文档,机器2上存有路由属性为B的文档,那么我在查询的时候一旦指定目标路由属性为A,即使机器2故障瘫痪,对机器1构不成很大影响,所以这么做对灾况下的查询也提出了解决方案。所谓的路由,本质上是一个分桶(Bucketing)操作。当然,查询中也可以指定多个路由属性,机制大同小异。

 

 

(三)ES上的GC调优

 

ElasticSearch本质上是个Java程序,所以配置JVM垃圾回收器本身也是一个很有意义的工作。我们使用JVM的Xms和Xmx参数来提供指定内存大小,本质上提供的是JVM的堆空间大小,当JVM的堆空间不足的时候就会触发致命的OutOfMemoryException。这意味着要么内存不足,要么出现了内存泄露。处理GC问题,首先要确定问题的源头,一般有两种方案:

 

1. 开启ElasticSearch上的GC日志

2. 使用jstat命令

3. 生成内存Dump

 

关于第一条,在ES的配置文件elasticsearch.yml中有相关的属性可以配置,关于每个属性的用途这里当然说不完。

第二条,jstat命令可以帮助我们查看JVM堆中各个区的使用情况和GC的耗时情况。

第三条,最后的办法就是将JVM的堆空间转储到文件中去,实质上是对JVM堆空间的一个快照。

想了解更多关于JVM本身GC调优方法请参考:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

另外,通过修改ES节点的启动参数,也可以调整GC的方式,但是实质上和上述方法是等同的。

 

 

(四)避免内存交换

 

这一点很简单,由于操作系统的虚拟内存页交换机制,会给性能带来障碍,如数据写满内存会写入Linux中的Swap分区。

可以通过在elasticsearch.yml文件中的bootstrap.mlockall设置为true来实现,但是需要管理员权限,需要修改操作系统的相关配置文件。

 

 

(五)控制索引合并

 

上文提到过,ES中的分片和副本本质上都是Lucene索引,而Lucene索引又基于多个索引段构建(至少一个),索引文件中的绝大多数都是只被写一次,读多次,在Lucene内在机制控制下,当满足某种条件的时候多个索引段会被合并到一个更大的索引段,而那些旧的索引段会被抛弃并移除磁盘,这个操作叫做段合并。 

Lucene要执行段合并的理由很简单充分:索引段粒度越小,查询性能越低且耗费的内存越多。频繁的文档更改操作会导致大量的小索引段,从而导致文件句柄打开过多的问题,如修改系统配置,增大系统允许的最大文件打开数。总的来讲,当索引段由多一个合并为一个的时候,会减少索引段的数量从而提高ES性能。对于研发者来讲,我们所能做的就是选择合适的合并策略,尽管段合并完全是Lucene的任务,但随着Lucene开放更多配置借口,新版本的ES还是提供了三种合并的策略tiered,log_byte_size,log_doc。另外,ES也提供了两种Lucene索引段合并的调度器:concurrent和serial。其中各者具体区别,这里暂不赘述,只是抛砖引玉。

分享到:
评论

相关推荐

    ElasticSearch + 架构解析 + 最佳实践

    一、ElasticSearch 应用概述 ElasticSearch 是一个基于 Lucene 的搜索引擎,它可以处理大量的数据,并提供了高效的搜索和聚合分析功能。ElasticSearch 的应用场景非常广泛,例如文档搜索、数据分析、日志分析等。 ...

    从Elasticsearch来看分布式系统架构设计.docx

    #### Elasticsearch架构概述 Elasticsearch是一个开源的分布式搜索和分析引擎,它基于Lucene开发,能够提供近实时的全文检索能力。Elasticsearch不仅适用于搜索场景,还广泛应用于数据分析和日志处理等领域。下面...

    elasticsearch-7.10.2 源码

    一、Elasticsearch 架构概述 Elasticsearch 采用分布式、RESTful 风格的架构,支持横向扩展,可以轻松处理大量数据。它包含以下几个核心组件: 1. **节点(Nodes)**:每个运行 Elasticsearch 的服务器都是一个节点...

    02-EElasticsearch 升级和双活架构实践 - 徐胜 上海 2025.5.25

    **2.1 双活架构概述** 同城双活架构旨在提高系统的可用性和容灾能力。具体来说,就是在同一城市的两个不同数据中心部署两套相互独立但又能实时同步数据的集群。这种方式可以有效避免单点故障导致的服务中断,同时还...

    source-code-ns-elasticsearch-master.zip

    一、Elasticsearch架构概述 Elasticsearch采用了分布式、RESTful风格的设计,其架构基于Apache Lucene,提供了强大的全文搜索功能。Elasticsearch的节点(Node)通过网络相互连接,形成一个集群(Cluster),每个...

    Elasticsearch入门、Kibana 索引管理(elasticserch-head 插件使用, Kibanan 安装和使用)

    2、ES架构模块 3、Elasticsearch核心概念 五、ES的集群部署 六、node01服务器安装elasticsearch-head插件 1 、node01机器安装nodejs 2 、node01机器安装 elasticsearch-head 插件 七、node01服务器

    elastic6.3.2pdf文档

    #### 三、Elasticsearch架构概述 Elasticsearch 架构主要包括以下几个关键组件: 1. **节点(Node)**:Elasticsearch 集群中的单个实例。 2. **集群(Cluster)**:一组节点的集合,它们共同存储数据并提供协同特性,...

    最完整的Elasticsearch 基础教程

    1. **Elasticsearch 概述** - Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和数据分析引擎。 - 它的核心特性包括实时性、高可用性和横向扩展能力,支持索引、搜索、分析和可视化等多种功能。 2...

    elasticsearch概述及应用.pdf

    Elasticsearch,简称 ES,是一款基于 Lucene 构建的开源、分布式、RESTful 搜索引擎。这款强大的工具以其卓越的搜索能力和分布式特性,在企业级搜索领域占据着举足轻重的地位。以下是关于 Elasticsearch 的几个关键...

    微服务架构概述视频分享

    分布式追踪是Spring Cloud Sleuth,它整合了Zipkin和ELK(Elasticsearch、Logstash、Kibana)等工具,帮助开发者理解分布式系统中的请求流,从而优化性能和定位问题。 在学习和实践Spring Cloud的过程中,你需要...

    es5.0高手进阶篇

    Elasticsearch 架构概述 Elasticsearch采用分布式架构,主要由以下几个核心组件构成: - **Nodes (节点)**: Elasticsearch集群中的单个服务器实例。 - **Clusters (集群)**: 一个或多个节点的集合。 - **Indices ...

    Elasticsearch概述、原理及应用.pdf

    ### Elasticsearch 概述 Elasticsearch 是一款基于 Lucene 的开源搜索和分析引擎,它以其卓越的性能和灵活性,在众多领域内得到了广泛应用。Elasticsearch 的核心价值在于它能够为用户提供一个分布式、多租户能力的...

    elasticsearch-demo.zip

    在现代大数据处理和搜索领域,Elasticsearch(ES)因其高效、可扩展的特性,已经成为广泛使用的搜索引擎和数据分析工具。而SpringBoot作为Java开发者的首选微服务框架,它简洁的配置方式和强大的自动化配置能力,...

    基于HDFS、ElasticSearch、Spark和TensorFlow的文本分析中台基础架构.pptx

    ### 基于HDFS、ElasticSearch、Spark和TensorFlow的文本分析中台基础架构 #### 一、概述 随着大数据技术的发展,文本分析在众多业务场景中扮演着越来越重要的角色。本文档旨在介绍一种综合了HDFS、ElasticSearch、...

    Elasticsearch安装手册

    #### 一、Elasticsearch概述 **Elasticsearch**是一款高度可扩展的开源全文搜索引擎,其主要特点在于能够快速存储、检索以及分析大规模的数据集。通常情况下,Elasticsearch被用作后端服务,为那些需要进行复杂查询...

    ElasticSearch_6.8.0版本.md

    ElasticSearch 概述 ElasticSearch (ES) 是一个基于 Apache Lucene 的开源搜索引擎,它提供了一个简单易用的 RESTful API 接口,使开发者可以轻松地集成搜索功能到应用程序中,无需深入了解 Lucene 的复杂细节。 ...

    ElasticSearch技术文档

    Elasticsearch(简称ES)是一款开源的全文搜索引擎,基于Lucene构建,设计用于分布式、实时、可扩展的数据存储和搜索。它不仅提供了搜索功能,还支持数据分析和可视化,广泛应用于日志分析、监控、大数据处理等领域...

    ElasticSearch_Windows实现搜索学习笔记.pdf

    【Elasticsearch 概述】 Elasticsearch,简称ES,是一个开源、高度可扩展的分布式全文检索引擎。它设计用于处理大数据,具有优秀的实时性,能够处理PB级别的数据。ES的核心是基于Java开发的,并利用Lucene库实现...

    Elasticsearch 的分享

    **架构概述:** Elasticsearch 的架构主要包括以下几个关键组件: - **集群**:由一个或多个节点组成的集合。 - **节点**:单个服务器实例,每个节点可以托管一个或多个分片。 - **索引**:逻辑命名空间,用于存储...

    Elasticsearch权威指南-中文.pdf

    - **Elasticsearch架构**:详解ES的分片、副本、节点和集群的概念,以及它们如何协同工作以实现高可用性和弹性扩展。 - **RESTful API**:讲解如何通过HTTP接口与ES进行交互,包括索引、搜索、更新、删除等操作。 ...

Global site tag (gtag.js) - Google Analytics