技术专栏丨从原理到应用,Elasticsearch详解

2020-05-22 00:00:00 索引 查询 文档 节点 分片

简介

Elasticsearch(简称ES)是一个分布式、可扩展、实时的搜索与数据分析引擎。ES不仅仅只是全文搜索,还支持结构化搜索、数据分析、复杂的语言处理、地理位置和对象间关联关系等。

ES的底层依赖Lucene,Lucene可以说是当下先进、高性能、全功能的搜索引擎库。但是Lucene仅仅只是一个库。为了充分发挥其功能,你需要使用Java并将Lucene直接集成到应用程序中。更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene非常复杂——《ElasticSearch官方权威指南》。

鉴于Lucene如此强大却难以上手的特点,诞生了ES。ES也是使用Java编写的,它的内部使用Lucene做索引与搜索,它的目的是隐藏Lucene的复杂性,取而代之的提供一套简单一致的RESTful API。

总体来说,ES具有如下特点:

  • 一个分布式的实时文档存储引擎,每个字段都可以被索引与搜索
  • 一个分布式实时分析搜索引擎,支持各种查询和聚合操作
  • 能胜任上百个服务节点的扩展,并可以支持PB级别的结构化或者非结构化数据

架构

节点类型

ES的架构很简单,集群的HA不需要依赖任务外部组件(例如Zookeeper、HDFS等),master节点的主备依赖于内部自建的选举算法,通过副本分片的方式实现了数据的备份的同时,也提高了并发查询的能力。

ES集群的服务器分为以下四种角色:

  • master节点,负责保存和更新集群的一些元数据信息,之后同步到所有节点,所以每个节点都需要保存全量的元数据信息:
    ▫集群的配置信息
    ▫集群的节点信息
    ▫模板template设置
    ▫索引以及对应的设置、mapping、分词器和别名
    ▫索引关联到的分片以及分配到的节点
  • datanode:负责数据存储和查询
  • coordinator:
    ▫路由索引请求
    ▫聚合搜索结果集
    ▫分发批量索引请求
  • ingestor:
    ▫类似于logstash,对输入数据进行处理和转换

如何配置节点类型

  • 一个节点的缺省配置是:主节点+数据节点两属性为一身。对于3-5个节点的小集群来讲,通常让所有节点存储数据和具有获得主节点的资格。
  • 专用协调节点(也称为client节点或路由节点)从数据节点中消除了聚合/查询的请求解析和终阶段,随着集群写入以及查询负载的增大,可以通过协调节点减轻数据节点的压力,可以让数据节点更多专注于数据的写入以及查询。

master选举

选举策略

  • 如果集群中存在master,认可该master,加入集群
  • 如果集群中不存在master,从具有master资格的节点中选id小的节点作为master

选举时机

集群启动:后台启动线程去ping集群中的节点,按照上述策略从具有master资格的节点中选举出master

现有的master离开集群:后台一直有一个线程定时ping master节点,超过一定次数没有ping成功之后,重新进行master的选举

选举流程

避免脑裂

脑裂问题是采用master-slave模式的分布式集群普遍需要关注的问题,脑裂一旦出现,会导致集群的状态出现不一致,导致数据错误甚至丢失。

ES避免脑裂的策略:过半原则,可以在ES的集群配置中添加一下配置,避免脑裂的发生

#一个节点多久ping一次,默认1s
discovery.zen.fd.ping_interval: 1s
##等待ping返回时间,默认30s
discovery.zen.fd.ping_timeout: 10s
##ping超时重试次数,默认3次
discovery.zen.fd.ping_retries: 3
##选举时需要的节点连接数,N为具有master资格的节点数量
discovery.zen.minimum_master_nodes=N/2+1

相关文章