ElasticSearch 基本原理及架构

一、ElasticSearch介绍

1、ES基本概述

Elasticserach由来:

许多年前,一个叫Shay Banon的待业工程师跟随他的新婚妻子来到伦敦,他的妻子想在伦敦学习做一名厨师。而他在伦敦寻找工作的期间,接触到了Lucene的早期版本,他想为自己的妻子开发一个方便搜索菜谱的应用。

Elasticsearch发布的第一个版本是在2010年的二月份,从那之后,Elasticsearch便成了Github上最受人瞩目的项目之一,并且很快就有超过300名开发者加入进来贡献了自己的代码。后来Shay和另一位合伙人成立了公司专注打造Elasticsearch,他们对Elasticsearch进行了一些商业化的包装和支持。但是,Elasticsearch承诺,永远都将是开源并且免费的。

Elastic为主体的公司提供了很多优秀的解决方案,拿到很多的投资,现已上市,后来收购logstash,kibana及一些其他的服务。

  • ElasticSearch
  • Logstash
  • Kibana …

据国际权威的数据库产品评测机构DBEngines的统计,在2016年1月,Elasticsearch已超过Solr等,成为排名第一的搜索引擎类应用.

2、ES是什么?

1)ES = elasticsearch简写, Elasticsearch是一个开源的高扩展分布式全文检索引擎.
2)Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单

ElasticSearch 基本原理及架构_第1张图片

ElasticSearch 基本原理及架构_第2张图片

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:

{
	"name" : "John",
	"sex" : "Male",
	"age" : 25,
	"birthDate": "1990/05/01",
	"about" : "I love to go rock climbing",
	"interests": [ "sports", "music" ]
}

3、为什么要使用ES?

ES国内外使用优秀案例

  • 1) 2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。 “GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”。
  • 2)维基百科:启动以elasticsearch为基础的核心搜索架构。
  • 3)SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”。
  • 4)百度:百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据。

我们也需要

  • 实际项目开发实战中,几乎每个系统都会有一个搜索的功能,当搜索做到一定程度时,维护和扩展起来难度就会慢慢变大,所以很多公司都会把搜索单独独立出一个模块,用ElasticSearch等来实现。
  • 近年ElasticSearch发展迅猛,已经超越了其最初的纯搜索引擎的角色,现在已经增加了数据聚合分析(aggregation)和可视化的特性,如果你有数百万的文档需要通过关键词进行定位时,ElasticSearch肯定是最佳选择。
  • 当然,如果你的文档是JSON的,你也可以把ElasticSearch当作一种“NoSQL数据库”, 应用ElasticSearch数据聚合分析(aggregation)的特性,针对数据进行多维度的分析。

4、ES有什么能力?

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.

实际项目开发实战中,几乎每个系统都会有一个搜索的功能,当数据达到很大且搜索要做到一定程度时,维护和扩展难度就会越来越高,并且在全文检索的速度上、结果内容的推荐、分析以及统计聚合方面也很难达到我们预期效果。

ElasticSearch 基本原理及架构_第3张图片

并且 Elasticsearch ,它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。(实时的存储、检索数据)
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。(一个集群只能支持:上百台 ---- 中等规模的数据,可以弄多个集群)

5、使用场景

1)网站搜索:ES搜索自动:补全建议、关键词搜索

2)日志分析:ELK经典组合,ElasticSearch + logstash + kibana === 日志收集 + 日志分析 + 运维

3)数据预警:第三方插件 wathcer 监控数据

4)商业智能,数据分析:ES数据分析

一线公司ES使用场景

1)新浪ES 如何分析处理32亿条实时日志 http://dockone.io/article/505
2)阿里ES 构建挖财自己的日志采集和分析体系 http://afoo.me/columns/tec/logging-platform-spec.html
3)有赞ES 业务日志处理 http://tech.youzan.com/you-zan-tong-ri-zhi-ping-tai-chu-tan/
4)ES实现站内搜索 http://www.wtoutiao.com/p/13bkqiZ.html

