elasticsearch分布式及数据的功能源码分析-mile米乐体育

从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主要是索引和搜索。代码上这些功能并不是完全独立,而是由相互交叉部分。当然分布式功能是为数据功能服务,数据功能肯定也难以完全独立于分布式功能。

它的源码有以下几个特点:

模块化:

每个功能都以模块化的方式实现,最后以一个借口向外暴露,最终通过guice(google轻量级di框架)进行管理。整个系统有30多个模块(version1.5)。

接口解耦:

es代码中使用了大量的接口进行代码解耦,刚开始看的感觉是非常难以找到相关功能的实现,但是也正是这些接口使得代码实现的非常优雅。

异步通信:

作为一个高效的分布式系统,es中异步通信实现非常之多,从集群通信到搜索功能,使用了异步通信框架netty作为节点间的通信框架。

以上的这些特点在后面的代码分析中会一一体现。概述的结尾以es的启动过程来结束,es的启动类是bootstrap,启动脚本调研这个类的main方法开始启动node。它的类图如下所示:

上图仅仅显示了它的field,其中node是要启动的节点。keepalivethread线程保证节点运行期间bootstrap会一直存在,可以接收关机命令进行从而优雅关闭。下面是启动前的属性设置,代码如下:

private void setup(boolean addshutdownhook, tuple tuple) throws exception { if (tuple.v1().getasboolean("bootstrap.mlockall", false)) {//尝试锁定内存 natives.trymlockall(); } tuple = setupjmx(tuple); nodebuilder nodebuilder = nodebuilder.nodebuilder().settings(tuple.v1()).loadconfigsettings(false); node = nodebuilder.build();//初始化node if (addshutdownhook) {//添加关闭node的hook runtime.getruntime().addshutdownhook(new thread() { @override public void run() { node.close(); } }); } }

尝试锁定内存左右是保证节点运行期间的内存不变动,以防因为内存变得带来性能上的波动,这里调用的是c方法。最后来看一下main方法:

public static void main(string[] args) { .... string stage = "initialization";//标明启动阶段用于构造错误信息。 try { if (!foreground) { loggers.disableconsolelogging(); system.out.close(); } bootstrap.setup(true, tuple); stage = "startup"; bootstrap.start();//bootstrap的启动过程也就是node的启动过程 if (!foreground) { system.err.close(); } //构造一个线程,保证bootstrap不退出,仍然可以接收命令。 keepalivelatch = new countdownlatch(1); // keep 恰卡编程网this thread alive (non daemon thread) until we shutdown/ runtime.getruntime().addshutdownhook(new thread() { @override public void run() { keepalivelatch.countdown(); } }); keepalivethread = new thread(new runnable() { @override public void run() { try { keepalivelatch.await(); } catch (interruptedexception e) { // bail out } } }, "elasticsearch[keepalive/" version.current "]"); keepalivethread.setdaemon(false); keepalivethread.start(); } catch (throwable e) { eslogger logger = loggers.getlogger(bootstrap.class); if (bootstrap.node != null) { http://www.cppcns.com logger = loggers.getlogger(bootstrap.class, bootstrap.node.settings().get("name")); } string errormessage = builderrormessage(stage, e); if (foreground) { system.err.println(errormessage); system.err.flush(); } else { logger.error(errormessage); } loggers.disableconsolelogging(); if (logger.isdebugenabled()) { logger.debug("exception", e); } system.exit(3); }

main函数有省略,这里start函数调用node的start函数,node的start函数中将各个模块加载启动,从而启动整个系统。这一过程将在接下来进行分析。node启动后会注入hook,同时启动keepalivethread,至此整个node就启动起来。

以上就是elasticsearch分布式及数据功能源码分析的详细内容,更多关于elasticsearch分布式及数据功能的资料请关注mile米乐体育其它相关文章!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图