【Elasticsearch源码】节点的启动和关闭流程分析 1 Node的启动流程节点的启动整体流程如下所示:2 启动过程分析启动入口: 通过启动脚本bin/elasticsearch启动ES,在distribution模块中的/src/bin目录下面,脚本先载入了jvm配置文件jvm.options。最后启动org.elasticsearch.bootstrap.Elasticsearch这个主类中的main方法。 exec \ #执...
【Elasticsearch源码】CCR源码分析(二) 接上一篇:【Elasticsearch源码】CCR源码分析(一)。sendShardChangesRequest方法最终进入到ShardChangesAction.TransportAction#shardOperation,跟据上面的read request,从Translog中获取该shard的seq_no范围内的所有Operation,返回最新的shard需要的Operation。 ...
【Elasticsearch源码】CCR源码分析(一) 1 CCR的基本概念什么是CCR?CCR( cross-cluster replication):跨集群复制是ES 6.5发布的一个新的特性:可以将两个集群中的数据进行远程复制。集群复制类似于数据订阅的方式,一个集群的数据可以被多个集群订阅,也就是可以被复制到多个集群上面去。CCR 有两个角色,一个是 Leader,表示数据的源头,另外一个Follower,表示数据的订阅方,得到的是数...
【Netty简单入门】-为什么Netty人见人爱? 前言最近在看ES源码,Netty贯穿在整个ES之中,想要看懂和更好的理解ES源码,必须首先对Netty有一定的认识和了解,所以简单总结了Netty的一些基本架构和认知, 后续再总结更加深入的Netty知识。什么是Netty,为什么使用NettyNetty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持。作为一个异步NIO框架,Netty的所有IO操作都是异步...
【Elasticsearch源码】-7.x源码编译 要学习源码之前,肯定要进行Elasticsearch源码的编译:前期准备首先要下载源码:https://github.com/elastic/elasticsearch/releases,以最新的7.1版本为例,下载源码包:安装JDK和Gradle:JDK需要jdk12以上,Gradle5.2.1,我安装了JDK12和Gradle 5.2.1:JDK和Gradle安装方法自行百度...
【Elasticsearch源码】查询源码分析(二) 接上一篇:【Elasticsearch源码】查询源码分析(一)。上篇讲到请求通过遍历每个shard发送请求,执行executePhaseOnShard方法,转发请求的同时定义了一个Listener,用于监听处理结果。 private void performPhaseOnShard(final int shardIndex, final SearchShardIterator sha...
【Elasticsearch源码】查询源码分析(一) 1 前言前言分析过ES的写入流程源码,详情见【Elasticsearch源码】写入源码分析。Elasticsearch(ES)的查询接口具有分布式的数据检索、聚合分析能力,数据检索能力用于支持全文检索、日志分析等场景,如Github平台上的代码搜索、基于ES的各类日志分析服务等;聚合分析能力用于支持指标分析、APM等场景,如监控场景、应用的日活/留存分析等。本文基于6.7.1版本,主要分...
【Elasticsearch源码】写入源码分析(四) 接上一篇:【Elasticsearch源码】写入源码分析(三)。前面讲到了一个checkpoint(检查点的概念),在每次写入数据过程都需要更新LocalCheckpoint(本地检查点)和GlobalCheckpoint(全局检查点)。3.3 更新checkpoint了解checkpoint之前,先来看下Primary Terms和Sequence Numbers:Primary...
【Java集合】LinkedList源码解析 LinkedList简介LinkedList是基于双向循环链表实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。当然同时也具备了链表的特性:插入和删除元素效率高。LinkedList同样也是非线程安全的,只在单线程下适合使用。同时实现了Serializable接口,因此支持序列化,能够通过序列化传输;实现了Cloneable接口,能被克隆。源码分析核心实现就是通过...
【Java集合】ArrayList源码解析 ArrayList简介ArrayList实现了AbstractList类和List接口,是基于数组实现的,是一个动态数组,其大小可以自动增长。所以它具备了数组的优势,可以通过元素索引快速查询,且是有序存储。ArrayList不是线程安全的,多线程下可以考虑使用concurrent包下面的CopyOnWriteArrayList类。同时实现了Serializable接口,因此支持序列化,能够通...
【Elasticsearch源码】写入源码分析(三) 接上一篇:【Elasticsearch源码】写入源码分析(二)。3.2.5 写主分片节点流程代码入口:TransportReplicationAction.PrimaryOperationTransportHandler#messageReceived,然后进入AsyncPrimaryAction#doRun方法。检查请求: 1.当前是否为主分片;2.allocationId是否是预期值;...
【Elasticsearch源码】写入源码分析(二) 接上一篇:【Elasticsearch源码】写入源码分析(一)如果需要自动创建索引,则需要遍历bulk的所有index,然后检查index是否需要自动创建,对于不存在的index,则会加入到自动创建的集合中,然后会调用createIndex方法创建index。index的创建由master来把控,master会根据分片分配和均衡的算法来决定在哪些data node上创建index对应的shard...
【Elasticsearch源码】写入源码分析(一) 1 前言Elasticsearch(ES)是一个基于Lucene的分布式存储和搜索分析系统,本文希望从源码的角度分析ES在保证数据的可靠性、实时性和一致性前提下,其写入的具体流程。写入也是整个ES系统里面,最主要的流程之一,便于更好的理解ES的内部原理和逻辑,关于ES数据存储结构请参考:【Elasticsearch】原理-Elasticsearch数据存储结构与写入流程。2 写入基本流程...
【Java集合源码分析】关于Java集合你需要知道的是什么 前言Java集合估计是我们开发过程中,用的最多的API了,它位于java.util包下,同时支持多线程的集合类位于java.util.concurrent包下。我们都知道各种数据结构最底层的组成都是数组或者链表,其实各种集合类也是基于最基本的数据结构进行封装,便于各种场景直接使用。我们可以把集合想象成一个容器,它可以存储各种对象,扩展和封装了数组和链表。有了这些认识,是不是集合也变了...
【Java小知识】switch支持String类型的背后原理? 前言大家都知道,从JDK 1.7开始,switch表达式开始支持String字符串,那么它是怎么实现的呢?今天来一探究竟分析首先写一个小demo,如下所示,一个简单的switc语句:public class test { public static void main(String[] args) { test("a"); } publi...
【Elasticsearch】优秀实践-ES+Hbase的实现 前言因为之前在项目上,需要用到ES+Hbase方案,最后经过各种测试和验证,最终项目完成上线。因为在实际的过程遇到不少的问题,和理论还是有一定的差距。纸上得来终觉浅,绝知此事要躬行。----古人诚不欺我基本原理很简单,将Elasticsearch的DOC ID和Hbase的rowkey相关联:将源数据根据业务特点划分为索引数据和原始数据:索引数据:指需要被检索的字段,存储在El...
【Elasticsearch】源码-Elasticsearch源码基础模块 ES源码的主要基础模块:ClusterCluster模块主要是主节点执行集群管理的封装实现,管理集群状态,维护集群层面的配置信息等。主要有:管理集群状态,将新生成的集群状态发布到集群的所有节点调用allocation模块执行分片分配,决策那些分片应该分配到哪个节点在集群各节点中直接迁移分片,保持数据平衡Allocation封装了分片分配相关的功能和策略,包括主分片的分配和副本...
【Elasticsearch】原理-Elasticsearch数据存储结构与写入流程 1 前言由于Elasticsearch使用Lucene来处理shard级别的索引和查询,因此数据目录中的文件由Elasticsearch和Lucene编写。Lucene负责编写和维护Lucene索引文件,而Elasticsearch在Lucene之上编写与功能相关的元数据,例如字段映射,索引设置和其他集群元数据,用户和支持功能由Elasticsearch提供。2 ES数据2.1 Nod...
【Elasticsearch】优秀实践-Elasticsearch查询调优 前言一个系统查询慢往往是由多种因素造成的,在处理集群查询慢的问题上,先将问题分解。1) 需要观察是系统哪种资源受限,例如内存、CPU或磁盘IO等,是否存在硬件瓶颈;2) 要确定查询语句是否符合业务场景,是否存在查询语句优化空间;3) 最后判断数据结构是否合理,不合理的数据设计对查询的响应影响很大。使用更快的硬件查询性能大部分场景下更多的在于IO能力,很多时候查询速度受限于磁...