二、ES的架构

ElasticSearch 基本原理及架构_第4张图片

1、网关Gateway层

  • 底层文件系统:
    ES用来存储索引文件的一个文件系统且它支持很多类型。例如:本地磁盘、共享存储(做snapshot的时候需要用到)、hadoop的hdfs分布式存储、亚马逊的S3。
  • 职责:
    它的主要职责是用来对数据进行长持久化以及整个集群重启之后可以通过gateway重新恢复数据。代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。
  • 数据安全:
    当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
  • 存储数据:
    存储索引信息,集群信息,mapping 等等

Gateway:
Local FileSystem:本地文件系统
Shared FileSystem:共享文件系统
Hadoop HDFS:大数据HDFS分布式文件系统
Amazon S3:亚马逊的一个分布式文件系统

ES目前主要使用Local FileSystem,主要利用本机节点、本地文件系统存储索引和文档,其他三个都废弃掉了

2、DLD

Gateway上层就是一个lucene的分布式框架

lucene是做检索的,但是它是一个单机的搜索引擎,像这种es分布式搜索引擎系统,虽然底层用lucene,但是需要在每个节点上都运行lucene进行相应的索引、查询以及更新,所以需要做成一个分布式的运行框架来满足业务的需要。

Distributed Lucene Directory:分布式lucene目录,lucene只能支持单体架构的搜索,不具有分布式的能力,那怎么让他具有分布式能力,就要对他改造,使用lucene的API把它做成了具有分布式的一种lucene的目录结构

3、四大模块组件

districted lucene directory 之上就是 ES 的四大模块 :

  • Index Module 是索引模块,就是对数据建立索引也就是通常所说的建立一些倒排索引等;
  • Search Module 是搜索模块,就是对数据进行查询搜索;
  • Mapping Module 是数据映射与解析模块,就是你的数据的每个字段可以根据你建立的表结构通过mapping进行映射解析,如果你没有建立表结构,es就会根据你的数据类型推测你的数据结构之后自己生成一个mapping,然后都是根据这个mapping进行解析你的数据;
  • River Module 在es2.0之后应该是被取消了,它的意思表示是第三方插件,例如可以通过一些自定义的脚本将传统的数据库(mysql)等数据源通过格式化转换后直接同步到es集群里,这个River大部分是自己写的,写出来的东西质量参差不齐,将这些东西集成到es中会引发很多内部bug,严重影响了es的正常应用,所以在es2.0之后考虑将其去掉。

Index Module:索引模块,添加数据要使用索引模块,创建索引
Search Module:搜索模块,根据关键词匹配索引查询想要的文档
Mapping:映射,相当于创建数据库时约束的字段一样,例如varchar,int,long类型都在mapping中进行约束
River:第三方插件,用来实时导入数据库数据的,已经废弃掉

4、自动发现Discovery、Script

ES 四大模块 组件之上有 Discovery 模块:

es是一个集群包含很多节点,很多节点需要互相发现对方,然后组成一个集群包括选主的,这些es都是用的discovery模块,默认使用的是 Zen

es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

es查询还可以支撑多种script即脚本语言,包括mvel、js、python等等

Discovery:集群中节点之间发现的组件
Scripting:脚本,支持一些脚本语言
3rd Plugins:支持第三方插件的整合,留了入口,例如ik分词器

5、通信(Transport)

  • 代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)
  • 节点间通信端口默认:9300-9400
  • JMX就是java的一个远程监控管理框架,因为es是通过java实现的。

Transport - RESTful Style API:RESTful方式访问,支持Thrift、Memcached、Http协议
JMX - Java(Netty):Java客户端方式访问,利用Netty,通过JMX协议

6、 RESTful接口层

最上层就是ES暴露给我们的 访问接口

