elasticsearch支持的数据类型,elasticsearch集群原理
从功能上来说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群和集群附属功能如restful借口、集群性能检测功能等。数据功能主要是索引和搜索。代码中的这些功能并不是完全独立的,而是由重叠的部分组成的。当然,分布式功能是为数据功能服务的,数据功能很难完全独立于分布式功能。
其源代码具有以下特点:
模块化:
每个功能都以模块化的方式实现,最后以借口对外公开,最后由guice(google轻量级DI框架)管理。整个系统有30多个模块(版本1.5)。
接口去耦:
es代码中使用了大量的接口来解耦代码。乍一看,很难找到相关函数的实现,但正是这些接口使得代码非常优雅。
异步通信:
作为一个高效的分布式系统,专家系统中有许多异步通信的实现。从集群通信到搜索功能,采用异步通信框架netty作为节点间的通信框架。
这些特征将在下面的代码分析中得到反映。总结以es的启动过程结束。es的启动类是Bootstrap,启动脚本考察这个类的main方法来启动node。其类图如下:
上图只显示了它的字段,其中node是要启动的节点。KeepAliveThread线程保证在节点运行过程中Bootstrap始终存在,并能接收shutdown命令优雅关闭。下面是启动前的属性设置,代码如下:
私有设置(boolean addshutdownbook,tuple settings,environment tuple)引发异常{if (tuple.v1()。getas boolean( bootstrap . mlock all ,false)){//尝试锁定内存natives . trymlockall();} tuple=setup JMX(tuple);node builder node builder=node builder . node builder()。设置(tuple.v1())。loadConfigSettings(false);node=node builder . build();//初始化节点if(addShutdownHook){///Add hook runtime . get runtime()。addshutdownbook(new thread(){ @ override public void run(){ node . close());} });}}尽量锁定周围的内存是为了保证节点的内存在运行过程中不发生变化,防止内存引起的性能波动。这里调用C方法。最后,看看主要的方法:
公共静态void main(String[] args) {.string stage="初始化";//标明启动阶段用于构造错误信息试试{如果(!前台){伐木工。disableconsolelogging();系统。出去。close();} bootstrap.setup(true,tuple);stage=" Startup自举。start();//引导程序的启动过程也就是结节的启动过程如果(!前台){系统。呃。close();}//构造一个线程,保证引导程序不退出,仍然可以接收命令keepAliveLatch=new CountDownLatch(1);//让这个线程保持活动状态(非守护线程),直到我们关闭/Runtime.getRuntime().addShutdownHook(new Thread(){ @ Override public void run(){ keepalivelatch。倒计时();} });keepAliveThread=new Thread(new Runnable(){ @ Override public void run(){ try { keepalive latch。await();} catch(中断异常e){//bail out } } }, elasticsearch[keepAlive/版本。当前]);keepalivethread。设置守护进程(false);keepalivethread。start();} catch(Throwable e){ ESLogger logger=loggers。获取记录器(引导程序。类);if (bootstrap.node!=null){ logger=loggers。获取记录器(引导程序。class,bootstrap.node.settings().get( name ));}字符串错误消息=buildErrorMessage(stage,e);如果(前台){系统。呃。println(错误消息);系统。呃。flush();} else { logger。错误(错误消息);}伐木工。disableconsolelogging();如果(记录器。是debugenabled()){ logger。debug( Exception ,e);}系统。出口(3);}main函数有省略,这里开始函数调用结节的开始函数,节点的开始函数中将各个模块加载启动,从而启动整个系统。这一过程将在接下来进行分析节点。启动后会注入钩子,同时启动keepAliveThread,至此整个结节就启动起来。
以上就是弹性搜索分布式及数据功能源码分析的详细内容,更多关于弹性搜索分布式及数据功能的资料请关注盛行信息技术其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。