第3篇: Elasticsearch架构及模块功能介绍

2022年05月15日 阅读数:1
这篇文章主要向大家介绍第3篇: Elasticsearch架构及模块功能介绍,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

背景:目前国内有大量的公司都在使用 Elasticsearch,包括阿里、京东、滴滴、今日头条、小米、vivo等诸多知名公司。除了搜索功能以外,Elasticsearch还结合Kibana、Logstash、Elastic Stack还被普遍运用在大数据近实时分析领域,包括日志分析、指标监控等多个领域。 java

目录git

一、Elasticsearch总体架构图github

1.1 源码地址数据库

1.2 架构分层编程

二、各层级模块解释api

2.1 应用层缓存

2.1.1 RestFul API性能优化

2.1.2 Java API服务器

2.2 协议层网络

2.2.1 Thrift

2.2.2 Memcached

2.2.3 Http

2.2.4 TCP

2.2.5 JMX

2.3 发现/脚本层

2.3.1 Discovery

2.3.2 Scripting

2.4 数据处理层

2.4.1 Index Module

2.4.2 Search Module

2.4.3 Mapping

2.4.4 River

2.5 核心架构层

2.5.1 Lucene

2.6 数据存储层

2.6.1 Gateway


一、Elasticsearch总体架构图

首先,建议你们在了解架构以前,下载源码看一看工程结构,能更好的有助于理解总体架构图。

1.1 源码地址

github: https://github.com/elastic/elasticsearch

gitee: https://gitee.com/mirrors/elasticsearch

1.2 架构分层

咱们先从应用层、协议层、发现/脚本层、数据处理层、核心架构层以及数据存储层这6层来梳理ES总体架构。分层以下:

 若是有一些朋友对其中涉及的名词不清楚,能够先看这篇文章:Elasticsearch的相关名称解释 。

二、各层级模块解释

2.1 应用层

2.1.1 RestFul API

在ElasticSearch中,提供了功能丰富的RestFul API操做,包括CURD操做和建立索引,删除索引等。样例格式以下:

查看集群信息:http://127.0.0.1:9200/
查看所有索引:http://127.0.0.1:9200/_all
查看索引信息:http://127.0.0.1:9200/test_search_after/_mapping
查看索引数据:http://127.0.0.1:9200/test_index/_search

2.1.2 Java API

1) TransportClient (7.x 废弃、8.0移除, 难以向下兼容版本)

Settings settings = Settings.builder().put("cluster.name", "test").build();
TransportClient transportClient = new PreBuiltTransportClient(settings) 
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301));

2) RestHighLevelClient(7.x之后经常使用)

RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"),new HttpHost("localhost", 9201, "http")));

2.2 协议层

2.2.1 Thrift

Thrift是一种接口描述语言和二进制通信协议,能够用来进行扩展且跨语言的服务的开发。它也是一个RPC框架来,是由Facebook为大规模跨语言服务开发而开发的。平常开发中,一般主要是针对Client和Server的thrift文件编写,若是有使用protobuf的经验会更容易上手。目前在市面上使用比较少,做为了解内容便可。

2.2.2 Memcached

Memcached是基于key-value,具备高性能、分布式的内存对象存储的缓存系统,它经过减轻数据库负载加速动态C端应用快速查询;目前使用的比较少,基本被Redis所替代。

2.2.3 Http

Elasticsearch对外提供的API是以HTTP协议的方式,经过JSON格式以REST约定对外提供。它为咱们提供了RestFul API和Java API RestHighLevelClient来提供开发使用。

2.2.4 TCP

 ElasticSearch由Transport负责通讯,而Transport是基于TCP通讯采用Netty实现。基于Netty的通讯编码中须要为客户端建立Bootstrap、服务端建立ServerBootstrap。

说明:Netty是一个基于NIO的客户、服务器端的编程框架,它吸取了多种协议(FTP、SMTP、HTTP等)的优秀经验,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 