官方推荐的方案就是这种Restful接口,直接发送http请求,方便后续使用nginx做代理、分发包括可能后续会做权限的管理,通过http很容易做这方面的管理。

如果使用java客户端它是直接调用api,在做负载均衡以及权限管理还是不太好做。

三、ES集群架构

1、伪集群(空集群、单机Node)

启动一个ES节点,和Head插件可视化界面
ElasticSearch 基本原理及架构_第5张图片

可以看到一个节点是亚健康状态

ElasticSearch 基本原理及架构_第6张图片

1.1、默认分片

通过http方式创建索引:
添加文档,如果发现索引不存在会自动创建:
ElasticSearch 基本原理及架构_第7张图片

默认创建5个主分片、5个副本分片
ElasticSearch 基本原理及架构_第8张图片

ElasticSearch 基本原理及架构_第9张图片

场景:
1)单node环境下,创建一个索引index,默认创建5个primary shard,5个replica shard
2)yellow
3)分片分配:把5个主分片分配到一台机器
4)伪集群可以正常工作的,但是一旦宕机,可能出现数据丢失的现象。而集群不可用。

1.2、规划分片

设置语法:
PUT /索引库名字

{
	"number_of_shards": 3,		//主分片数量
	"number_of_replicas": 1		//每个主分片的副本分片数量
}

ElasticSearch 基本原理及架构_第10张图片

可以看到只有3个主分片:
ElasticSearch 基本原理及架构_第11张图片

ElasticSearch 基本原理及架构_第12张图片

ElasticSearch 基本原理及架构_第13张图片

2、集群结构

启动集群环境:

# -Ecluster.name:集群名称
# -Epath.data:数据存储路径
# -Enode.name:集群中的节点名称
# -Ehttp.port:http的端口
# -d:后台启动
bin/elasticsearch -Ecluster.name=c_cluster -Epath.data=my_cluster_node1 -Enode.name=node1 -Ehttp.port=5100 -d

启动三个节点:
ElasticSearch 基本原理及架构_第14张图片

删掉所有索引,新建索引演示效果:
ElasticSearch 基本原理及架构_第15张图片
看到一共有3个主分片,3个副本分片,均匀放在三个节点中
注意分片分配的原则是主分片和它的副本分片不会放在同一个节点中,保证数据安全性(和Kafka相似)

ElasticSearch 基本原理及架构_第16张图片
AP架构肯定要有master节点
master节点和从节点都具有读写能力,因为写的操作最终都是写入到主分片中的,只要节点中有主分片都可以写入数据

集群特点说明:
ElasticSearch 基本原理及架构_第17张图片

ElasticSearch 基本原理及架构_第18张图片

节点类型配置:
ElasticSearch 基本原理及架构_第19张图片
不代表只有3中类型的节点,还有其他的很少用到。

ElasticSearch 基本原理及架构_第20张图片
ElasticSearch是一个分布式的,高效的搜索框架,底层封装lucence,分布式应对大数据量存储,检索,
关键是:让开发变得简单,隐藏了很多Lucene复杂操作
1)分片机制
2)cluster discovery
3)shard分片负载
4)shard副本、请求路由、集群扩容、shard重新分配

2.1、master节点

master节点特点:

  • 整个集群只会有一个master节点,它将负责管理集群范围内的所有变更,例如增加、删除索引;或者增加、删除节点等。而master节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个master节点的情况下,即使流量的增加它也不会成为瓶颈。
  • master节点需要从众多候选master节点中选择一个。

master节点的作用:

  • 负责集群节点上下线,shard分片的重新分配。
  • 创建、删除索引。
  • 负责接收集群状态(cluster state)的变化,并推送给所有节点。集群节点都各有一份完整的cluster state,只是master node负责维护。
  • 利用自身空闲资源,协调创建索引请求或者查询请求,将请求分发到相关node服务器。

master节点的配置如下(elasticsearch.yml)

node.master: true
node.data: false

