低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

浅析 ElasticSearch 原理

2019 年 11 月 28 日

浅析ElasticSearch原理

最近女主在项目中使用到 ElasticSearch 来做索引。但是对 ElasticSearch 的一些原理还是比较模糊,所以就梳理了一下 ElasticSearch 的基本原理,分享给大家。


我们首先从 ElasticSearch 的启动过程开始,逐步了解其工作原理。


启动过程


获取集群 node 列表


在 UnicastZenPing 构造函数中,向 discovery.zen.ping.unicast.hosts 配置的节点列表发送请求,获取到 DiscoveryNode 列表。


选主流程


通过 UnicastZenPing 发送 ping,从 response 信息中找到 master,如果没有 master,进入选主流程。


启动任务


选为 master 节点后,会启动计划任务。


集群管理


集群启动后可以根据 API 接口进行管理监控。


新节点加入流程

当 ElasticSearch 的节点启动后,它会利用多播(multicast)或者单播(如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示:



New ElasticSearch Node (新节点)


新节点加入后,会通过多播 Multicast request(发出请求),寻找集群其他节点并和集群建立连接。


需要注意的是,从用户的角度来看,主节点在 ElasticSearch 中并没有占据着重要的地位,这与其它的系统(比如数据库系统)是不同的。实际上用户并不需要知道哪个节点是主节点;所有的操作需求可以分发到任意的节点,ElasticSearch 内部会完成这些让用户感到不明觉历的工作。在必要的情况下,任何节点都可以并发地把查询子句分发到其它的节点,然后合并各个节点返回的查询结果。最后返回给用户一个完整的数据集。所有的这些工作都不需要经过主节点转发(节点之间通过 P2P 的方式通信)。


探测失效节点

在正常工作时,主节点会监控所有的节点,查看各个节点是否工作正常。如果在指定的时间里面,节点无法访问,该节点就被视为出故障了,接下来错误处理程序就会启动。集群需要重新均衡——由于该节点出现故障,分配到该节点的索引分片丢失。其它节点上相应的分片就会把工作接管过来。换句话说,对于每个丢失的主分片,新的主分片将从剩余的分片副本(Replica)中选举出来。 以 3 个 Node 为例:



说明:Node1 是 master 节点,P 为 primary 主分片的缩写,R 为 replica 副本分片。


当 Node1 挂掉的时候,如下:



由于一个集群必须要有一个主节点才能使其功能正常,所以集群做的第一件事就是各节点选举了一个新的主节点:Node 2。


主分片 1 和 2 在我们杀掉 Node 1 时已经丢失,我们的索引在丢失主分片时不能正常工作。如果此时我们检查集群健康,我们将看到状态 red:不是所有主节点都可用!


幸运的是丢失的两个主分片的完整拷贝存在于其他节点上,所以新主节点做的第一件事是把这些在 Node 2 和 Node 3 上的复制分片升级为主分片,这时集群健康回到 yellow 状态。这个提升是瞬间完成的。


集群管理和监控

通过管理和监控部分的 API,用户可以更改集群的设置。比如调整节点发现机制(discovery mechanism) 或者更改索引的分片策略。用户可以查看集群状态信息,或者每个节点和索引和统计信息。


如:获取集群健康信息 GET /cluster/health 获取集群配置信息 GET /cluster/settings 下图为 chrome head 插件的集群展示结果:


可以看到集群有多少个节点,集群健康值等。


##ElasticSearch 读写原理


写操作原理


Coordinating Node


协调节点默认使用文档 ID 参与计算(也支持通过 routing),以便为路由提供合适的分片。


shard = hash(document_id) % (num_of_primary_shards)
复制代码


Shard


当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 Memory Buffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 Momery Buffer 到 Filesystem Cache 的过程就叫做 refresh。


Memory Buffer | Filesystem Cache


当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程叫做 flush。


Transaction Log


在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync 将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog。


flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认为 512M)时。


读操作原理


搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch;


Coordinating Node


