ES介绍
1. ES功能特点
1.1. ES是什么
特点: 非关系型、搜索引擎、近实时搜索与分析、高可用、天然分布式、横向可扩展
- ES是一个分布式、可扩展、实时的搜索与数据分析引擎
- ES不仅仅只是全文搜索,还支持结构化搜索、数据分析、复杂的语言处理、地理位置和对象间关联关系等
- ES的底层依赖Lucene,Lucene可以说是当下最先进、高性能、全功能的搜索引擎库
为什么不直接使用Lucene?
- 但是Lucene仅仅只是一个库,你需要使用Java并将Lucene直接集成到应用程序中
- 您可能需要获得信息检索学位才能了解其工作原理,因为Lucene非常复杂
- ES也是使用Java编写的,它的内部使用Lucene做索引与搜索
- 它的目的是隐藏Lucene的复杂性,取而代之的提供一套简单一致的RESTful API
1.2. ES主要功能
- 分布式实时文件存储,处理的结构化和非结构数据
- 实时分析的分布式搜索引擎,为用户提供关键字查询的全文检索功能
- 是实现企业级PB级海量数据处理分析的大数据解决方案(ELK)
ES主要致力于结构化和非结构化数据的分布式实时全文搜索及分析,使用场景
- 日志管理与分析(ELK)
- 系统指标分析
- 安全分析
- 企业搜索(OA、CRM、ERP)
- 网站搜索(电商、招聘、门户)
- 应用搜索
- 应用性能管理APM
2. ES主要特点
2.1. 分片与集群
- ES默认把数据分成多个片,多个片可以组成一个完整的数据,这些片可以分布在集群中的各个机器节点中
- 随着后期数据的越来越大,ES集群可以增加多个分片,把多个分片分散到更多的主机节点上
- ES集群可以增加多个分片,把多个分片分散到更多的机器主机节点上,负责负载均衡,横向扩展
- 而每个查询任务提交到某一个节点,该节点必须负责将数据进行整理汇聚,再返回给客户端
2.2. 自动索引
- ES所有数据默认都是索引的
- ES只有不加索引才需要额外处理
2.3. 搜索是近实时的
- 你往 es 里写的数据,实际上都写到磁盘文件里去了
- 查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。
- es 的搜索引擎严重依赖于底层的 filesystem cache,你如果给 filesystem cache 更多的内存
- 尽量让内存可以容纳所有的
idx segment file
索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。
.png)
- 性能差距究竟可以有多大?我们之前很多的测试和压测:
- 如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的,1秒、5秒、10秒。
- 但如果是走 filesystem cache,是走纯内存的,那么一般来说性能比走磁盘要高一个数量级,基本上就是毫秒级的,从几毫秒到几百毫秒不等。
2.4. ES优缺点

3. ES核心概念
mysql | elasticsearch |
---|---|
数据库(Datebase) | 索引(Index) |
表(Table) | 类型(Type) |
行(Row)每一条 | 文档(Document)每一条 |
字段 | 属性 |
对象(Schema) | 映射(Mapping) |
索引(Index) | 万物皆索引(不管什么数据都默认索引) |
SQL语言(Select、update) | Query DSL(GET、PUT) |
3.1. 索引(index)库
- ES将他的数据存储在一个或多个索引中,可以向索引读写文档
- 索引相当于关系型数据库中的一个数据库
3.2. 类型(type)表
- 类型(type)是用来规定文档的各个字段内容的数据类型和其他的一些约束
- 一个索引(index)可以有多个文档类型(type)
文档类型(type)相当于关系型数据库中的表
3.3. 文档(document)行
- 在ES中,文档(document)是存储数据库的载体,包含一个或多个字段
- ES中的最小的,整体的数据单位
- 文档(document)相当于关系型数据库中的一行数据
- 一个document里面有多个field,每个field就是一个数据字段
3.4. Lucene Index
- 注意和ES Index区别,Lucene Index是由若干段和提交点文件组成
3.5. 段(Segment)
- Luncene里面的一个数据集概念,因为ES底层是基于Lucene
- 最核心的概念就是Segment,每个段本身就是一个倒排索引
3.6. 提交点(commit point)
- 有一个列表存放着所有已知的所有段
3.7. 映射
- 映射是定义ES对索引中字段的存储类型,分词方式和是否存储等信息
- 就像数据库中的Schema,描述了文档可能具有的字段或属性,每个字段的数据类型
- Es对字段类型可以不指定,然后动态对字段类型猜测
- 也可以在创建索引时具体指定字段的类型(关系型数据库才需要手动指定)
3.8. Shard 分片
- 单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储
- 有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能
- 每个shard都是一个lucene index
3.9. Replica 副本
- 任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本
- replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能
- primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个)
- 默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器
3.10. Cluster集群
- 包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的
- 对于中小型应用来说,刚开始一个集群就一个节点很正常
3.11. Node节点
- 集群的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候)
- 默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群
- 当然一个节点也可以组成一个elasticsearch集群
4. ES使用
4.1. 分片的设定
- 分片数过小,数据写入形成瓶颈,无法水平拓展
- 分片数过多,每个分片都是一个lucene的索引,分片过多将会占用过多资源
- 如何计算分片数
- 分片数量最好设置为节点数的整数倍,保证每一个主机的负载是差不多一样的
- 否则可能遇到其他主机负载正常,就某个主机负载特别高的情况
- 一般我们根据每天的数据量来计算分片,保持每个分片的大小在 50G 以下比较合理
- 如果还不能满足要求,那么可能需要在索引层面通过拆分更多的索引或者通过别名 + 按小时 创建索引
4.2. ES数据近实时问题
- ES数据写入之后,要经过一个refresh操作之后,才能够创建索引,进行查询
- 但是get查询很特殊,数据实时可查
- get查询的实时性,通过每次get查询的时候
- 如果发现该id还在内存中没有创建索引,那么首先会触发refresh操作,来让id可查
- ES5.0之前translog可以提供实时的CRUD
- get查询会首先检查translog中有没有最新的修改,然后再尝试去segment中对id进行查找
- 5.0之后,为了减少translog设计的复杂性以便于再其他更重要的方面对translog进行优化
- 所以取消了translog的实时查询功能