现在es的集群发现用的是unicast模式,所以要将新节点加入集群,需要配置unicast节点地址列表,也就是discovery.zen.ping.unicast.hosts,默认值是本机,除非要将集群部署在同一台机器上,否则必须配置。

下面进入源码看一下读取unicast节点列表的具体过程。

入口在UnicastZenPing类的下面这个方法里面:

    /*** a variant of {@link #ping(Consumer, TimeValue)}, but allows separating the scheduling duration* from the duration used for request level time outs. This is useful for testing*/protected void ping(final Consumer<PingCollection> resultsConsumer,final TimeValue scheduleDuration,final TimeValue requestDuration) {final List<TransportAddress> seedAddresses = new ArrayList<>();seedAddresses.addAll(hostsProvider.buildDynamicHosts(createHostsResolver()));...}

新启动的节点要ping(关于ping,会在《elasticsearch源码:ping的发送与处理过程》中讨论)集群内的其它节点,所以要构造节点地址列表,即上面代码里的seedAddresses

然后debug一路跟踪会进入SettingsBasedHostsProvider类的buildDynamicHosts方法:

    @Overridepublic List<TransportAddress> buildDynamicHosts(HostsResolver hostsResolver) {return hostsResolver.resolveHosts(configuredHosts, limitPortCounts);}

这里调用传入的HostsResolver根据configuredHostslimitPortCounts参数解析出unicast节点列表。

