elasticsearch之初识

377 阅读3分钟

elsaticsearch是什么

elsaticsearch是一个全文搜索引擎,支持非实时的结构化搜索,底层是基于lucene,可以理解elasticsearch是基于lucene做了一些封装,lucene提供单机服务,elasticsearch提供分布式的服务。

elsaticsearch里面组件概念

1. node节点

一个es的进程可以理解为一个node,一般一个es集群由很多node组成。节点角色分为好几种:

  • datanode数据节点,数据存放数据的处理各种增删改查操作的节点对机器配置要求较高

  • clientnode协调请求节点,就是路由请求到datanode,然后汇聚结果

  • ingestnode预处理节点,对请求进行预先的处理,比如需要对bulk做字段映射之类的

  • masternode选主节点,主要是元数据的管理,对机器配置要求低

  • machinelearningnode机器学习节点

2. indice索引

一类文档数据的集合,简单理解就是数据库里面的一张表,里面包含很多文档数据

3. type

一个索引可以有多个type,这个目前6.0以后就不建议使用了,7.0以后就废弃了

4. shard

一个索引底层数据的存储分散再几个shard分片上的(索引创建时候可以指定shard),具体数据落在哪个shard上就是通过id的hash路由的

5. segment

一个shard由n多个segment组成,每个segment都是包含一小部分数据的文件集合(里面包含倒排,docvalue,bkd tree等)

6. document

文档,可以理解为数据库表中的一条数据,一个索引里面含有很多doc

7. field

一个文档有好几个字段,可以理解数数据库表的表字段

image.png

elsaticsearch检索快的原因

elasticsearch主要是基于倒排,正排,bkd树等数据结构来加速查询,下面简单介绍下,后面文章系列会做一个详细的介绍

1. 倒排

就是一种字段值到文档id的映射,比如我要查一个name,通过name很快能定位到包含name的文档列表 image.png

2. 正排

就是一种文档id到字段值得映射,比如我通过name字段做排序,那会遍历文档id,然后通过文档id拿到对应的name值,然后进行比较排序

image.png

elsaticsearch里面容易混淆的一些术语

1. refresh和flush

refresh:每个索引都会有个refresh时间,默认是1s,意思是每隔1秒后,会生成一个segment,然后数据就可以被查询到了,注意此时refresh生成segmen相关文件未落盘只是在系统缓存中,具体是否落盘是由内核决定的

flush:每隔一定时间或者translog文档数到一定数量,会触发flush,注意:flush会强制还未落盘的segment强制落盘

2. tanslog

translog就是数据操作记录,主要是用来防止数据丢失的,比如断电等场景,这个一般是默认试试刷盘的,如果允许断电这种数据有小部分丢失,可以改成异步刷盘,提升数据的写入效率

集群常用配置elasticsearch.yml

1. 节点角色指定,默认是所有角色

node.master: false,node.data: true是数据节点角色,node.master: true,node.data: false是master角色,node.master: false,node.data: false是client角色

2. 禁止swap

bootstrap.memory_lock: true,当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,所以应该保证它不会写入交换空间

3. Circuit Breaker

indices.breaker.total.limit,基础的熔断器,所有后续的熔断器都要以这个为前提,默认是70%jvm

indices.breaker.fielddata.limit,fileddata熔断器,比如要在text字段上作聚合排序之类的,需要ba

indices.breaker.request.limit

network.breaker.inflight_requests.limit

script.max_compilations_rate

后话

后续会有一些列的es文章,有实战的,有最佳实践的,有原理分析的,还希望大家多多关注