ElasticSearch
1、ElasticSearch简介
ElasticSearch是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful接口。
2、ElasticSearch概念
2.1 ElasticSearch核心概念
Near Realtime(NRT)
Elasticsearch是一个近乎实时的搜索平台。从索引文档到可以搜索的时间只有轻微的延迟(通常是1秒)。
Cluster(集群)
集群,集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。
集群名称是唯一的,建议命名(es-dev、es-prod、es-test)
Node(节点)
节点是单独的服务器,属于集群中的一部分,节点由名称标识,默认是启动是随机分配UUID,但建议自定义名称,利于管理运维。
Shard(分片)
分片,Elasticsearch可以将一个index中document数据切分成多个shard,分布在多台服务器上存储,每个shard都是一个lucene index,
最多能有document一样多。
Shard重要性:
1.允许水平分割/扩展内容卷
2.允许跨分片(多个节点)分布和并行操作,从而提高性能与吞吐量。
Replica(副本)
副本,replica主要用来保证高可用(故障转移)、数据备份、增强高吞吐的并行搜索。
Replica重要性:
1.提供了高可用,副本永远都是分配到非主分片相同节点上。
2.允许扩展搜索量/吞吐量,搜索可以在所有副本上并行执行。
注:每个索引都可以分成多个分片,索引也可以被复制0到多次,一旦被复制,每个索引都具有主分片和副本分片。
在创建索引时,可以为每个索引定义分配和副本的数量,创建索引后可以修改副本数量,但不要能修改分片的数量。
默认情况下,每个索引都分配5个主分片和1个副本分片,如果集群存在两个以上节点,则索引会有5个主分片与5个副本分片,每个索引总计有10个分片。
2.2 ElasticSearch的架构
-
ES分布式搜索引擎架构图
-
Gateway层
ES用来存储索引文件的文件系统,主要是用来对数据进行长持久化以及整个集群重启之后可以通过gateway重新恢复数据。
底层文件系统例如:本地磁盘、共享存储(做snapshot的时候需要用到)、hadoop的HDFS分布式存储、亚马逊的S3。 -
Lucene Directory层
Lucene的分布式框架,lucene是单价搜索引擎,为了满足ES分布式搜索引擎系统,需要做成一个分布式的运行框架来满足在每个节点上都运行Lucene进行相应的索引,查询以及更新。 -
ES四大模块组件层
- Index Module:索引模块,对数据建立索引(倒排索引等)。
- Search Module:搜索模块,对数据进行查询搜索。
- Mapping:数据映射与解析模块,数据中每个字段会根据建立的表结构通过mapping进行映射解析。若没有建立表结构则默认根据数据类型推测数据结构后自动生成mapping,再根据该mapping解析数据。
- River:第三方插件模块,可以通过自定义脚本将mysql等数据源通过格式化转换后同步到es集群中。
-
两大模块组件层
- Discovery模块:ES是一个集群包含很多节点,相互发现对方节点(服务发现),组成集群进行选主(Master选举)。默认Zen,也能是EC2。
- Script模块:ES支持多种脚本语言。(mvel、js、python、Etc.等)
-
Transport层
ES的通信接口Transport层,支持:Thrift、Memcached以及Http,默认为http,JMX是Java的一个远程监控管理框架,ES是通过Java实现的。 -
RESTful接口层
ES的访问接口,推荐Restful接口,直接发送http请求,方便后续使用nginx做代理、分发,包括可能会做权限的管理,http容易做这方面的管理。
使用Java客户端是直接调用API,在负载均衡与权限管理不太好做。
2.3 ElasticSearch数据结构
与Mysql对比理解
数据库 | 表 | 记录 | 列 | |
---|---|---|---|---|
MySQL | DB | Table | Row | Column |
ES | Index | Type | Document | Field |
Index(索引)
索引,是一堆document的集合,类似与mysql数据库中的database。
Type(类型)
类型,一个index只能有一个type,类似mysql的table表,es可以在Index中建立type(table),通过mapping进行映射
Document(文档)
文档,es中的最小数据单元,es存储的数据是文档型的(json格式),一条数据对应一篇文档即相当mysql中的一行数据,
一个文档中可以有多个字段(等同mysql一行有多列)。
Field
es中一个文档对应多个列(等同mysql多个列)
Mapping
es中mapping有动态识别功能(等同于mysql的schema)
indexed
建立索引,mysql中一般对经常使用的列增加相应的索引用于提高查询速度,es默认会加上索引,
除非你特殊指定不建立索引只是进行存储用于展示。
Query DSL
类似mysql的sql语句,只是es中使用的是json格式的查询语句。
GET/PUT/POST/DELETE
分别类似mysql的select/update/delete
2.4 CURL命令操作
在linux命令行中执行HTTP协议的请求
2.4.1 CURL命令
访问网页
curl