在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。PS:在搜索的时候是会查询 Filesystem Cache 的,但是有部分数据还在 Memory Buffer,所以搜索是近实时的。


Shard


每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。


Coordinating Node


接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。


补充:Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确,但是性能会变差。


总结

以上主要介绍了 ES 的工作原理,ES 的魅力远不止如此,同时 ES 的开源特性也使得它社区活跃,版本迭代更新迅速,目前已经更新到 6.x 版本,如有兴趣可到 ES 官网了解最新的特性。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/wjMqSbfzkmin5awHthi_5A


2019 年 11 月 28 日 14:50487

评论

发布
暂无评论
发现更多内容

ipfs怎么挖矿?ipfs挖矿真实靠谱吗?ipfs的落地应用有哪些?

v:IPFS456

区块链 IPFS Filecoin fil

不为人知的网络编程(十二):彻底搞懂TCP协议层的KeepAlive保活机制

JackJiang

TCP 即时通讯 IM

计算机原理学习笔记 Day10

穿过生命散发芬芳

计算机原理 4月日更

Oracle用日志:记录几个Oracle使用中容易出错的问题和解决方法

攻城狮Chova

oracle 编码 Oracle函数 4月日更

面试官关于线程池的这个问题把我问懵逼了。

why技术

面试 Jav 1 周年盛典

泰山版震撼来袭!阿里巴巴Java面试参考权威指南四月版开源

Java架构追梦

Java 阿里巴巴 架构 面试 面试参考指南

色字头上一把刀:某站点色诱套路分析

Machine Gun

网络安全 WEB安全 诈骗

华为云AI论文精读会2021第一期:高效语义分割模型Fast-SCNN分享

华为云开发者社区

AI 华为云

2021安擎昇腾AI服务器产品发布会在京成功举行

DT极客

手把手教大家实现一个电子签名

麦洛

Java canvas

架构实战营模块1作业指导

华仔

#架构实战营

Ubuntu 20.04 快捷键整理

TroyLiu

Linux ubuntu 效率 操作系统 快捷键

架构思维

无心

架构

那些打不垮你的,终究使你更强大

小天同学

读书 励志 个人感悟 4月日更

Adobe国际认证,Photoshop软件向多图层图像中添加更多图像,官方教程

Adobe国际认证

Adobe国际认证 Photoshop软件

如何提高Linux水平

cdhqyj

最新分享:如何避免线程安全的坑?看这一篇就够了

学Java关注我

Java 编程 程序员 架构 计算机

Flink中的状态编程

大数据技术指南

flink 4月日更

这个GItHub上的Java项目开源了 2021最全的Java架构面试复习指南

比伯

Java 编程 架构 面试 程序人生

回顾过去,展望未来,我在 InfoQ 写作平台的一周年!

JackTian

程序员 个人总结 4月日更 1 周年盛典 InfoQ 写作平台 1 周年

企业如何做数字化转型?想要资产状况及时把控,它的作用至关重要!

一只数据鲸鱼

数据挖掘 数字化 数据可视化 资产管理

量化策略交易系统开发app,量化马丁策略交易平台搭建

WX13823153201

量化策略交易系统开发

趣题与算法(1)

架构与源码

知乎万赞回答:程序员面试为什么被要求造航母,而工作拧螺丝?

Java架构师迁哥

查看视图

在即

四月日更

CTO 说要接入实时音视频 SDK,我到底该批多少预算?

融云 RongCloud

智慧党建系统开发解决方案,干部管理任免综合平台建设

WX13823153201

智慧党建系统开发解决方案

专访阿里巴巴研究员吴翰清:白帽子的网络安全世界观

五分钟学大数据

网络安全 采访

Flink的基石

五分钟学大数据

flink 4月日更

GitHub面试题库+阿里巴巴2021年Java岗面试26大核心专题,成功助我砍下7家大厂Offer

Java架构追梦

Java 阿里巴巴 架构 面试 面试题总结

Linux free 命令

一个大红包

linux命令 4月日更

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

浅析ElasticSearch原理-InfoQ