最新要闻
- 天天滚动:手机App秒测血氧 能替代血氧仪吗?专家科普
- 世界微动态丨雅阁、CR-V均中招!本田中国召回近20万辆混动车 润滑油不够
- 过去一年都听过什么歌?网易云音乐2022年度听歌报告正式上线
- 环球关注:汉仪字库定制打造!钉钉进步体来了:永久免费商用
- 【全球快播报】NASA分享火星冬天航拍照片:色彩斑斓、唯美壮阔
- 关注:李子柒与微念达成和解 断更500多天的“她”何时回归?
- 焦点日报:Epic免费送《死亡搁浅》导剪版变标准版后续:官方删除道歉微博
- 环球关注:你在干啥?2022年中国人每天用手机时长创新高:都在狂刷视频、玩游戏等
- 百事通!Redmi K60把国产2K OLED屏从不可能变成现实:这过程很痛苦很艰辛
- 全球观点:苹果市值一夜蒸发约4431亿元 曝其有意砍价iPhone供应链 确保自己利润
- 热点聚焦:笔记本SSD普及率今年已达92%:机械硬盘凉凉了
- PC硬件机能榨干的日子一去不返!显卡危机不会再有了
- 【环球报资讯】机箱接口套路多 这些小知识你都知道吗?
- 【焦点热闻】设计时速250公里!银兰高铁全线开通运营:最快3小时可达
- 暴降千元性价比还是低!苹果欲放弃iPhone 14销售最差机型:你会买Plus吗
- 委员建议禁放烟花改为限时燃放 网友争议是否污染环境:多地明确禁放
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
(三)elasticsearch 源码之启动流程分析
1.前面我们在《(一)elasticsearch 编译和启动》和 《(二)elasticsearch 源码目录 》简单了解下es(elasticsearch,下同),现在我们来看下启动代码
(相关资料图)
下面是启动流程图,我们按照流程图的顺序依次描述
2.启动流程
org.elasticsearch.bootstrap.Elasticsearchpublic static void main(final String[] args) throws Exception { overrideDnsCachePolicyProperties(); /* * We want the JVM to think there is a security manager installed so that if internal policy decisions that would be based on the * presence of a security manager or lack thereof act as if there is a security manager present (e.g., DNS cache policy). This * forces such policies to take effect immediately. */ System.setSecurityManager(new SecurityManager() { @Override public void checkPermission(Permission perm) { // grant all permissions so that we can later set the security manager to the one that we want } }); LogConfigurator.registerErrorListener(); final Elasticsearch elasticsearch = new Elasticsearch(); int status = main(args, elasticsearch, Terminal.DEFAULT); if (status != ExitCodes.OK) { exit(status); } }
后续执行 Elasticsearch.execute -> Elasticsearch.init -> Bootstrap.init
org.elasticsearch.bootstrap.Bootstrapstatic void init( final boolean foreground, final Path pidFile, final boolean quiet, final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException { // force the class initializer for BootstrapInfo to run before // the security manager is installed BootstrapInfo.init(); INSTANCE = new Bootstrap(); // 安全配置文件 final SecureSettings keystore = loadSecureSettings(initialEnv); final Environment environment = createEnvironment(pidFile, keystore, initialEnv.settings(), initialEnv.configFile()); LogConfigurator.setNodeName(Node.NODE_NAME_SETTING.get(environment.settings())); try { LogConfigurator.configure(environment); } catch (IOException e) { throw new BootstrapException(e); } if (JavaVersion.current().compareTo(JavaVersion.parse("11")) < 0) { final String message = String.format( Locale.ROOT, "future versions of Elasticsearch will require Java 11; " + "your Java version from [%s] does not meet this requirement", System.getProperty("java.home")); new DeprecationLogger(LogManager.getLogger(Bootstrap.class)).deprecated(message); } // 处理pidFile if (environment.pidFile() != null) { try { PidFile.create(environment.pidFile(), true); } catch (IOException e) { throw new BootstrapException(e); } } // 如果是后台启动,则不打印日志 final boolean closeStandardStreams = (foreground == false) || quiet; try { if (closeStandardStreams) { final Logger rootLogger = LogManager.getRootLogger(); final Appender maybeConsoleAppender = Loggers.findAppender(rootLogger, ConsoleAppender.class); if (maybeConsoleAppender != null) { Loggers.removeAppender(rootLogger, maybeConsoleAppender); } closeSystOut(); } // fail if somebody replaced the lucene jars checkLucene(); // 通用异常捕获 // install the default uncaught exception handler; must be done before security is // initialized as we do not want to grant the runtime permission // setDefaultUncaughtExceptionHandler Thread.setDefaultUncaughtExceptionHandler(new ElasticsearchUncaughtExceptionHandler()); INSTANCE.setup(true, environment); try { // any secure settings must be read during node construction IOUtils.close(keystore); } catch (IOException e) { throw new BootstrapException(e); } INSTANCE.start(); if (closeStandardStreams) { closeSysError(); } }
这里我们可以关注下 INSTANCE.setup(true, environment);
org.elasticsearch.bootstrap.Bootstrapprivate void setup(boolean addShutdownHook, Environment environment) throws BootstrapException { Settings settings = environment.settings(); try { spawner.spawnNativeControllers(environment); } catch (IOException e) { throw new BootstrapException(e); } // 检查一些mlock设定 initializeNatives( environment.tmpFile(), BootstrapSettings.MEMORY_LOCK_SETTING.get(settings), BootstrapSettings.SYSTEM_CALL_FILTER_SETTING.get(settings), BootstrapSettings.CTRLHANDLER_SETTING.get(settings)); // 探针 // initialize probes before the security manager is installed initializeProbes(); if (addShutdownHook) { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { IOUtils.close(node, spawner); LoggerContext context = (LoggerContext) LogManager.getContext(false); Configurator.shutdown(context); if (node != null && node.awaitClose(10, TimeUnit.SECONDS) == false) { throw new IllegalStateException("Node didn"t stop within 10 seconds. " + "Any outstanding requests or tasks might get killed."); } } catch (IOException ex) { throw new ElasticsearchException("failed to stop node", ex); } catch (InterruptedException e) { LogManager.getLogger(Bootstrap.class).warn("Thread got interrupted while waiting for the node to shutdown."); Thread.currentThread().interrupt(); } } }); } try { // 检查类加载的一些问题 // look for jar hell final Logger logger = LogManager.getLogger(JarHell.class); JarHell.checkJarHell(logger::debug); } catch (IOException | URISyntaxException e) { throw new BootstrapException(e); } // Log ifconfig output before SecurityManager is installed IfConfig.logIfNecessary(); // 安全处理 // install SM after natives, shutdown hooks, etc. try { Security.configure(environment, BootstrapSettings.SECURITY_FILTER_BAD_DEFAULTS_SETTING.get(settings)); } catch (IOException | NoSuchAlgorithmException e) { throw new BootstrapException(e); } node = new Node(environment) { @Override protected void validateNodeBeforeAcceptingRequests( final BootstrapContext context, final BoundTransportAddress boundTransportAddress, List checks) throws NodeValidationException { BootstrapChecks.check(context, boundTransportAddress, checks); } }; }
最后一句 node = new Node(environment) 初始化了节点,里面做了许多工作
org.elasticsearch.node.Nodeprotected Node( final Environment environment, Collection> classpathPlugins, boolean forbidPrivateIndexSettings) { ... // 打印jvm信息 final JvmInfo jvmInfo = JvmInfo.jvmInfo(); logger.info( "version[{}], pid[{}], build[{}/{}/{}/{}], OS[{}/{}/{}], JVM[{}/{}/{}/{}]", Build.CURRENT.getQualifiedVersion(), jvmInfo.pid(), Build.CURRENT.flavor().displayName(), Build.CURRENT.type().displayName(), Build.CURRENT.hash(), Build.CURRENT.date(), Constants.OS_NAME, Constants.OS_VERSION, Constants.OS_ARCH, Constants.JVM_VENDOR, Constants.JVM_NAME, Constants.JAVA_VERSION, Constants.JVM_VERSION);... // 初始化各类服务,以及他们相关的依赖 this.pluginsService = new PluginsService(tmpSettings, environment.configFile(), environment.modulesFile(), environment.pluginsFile(), classpathPlugins); final Settings settings = pluginsService.updatedSettings(); final Set possibleRoles = Stream.concat( DiscoveryNodeRole.BUILT_IN_ROLES.stream(), pluginsService.filterPlugins(Plugin.class) .stream() .map(Plugin::getRoles) .flatMap(Set::stream)) .collect(Collectors.toSet()); DiscoveryNode.setPossibleRoles(possibleRoles); localNodeFactory = new LocalNodeFactory(settings, nodeEnvironment.nodeId());... // guice注入 modules.add(b -> { b.bind(Node.class).toInstance(this); b.bind(NodeService.class).toInstance(nodeService); b.bind(NamedXContentRegistry.class).toInstance(xContentRegistry); b.bind(PluginsService.class).toInstance(pluginsService); b.bind(Client.class).toInstance(client); b.bind(NodeClient.class).toInstance(client); b.bind(Environment.class).toInstance(this.environment); b.bind(ThreadPool.class).toInstance(threadPool);
es 使用 guice注入框架,guice是个非常轻量级的依赖注入框架,既然各个组件都已经注入好了,我们现在可以启动了。
INSTANCE.start -> Bootstrap.start
org.elasticsearch.bootstrap.Bootstrapprivate void start() throws NodeValidationException { node.start(); keepAliveThread.start(); }
node.start中启动各个组件。es中的各个组件继承了 AbstractLifecycleComponent。start方法会调用组件的doStart方法。
org.elasticsearch.node.Nodepublic Node start() throws NodeValidationException { if (!lifecycle.moveToStarted()) { return this; } logger.info("starting ..."); pluginLifecycleComponents.forEach(LifecycleComponent::start); injector.getInstance(MappingUpdatedAction.class).setClient(client); injector.getInstance(IndicesService.class).start(); injector.getInstance(IndicesClusterStateService.class).start(); injector.getInstance(SnapshotsService.class).start(); injector.getInstance(SnapshotShardsService.class).start(); injector.getInstance(SearchService.class).start(); nodeService.getMonitorService().start(); final ClusterService clusterService = injector.getInstance(ClusterService.class); final NodeConnectionsService nodeConnectionsService = injector.getInstance(NodeConnectionsService.class); nodeConnectionsService.start(); clusterService.setNodeConnectionsService(nodeConnectionsService); ...
具体的我们看两个比较重要的服务 transportService.start();
org.elasticsearch.transport.TransportService@Override protected void doStart() { transport.setMessageListener(this); connectionManager.addListener(this); // 建立网络连接 transport.start(); if (transport.boundAddress() != null && logger.isInfoEnabled()) { logger.info("{}", transport.boundAddress()); for (Map.Entry entry : transport.profileBoundAddresses().entrySet()) { logger.info("profile [{}]: {}", entry.getKey(), entry.getValue()); } } localNode = localNodeFactory.apply(transport.boundAddress()); if (connectToRemoteCluster) { // here we start to connect to the remote clusters remoteClusterService.initializeRemoteClusters(); } }
启动transport的实现类是 SecurityNetty4HttpServerTransport
另一个比较重要的服务,discovery.start(),具体实现类是 Coordinator
org.elasticsearch.cluster.coordination.Coordinator@Override protected void doStart() { synchronized (mutex) { CoordinationState.PersistedState persistedState = persistedStateSupplier.get(); coordinationState.set(new CoordinationState(getLocalNode(), persistedState, electionStrategy)); peerFinder.setCurrentTerm(getCurrentTerm()); configuredHostsResolver.start(); final ClusterState lastAcceptedState = coordinationState.get().getLastAcceptedState(); if (lastAcceptedState.metaData().clusterUUIDCommitted()) { logger.info("cluster UUID [{}]", lastAcceptedState.metaData().clusterUUID()); } final VotingConfiguration votingConfiguration = lastAcceptedState.getLastCommittedConfiguration(); if (singleNodeDiscovery && votingConfiguration.isEmpty() == false && votingConfiguration.hasQuorum(Collections.singleton(getLocalNode().getId())) == false) { throw new IllegalStateException("cannot start with [" + DiscoveryModule.DISCOVERY_TYPE_SETTING.getKey() + "] set to [" + DiscoveryModule.SINGLE_NODE_DISCOVERY_TYPE + "] when local node " + getLocalNode() + " does not have quorum in voting configuration " + votingConfiguration); } ...
(三)elasticsearch 源码之启动流程分析
焦点要闻:特色功能(锐捷云桌面篇)
qq中毒了是什么原因?qq中毒了怎么办?
Win8系统如何关机?win8系统怎么连接wifi?
贝尔金路由器如何设置?贝尔金路由器怎么恢复出厂设置?
天天滚动:手机App秒测血氧 能替代血氧仪吗?专家科普
世界微动态丨雅阁、CR-V均中招!本田中国召回近20万辆混动车 润滑油不够
过去一年都听过什么歌?网易云音乐2022年度听歌报告正式上线
环球关注:汉仪字库定制打造!钉钉进步体来了:永久免费商用
【全球快播报】NASA分享火星冬天航拍照片:色彩斑斓、唯美壮阔
【爬虫实战项目】Python爬取Top100电影榜单数据保存本地(附源码)
【天天新要闻】说透IO多路复用模型
关注:李子柒与微念达成和解 断更500多天的“她”何时回归?
焦点日报:Epic免费送《死亡搁浅》导剪版变标准版后续:官方删除道歉微博
环球关注:你在干啥?2022年中国人每天用手机时长创新高:都在狂刷视频、玩游戏等
百事通!Redmi K60把国产2K OLED屏从不可能变成现实:这过程很痛苦很艰辛
全球观点:苹果市值一夜蒸发约4431亿元 曝其有意砍价iPhone供应链 确保自己利润
DirtyPipe(CVE-2022-0847)漏洞分析
热点聚焦:笔记本SSD普及率今年已达92%:机械硬盘凉凉了
PC硬件机能榨干的日子一去不返!显卡危机不会再有了
【环球报资讯】机箱接口套路多 这些小知识你都知道吗?
【焦点热闻】设计时速250公里!银兰高铁全线开通运营:最快3小时可达
暴降千元性价比还是低!苹果欲放弃iPhone 14销售最差机型:你会买Plus吗
委员建议禁放烟花改为限时燃放 网友争议是否污染环境:多地明确禁放
头条焦点:AMD机会来了?商家预售NV RTX 4070 Ti:售价最高8399元
天天快讯:把WSL安装到指定目录下的简易完美方法
环球热点!Azure 使用技巧
热推荐:卡梅隆急了!《阿凡达3》、《阿凡达4》已经开拍
焦点简讯:HTC Vive新品发布会定档1月6日:旗舰头显来了
全球视讯!TP-LINK Wi-Fi 7游戏路由器来了:三频19Gbps 双万兆网口
环球今亮点!又省117元 EPIC喜加一:硬核魂类游戏《致命躯壳 》免费送 手残党注意
冬至都过了 北半球日照越来越长:为什么却越来越冷了呢?
AcWing245. 你能回答这些问题吗
2022年抖音用户最爱的十本书:四大名著霸占前四名
全球最大规模“沙戈荒”风电光伏基地项目开工 投资超800亿元
今日关注:《王者荣耀》2023年第一款皮肤官宣:传说品质 首周135元
关注:MAUI新生6.2-浮出控件导航Flyout-FlyoutItem/MenuItem/Header/Footer
世界信息:2022年抖音十大热点歌曲出炉:你听过几首?
男子网购N95口罩收到2瓶酱油 驿站:已拒收
观天下!谎称电脑中毒 印度团伙假冒微软工程师骗了美国人100多亿美元
顺丰:快递业的人海战术已近黄昏
环球快看点丨分享20个Javascript中的数组方法,收藏
基于 Dubbo Admin 实现同机房/区域优先
天天微资讯!Autodesk Maya2023 安装教程(小白看了也说understand)
焦点速递!分布式三大热门"IP"之分布式事务随笔
虚假新闻检测(CANMD)《Contrastive Domain Adaptation for Early Misinformation Detection:
世界要闻:全球出行需求爆棚:飞机制造巨头订单积压1.27万架 飞机远远不够用
焦点快播:三星推出43寸奥德赛Neo G7显示器:Mini-LED屏幕、支持144Hz高刷
最令人期待的2023新片
报道:2022年跨年档预售票房破1000万:《阿凡达2》仅位居第二
今年好莱坞最赔钱电影出炉:赔惨了
天天快播:Seata
【天天热闻】django 13 csrf 与 auth
IdentityServer4 - v4.x .Net中的实践应用
全球最新:第一百一十八篇: JavaScript 原型链式继承
【全球速看料】进口游戏版号时隔548天再发放!数量逐年下降
天天实时:2022年iPhone 14系列出货量下调 明年越南将加入生产
一加11打破安卓不可能!员工自己都不敢相信
全球要闻:兔年邮票“蓝兔子”引争议 真是童年阴影?邮政回应:没人投诉
一次多重体验:杰士邦三合一安全套30只19.9元发车
AcWing1169. 糖果
当前快讯:FreeSWITCH使用ODBC
【全球报资讯】基于NT架构脱胎换骨!QQ for Linux 3.0正式版上架官网
环球实时:卡梅隆自曝《阿凡达2》10分钟删减镜头:动作暴力元素相关
每日焦点!老外评选2022年10款最佳RPG游戏:老头环等上榜
无人驾驶可达80km/h:深圳坪山云巴1号线正式通车
【全球聚看点】还买啥Zen4 酷睿i7-12700KF到手2149元:12核5GHz游戏神U
.NET和JavaScript控件丨Infragistics功能简介
环球今热点:网友吃火锅被反向抹零多收0.3元 店家:四舍五入系统设定
【天天速看料】首发极具颠覆性技术 比亚迪仰望发布定档:明年1月5日见
全球短讯!根治安卓卡顿的旗舰来了!网友做梦梦到一加11:现在就想买 等不及了
世界微速讯:苹果高端制造离不开中国 iPhone 15 Pro Max新增立讯代工:富士康不再是唯一
天天快看点丨郑州200多车相撞事故已致1死 大雾是元凶:雾天行车指南要收好
天天报道:隐性等待和显性等待
python中的mysql操作教程及实例
大牌现货:超亚N95口罩84.9元30片发车
全球通讯!封杀半年之后微软“开恩” 俄罗斯网友可以下载Win11了
2022年进口网络游戏审批结果公布:腾讯《宝可梦大集结》等游戏在列
天天观察:世界最大液体镜面望远镜启用 成本仅为玻璃反射镜的1%
快播:NOIP动态规划
每日聚焦:数据结构(Data Structure)的基本思想是增删改查
环球视点!宝塔网站批量迁移
环球速看:首架C919机组人员分享飞行体验:感受很好、令人信任
加绒不加价:361°全革运动鞋99元大促(门店259元)
环球即时看!GTX 1060三朝元老还能被迫营业?
二代骁龙8折叠旗舰!vivo X Fold 2来了:2K轻薄大屏
实时焦点:不下载不让看全文成为历史!工信部新规将禁止网页强制用户下载应用
开发工具与低代码开发平台丨上海道宁联合Grapecity为您提供各类软件开发工具和服务
当云原生网关遇上图数据库,NebulaGraph 的 APISIX 最佳实践
天天看点:LOJ 6041 「雅礼集训 2017 Day7」事情的相似度 题解 (SAM+启发式合并)
当前热讯:WinNTSetup V5.3.0 Bata5 单文件版
一分钟搞定Netty 三大组件,如果搞不定,再看3遍
世界播报:《阿凡达2》差的远!2022国内电影票房前10:第一超40亿
前沿热点:折叠旗舰卖到白菜价!moto razr 2022宣布调价至4999元
美国人钱包年末又迎重击!极端寒潮导致上周电价飙升超6000%
天天时讯:或售70万对刚比亚迪!东风猛士M-Terrain量产实车曝光:凶悍
只有Redmi做到了!米粉没想到2022年2500元的手机都有无线充电
环球热文:隐私计算之多方安全计算(MPC,Secure Multi-Party Computation)
河南郑新黄河大桥因大雾多车相撞:涉及200多辆车
速递!安卓手机不卡顿!一加11内存基因重组技术揭秘:数据抓取量提升16倍