这两个参数在SettingsBasedHostsProvider类的构造函数里面设置:

    public SettingsBasedHostsProvider(Settings settings, TransportService transportService) {super(settings);if (DISCOVERY_ZEN_PING_UNICAST_HOSTS_SETTING.exists(settings)) {configuredHosts = DISCOVERY_ZEN_PING_UNICAST_HOSTS_SETTING.get(settings);// we only limit to 1 address, makes no sense to ping 100 portslimitPortCounts = LIMIT_FOREIGN_PORTS_COUNT;} else {// if unicast hosts are not specified, fill with simple defaults on the local machineconfiguredHosts = transportService.getLocalAddresses();limitPortCounts = LIMIT_LOCAL_PORTS_COUNT;}logger.debug("using initial hosts {}", configuredHosts);}

这里用到了discovery.zen.ping.unicast.hosts配置,elasticsearch.yml文件的所有配置都会被封装到Settings类。可以看到,如果有这个配置,则用配置的值,limitPortCounts值为1;如果没有,则用默认的本机地址,即"127.0.0.1"和"[::1]",limitPortCounts值为5。

具体解析过程在TcpTransport类的addressesFromString方法:

    @Overridepublic TransportAddress[] addressesFromString(String address, int perAddressLimit) throws UnknownHostException {return parse(address, settings.get("transport.profiles.default.port", PORT.get(settings)), perAddressLimit);}

这里调用parse方法来做最后的解析,传入的参数address即为discovery.zen.ping.unicast.hosts值。

parse方法较长,就不罗列了,自行下载源码点进去一看便知,只做如下总结:

  • elasticsearch集群发现采用unicast模式;
  • unicast的地址列表通过discovery.zen.ping.unicast.hosts来配置;
  • discovery.zen.ping.unicast.hosts可以配置为[“127.0.0.1”, “127.0.0.1:9301”,"[::1]"]的形式;
  • 如果discovery.zen.ping.unicast.hosts中没有配置端口,会从transport.profiles.default.port配置读取,可以配置单个值,也可以配置为范围,如“9300-9400”;
  • 如果没有配置transport.profiles.default.port,将会读取transport.tcp.port配置作为端口,一样可以是单个值也可以是范围;
  • 如果transport.tcp.port也没有配置,将会使用默认值“9300-9400”,是一个范围;
  • 对于配置了discovery.zen.ping.unicast.hosts的情况,elasticsearch代码中写死了限制端口个数为1个,所以如果port的值为一个范围,则取第一个端口,即端口配置“9300-9400”实际等同于“9300”(所以端口配置成范围是没有意义的);
  • 对于没有配置discovery.zen.ping.unicast.hosts的情况(也就是本机),elasticsearch代码中写死了限制端口个数为5个,所以如果port的值为一个范围,则取前5个端口。

elasticsearch源码:unicast列表解析相关推荐

  1. ElasticSearch源码解析(五):排序(评分公式)

    ElasticSearch源码解析(五):排序(评分公式) 转载自:http://blog.csdn.net/molong1208/article/details/50623948   一.目的 一个 ...

  2. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...

  3. Elasticsearch源码解析:环境搭建

    在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码.我发现两种方法可以相辅相成,互相补充.阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想 ...

  4. elasticsearch源码分析之search模块(client端)

    elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...

  5. (01)ORB-SLAM2源码无死角解析-(58) 闭环线程→计算Sim3: 源码Sim3Solver::iterate()讲解

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (0 ...

  6. MyBatis 源码分析 - 配置文件解析过程

    文章目录 * 本文速览 1.简介 2.配置文件解析过程分析 2.1 配置文件解析入口 2.2 解析 properties 配置 2.3 解析 settings 配置 2.3.1 settings 节点 ...

  7. Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求

    Elasticsearch源码分析-线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...

  8. elasticsearch源码分析之search模块(server端)

    elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...

  9. Spring源码-applicationcontext.xml解析过程

    为什么80%的码农都做不了架构师?>>>    Spring源码-applicationcontext.xml解析过程 核心流程:Spring中对于applicationcontex ...

  10. 【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点

    2019.2.14 情人节,Filecoin项目开放了核心源码仓库go-filecoin,并更新了 filecoin-project organization下的诸多核心成果,这意味着,Filecoi ...

最新文章

  1. JS收集:限制输入格式
  2. ABAP 中的变量和常量
  3. 介绍一个免费的采用人工智能放大老照片的在线网站
  4. tcpdump 抓二层包_可能是我见过的最简单易懂且实用的 TCPDump 和 Wireshark 抓包及分析教程!( 强烈建议收藏 )...
  5. 今后最有前途的媒体格式 MXF
  6. createtrackbar函数_【3】OpenCV图像处理模块(10)inRange函数实现阈值化,HSV图像分割...
  7. 漫步线性代数二十三——行列式公式
  8. canoe变量和信号_CANoe的经验总结及如何进行 CAN Signal layout
  9. mysql的压缩版安装
  10. Jmeter多机联合产生负载 (转)
  11. php调用声卡,利用vb测声卡_visualbasic教程
  12. 超级鹰+selenium规避检测模拟登录12306
  13. centeros域名解析失败
  14. 你中了微软的圈套么?
  15. HTML+CSS基础训练之实现一个“真实”的网页~
  16. 【职业规划】第一篇:程序员分级之初级程序员
  17. 无存储式优惠券编码方案
  18. 057.(2.26)遇到人生低谷期该怎么度过?
  19. vue-i18n插件报错Uncaught SyntaxError: Not available in legacy mode
  20. STW43NM60ND意法车规MOS管\原装现货ASEMI代理

热门文章

  1. python实现均匀分配_python 实现生成均匀分布的点
  2. 修正蹩脚的Scratch汉化
  3. 关于JS获取网页地址并截取其中wxid
  4. 【Linux 内核】Linux 内核源码根目录下的文件 ( .clang-format | COPYING | CREDITS | Kbuild | Kconfig | MAINTAINERS )
  5. xp 架设网站服务器,WinXP如何设置iis服务器?WinXP iis服务器设置教程
  6. 2020 年的风口是什么?
  7. 【计算机体系结构量化与研究方法笔记】
  8. 浦发笔试考计算机知识么,浦发银行考试:笔试到底考什么?
  9. 深度理解感受野(一)什么是感受野?
  10. 手机拍照反差对焦、相位对焦和激光对焦系统解析