ELK
E 代表 ElasticSearch,L代表 LogStash,K 代表 Kibana
什么是Elasticsearch
由 Java语言开发基于 Lucene 的 Restful 的分布式实时全文搜索引擎,也可以称作是一种非关系型文档数据库
应用场景:搜索和数据分析
基本概念
近实时(NRT)
从写入数据到数据可以被搜索到有一个小延迟
倒排索引
用于快速查找文档中的词语。它将每个词映射到包含该词的文档列表,以加速搜索。它的优点包括高效的全文搜索、支持复杂的查询和高性能。
mapping
mapping有点类似与RDB中“表结构”的概念,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性
doc_values
在构建倒排索引的同时,构建了正排索引,从而实现根据指定字段进行排序和聚合的功能
text 和 keyword类型的区别
keyword 类型是不会分词的,直接根据字符串内容建立倒排索引,所以可以通过精确值搜索到
Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立倒排索引
query 和 filter 的区别
query:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;
filter:查询操作仅判断是否满足查询条件,不会计算任何分值,也不会关心返回的排序问题,同时,filter 查询的结果可以被缓存,提高性能。
节点角色
主节点:负责集群本身的管理;比如创建索引;投票节点:只参与主从选举
候选主节点:可以被选举为主节点的节点
协调节点:协调请求的处理过程,一个请求发送到该协调节点会确定数据节点,数据节点执行查询,协调节点将结果集返回
数据节点
master 节点选举
使用一种称为 “Zen Discovery” 的分布式一致性算法来管理集群状态和实现 master 节点选举;过程如下:
脑裂
当主节点无法工作时,会从备选节点选出一个作为新的主节点。由于网络抖动等原因,主节点未及时响应,集群认为主节点挂了,选举出一个新的主节点,导致出现两个主节点,其他节点不知道听谁调度。
深度分页
深度分页其实就是搜索的深浅度。搜索得太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,他不支持超过一万条数据以上的分页查询。
写入数据流程
1. 文档写入es 的 buffer,同时记录 translog 到 page cache,默认 5 秒刷新到磁盘
2. 文档 buffer 定时刷新到 page cache,默认 1 秒执行一次
包含多个段,每个段包含多个文档
文档写入这里才能被搜索到
每个段都消耗 cpu,内存,文件句柄
3. 刷新磁盘,同时记录一个 commit point
索引和分片
索引有多个分片,每个分片有主从结构
索引机制
倒排索引
写入文档时,根据文档每个字段,使用分词器,将字段值分割为 term;
es 会统计每个 term 频率,构建 term 到文档 id,出现频率,偏移位置的映射(posting list)
FST
类似前缀树,它将前缀和后缀一并压缩
如何保证高可用
核心是分片,通过主从分片,即使主分片崩溃,也基本可用
写入数据时,额外写了 translog,类似 mysql redolog,即使 es 崩溃,也可以恢复数据
高可用方案
限流:
消息队列消峰:监听 mysql binlog,生成消息到 kafka
保护协调节点:防止遇到大请求情况崩溃,解决办法是设置专门的协调节点
双集群:可以采用消息队列双写 es,查询时判断集群 a 是否有问题,出现问题切换到集群 b
如何优化性能
数据一致性(并发冲突)
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。