2.2、data结点(数据节点)

data节点的作用:

  • 负责存储数据,提供建立索引和搜索索引的服务。
    data节点消耗内存和磁盘IO的性能比较大。

data节点的配置如下(elasticsearch.yml)

node.master:false
node.data: true

2.3、协调节点

协调节点的作用:

  • 不会被选作主节点,也不会存储任何索引数据。主要用于查询负载均衡。将查询请求分发给多个node服务器,并对结果进行汇总处理。

协调节点的配置如下(elasticsearch.yml)

node.master:false
node.data: false

3、ES集群核心概念

3.1、集群(cluster)

  • 代表一个集群,集群中有多个节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
  • ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的。
  • ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。
  • 集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。

ElasticSearch 基本原理及架构_第21张图片

3.2、节点(node)

  • 一个节点是一个逻辑上独立的服务,可以存储数据,并参与集群的索引和搜索功能, 一个节点也有唯一的名字,群集通过节点名称进行管理和通信.

ElasticSearch 基本原理及架构_第22张图片

3.1.1、主节点

  • 主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
  • 稳定的主节点对集群的健康是非常重要的。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。
  • 对于大型的生产集群来说,推荐使用一个专门的主节点来控制集群,该节点将不处理任何用户请求。

3.1.2、数据节点

  • 持有数据和倒排索引

3.1.3、 客户端节点

5.0之后被协调节点取代

  • 它既不能保存数据也不能成为主节点,该节点可以响应用户的情况,把相关操作发送到其他节点;
  • 客户端节点会将客户端请求路由到集群中合适的分片上。对于读请求来说,协调节点每次会选择不同的分片处理请求,以实现负载均衡

3.1.4、部落节点

  • 部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据

部落节点可以把多个集群整合在一起,来维护多个集群的状态

四、ES重点名词解释

ES重点名词解释,Index、Type、Document、Mapping
ElasticSearch 基本原理及架构_第23张图片
注意:
在 5.X 版本中,一个 index 下可以创建多个 type;
在 6.X 版本中,一个 index 下只能存在一个 type;
在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
所以也可以认为一个索引就是一张表。

向索引库中添加两条数据:
ElasticSearch 基本原理及架构_第24张图片

ElasticSearch 基本原理及架构_第25张图片

ES做搜索的时候,第一件事就要把映射Mapping的约束条件提前规定好,和创建数据库表有点类似,把表字段,长度类型决定好,不想弄也是可以的,直接创建一条数据,ES自动根据数据创建
ElasticSearch 基本原理及架构_第26张图片

ElasticSearch 基本原理及架构_第27张图片

1、索引(Index) !!!注意跟Lucene的索引不是一个概念

ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作并通过ElasticSearch内部使用Lucene将数据写入索引或从索引中检索数据。一个ES集群中可以按需创建任意数目的索引。

在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
所以Index可以理解为就是mysql中的表

2、文档类型(Type)

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

注意!!!
6.0之后删除了Type的概念,一个索引中只能有一个类型,原因:type本来就跟表的概念不一样,table在数据库中是独立存储的,ES中不同的type存储在同一个索引中的相同字段会映射到一起,例如:学生表中的name和班级表中的name,索引中会指向同一处,而且数据类型不能不同。

在 5.X 版本中,一个 index 下可以创建多个 type;
在 6.X 版本中,一个 index 下只能存在一个 type;
在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。

3、文档(Document)

文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。相当于数据库的“记录”
ElasticSearch 基本原理及架构_第28张图片

索引结构:
ElasticSearch 基本原理及架构_第29张图片
注意:类型type 在elasticsearch 6.0 已废弃。 7.X 版本直接去除了 type 的概念。

4、映射(Mapping)

  • 相当于数据库中的schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 可以自动根据数据创建

  • ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等。

ElasticSearch 基本原理及架构_第30张图片

你可能感兴趣的:(#,Elasticsearch,elasticsearch)