// Netty4Transport.jaav
@Override
protected void doStart() {
    boolean success = false;
    try {
        sharedGroup = sharedGroupFactory.getTransportGroup();
        clientBootstrap = createClientBootstrap(sharedGroup); //Bootstrap
        if (NetworkService.NETWORK_SERVER.get(settings)) {
            for (ProfileSettings profileSettings : profileSettingsSet) {
                createServerBootstrap(profileSettings, sharedGroup);
                bindServer(profileSettings); //ServerBootstrap
            }
        }
        success = true;
    } finally {
        if (success == false) {
            doStop();
        }
    }
}

2.2.5 JMX

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的代理和服务框架。JMX能够跨越一系列异构操做系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。(平常ES中使用比较少,做为了解部分便可)

2.3 发现/脚本层

2.3.1 Discovery

ZenDiscovery属于ES的特殊发现机制,也是ES的内置发现机制,它提供了两种发现方式:单播和多播。主要做用是发现集群中的节点以及选举Master节点。

多播: 指一个节点能够向多台机器发送请求。生产环境中ES不建议使用这种方式,对于一个大规模的集群,组播会产生大量没必要要的通讯。

单播: 当一个节点加入一个现有集群,或者组建一个新的集群时,请求发送到一台机器。当一个节点联系到单播列表中的成员时,它就会获得整个集群全部节点的状态,而后它会联系Master节点并加入集群。单播也是ES 默认配置方式。

2.3.2 Scripting

Elasticsearch中最强大、有用的功能多是其 Scripting 功能,经过辅助解决一些辅助业务问题。但因为存在性能 和 使用场景少的问题,目前实际生产中使用比较少。官方文档性能优化中明确指出使用脚本会致使性能低;非复杂业务场景下,基础的增、删、改、查基本上就能搞定。脚本示例:

"script": {
    "lang":   "...",  
    "source" | "id": "...", 
    "params": { ... } 
  }

lang:表明language脚本语言,默认指定为:painless。
source:脚本的核心部分,id应用于:stored script。
params:传递给脚本使用的变量参数。

2.4 数据处理层

2.4.1 Index Module

索引模块是按索引建立的模块,控制index相关的全部方面。

好比常见的Settings操做: Settings settings = Settings.builder().put("cluster.name", "test").build();

2.4.2 Search Module

查询模块主要用于搜索并返回查询结果。常见的查询语句以下:

GET /_search                                     //搜索全部的索引中全部的类型
GET /alibaba/_search                         //在alibaba索引中搜索全部的类型
GET /alibaba,kxtx/_search                 //在alibaba和kxtx索引中中搜索全部的文档
GET /m*,k*/_search                            //在任何以m或者k开头的索引中搜索全部的类型 
GET /alibaba/employee/_search        //在alibaba索引中搜索employee类型
GET /gb,us/user,tweet/_search          //在gb和us索引中搜索user和tweet类型
GET /_all/user,tweet/_search            //在全部的索引中搜索user和tweet 类型

2.4.3 Mapping

这部分能够参考前面的文章,Elasticsearch的相关名称解释

2.4.4 River

Elastisearch中提供了River模块来从其余数据源中获取数据,该项功能以插件的形式存在,目前已有的River插件包括:RabbitMQ、ActiveMQ、CSV、FileSystem、JDBC、GitHub、Kafka等,已经覆盖了大部分的数据源,特别是针对关系型数据库提供了统一的jdbc-river来进行数据操做。

2.5 核心架构层

2.5.1 Lucene

Lucene是最早进、功能最强大的搜索库,直接基于lucene开发很是复杂,API复杂(实现一些简单的功能,写大量的java代码),须要深刻了解原理。
而Elasticsearch也是基于Lucene,隐藏了Lucene复杂性,提供了简单易用的Restful API接口、Java api接口等,易于用户操做。基本能够作开箱即用,租赁不少默认参数优化,不须要任何额外设置。

2.6 数据存储层

2.6.1 Gateway

Gateway 是 Elasticsearch 索引的持久化存储方式,ES 默认是先把索引存放到内存中,当内存满了以后,再持久化到硬盘里。当这个 Elasticsearch 集群关闭或者再次从新启动时就会从 Gateway 中读取索引数据。 Gateway支持多种类型:本地文件系统(默认)、分布式文件系统Hadoop 以及 AMZ 的S3云存储服务。