文章目录1 .什么是elk? 2.ELK能做什么? 简要介绍Elasticsearch? 4.Elasticsearch的主要特征5.ES相关概念6 .什么是分词器7? 什么是电子搜索倒排索引? 8.Elasticsearch是如何实现Master选举的? 9 .电子搜索如何避免脑裂? 10.Elasticsearch索引文档的过程11.Elasticsearch搜索过程概述如何?
前言:本文仅包含常见的ELK问题。 要查看其他java问题,请参阅JAVA | 2021中最完整的java问题和答案摘要
正文1 .什么是elk? ELK其实不是软件,而是一系列解决方案,是三个软件产品的首字母缩略词
Elasticsearch :负责搜索和保存日志
Logstash :负责日志的收集、分析和处理
Kibana :负责日志可视化
这三个软件是开源软件,通常一起使用,以Elastic.co公司的名义。
所以简称ELK。 添加Beats系列组件时,其官方名称为Elastic Stack
2.ELK能做什么? 在运输大量日志系统时,ELK组件可用于解决以下问题:
集中查询和管理分布式日志数据、系统监视、系统硬件和APP应用程序组件监视、
故障排除、安全信息和事件管理、报告功能等
简要介绍Elasticsearch? ElasticSearch是基于Lucene的搜索服务器。 提供分布式多用户功能
全文搜索引擎,基于rest风格的API的web界面。
Elasticsearch是用Java开发的,在Apache许可条款下作为开源发布,目前
受欢迎的企业搜索引擎。 专为云计算设计,可实时搜索、稳定、可靠、快速、安装
使用方便
4 .电子搜索的主要特点1 .实时分析
2 .分布实时文件存储,并对每个字段进行索引
3 .面向文档,所有对象都是文档
4 .高可用性、易扩展、支持群集、分片和复制(Shards和Replicas )
界面友好,支持JSON
5.ES相关概念node :安装了一个es服务器的节点。
集群:有由多个节点组成的集群
文档:可搜索的基础信息单元
索引:具有相似特征的文档的集合
Type可以为一个索引定义一个或多个类型
filed:es的最小单位,相当于有数据的列
Shards :已索引的拼贴。 每个瓷砖都是Shard
复制:复制索引
6 .分词是指将文本转换为一系列单词(Term or Token )的过程,也称为文本分析,在ES
其中有被称为Analysis
分词器是ES中专门处理分词的组件,英语为Analyzer,其组成如下。
character filters :对原始文本进行处理,如删除html标记
Tokenizer :按照一定的规则将原文本分成单词
token filters :对tokenizer处理的单词进行小写字母的转换、删除或添加等再加工
处理
ES提供了一个可以测试分词的API接口,便于验证分词的效果,endpoint为_analyze
ES也提供了很多内置分析器。
7 .电子搜索的倒排索引是什么? 正向索引以文档的ID为键,在表格中记录文档中每个单词的位置信息,并在搜索时扫描表格
中每个文档中单词的信息将一直显示,直到找到包含查询关键字的所有文档。
另一方面,倒排索引是通过分词策略形成词与文章的映射关系表的,这样的词典映射表
退出索引。
如果存在倒排索引,则可以进行o(1)时间复杂度的有效文章检索,检索效率大幅提高
比率。
因此,一般来说,正向索引是文档到关键字映射,已知的文档寻求关键字,反向索引是
关键字到文档的映射(根据已知关键字提示文档)。
8.Elasticsearch是如何实现Master选举的? Bully算法假设所有节点都有唯一的ID,并使用该ID对节点进行排序。
Elasticsearch的评选人由ZenDiscovery模块负责,主要包括Ping (
用于发现彼此)和Unicast (单播模块包含用于控制哪些节点需要ping的主机列表) )。
一部分;
根据nodeId词典对能够成为master的所有节点(node.master: true )进行排序,每次都进行选择
列出每个节点,按顺序排列自己知道的节点,然后选择第一个(第0个)节点。 首先那是
主节点。
如果对某个节点的票数达到一定值(
成为 master 节点数 n/2+1)并且该节点自己也选举自己,那这个节点就是 master。否则重新选举一直到满足上述条件。
补充:master 节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;
data 节点可以关闭 http 功能。
7.X 之后的 ES,采用一种新的选主算法,实际上是 Raft 的实现,但并非严格按照 Raft
论文实现,而是做了一些调整。Raft 是工程上使用较为广泛分布式共识协议,是多个节点
对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分区的情况下。 9.Elasticsearch 如何避免脑裂?
ES 集群中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一
个 master,怎么办?
当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量
(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解决脑裂问题;
当候选数量为两个时,只能修改为唯一的一个 master 候选,其他作为 data 节点,避免
脑裂问题。
在 Elasticsearch 7.0 里重新设计并重建了的集群协调子系统,移除
minimum_master_nodes 参数,转而由集群自主控制。
协调节点默认使用文档 ID 参与计算(也支持通过 routing),以便为路由提供合适的
分片。
shard = hash(document_id) % (num_of_primary_shards)
当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 Memory Buffer,然
后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 Momery Buffer 到 Filesystem
Cache 的过程就叫做 refresh;
当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失,ES
是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写
入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程
叫做 flush; 在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync 将创建一
个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog。
flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认为 512M)
时;
搜索拆解为“query then fetch” 两个阶段。
query 阶段的目的:定位到位置,但不取。
步骤拆解如下:
1)假设一个索引数据有 5 主+1 副本 共 10 分片,一次请求会命中(主或者副本分片中)
的一个。
2)每个分片在本地进行查询,结果返回到本地有序的优先队列中。
3)第 2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。
fetch 阶段的目的:取数据。
路由节点获取所有文档,返回给客户端。