elasticsearch源码:unicast列表解析
现在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
根据configuredHosts
和limitPortCounts
参数解析出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列表解析相关推荐
- ElasticSearch源码解析(五):排序(评分公式)
ElasticSearch源码解析(五):排序(评分公式) 转载自:http://blog.csdn.net/molong1208/article/details/50623948 一.目的 一个 ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...
- Elasticsearch源码解析:环境搭建
在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码.我发现两种方法可以相辅相成,互相补充.阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想 ...
- elasticsearch源码分析之search模块(client端)
elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...
- (01)ORB-SLAM2源码无死角解析-(58) 闭环线程→计算Sim3: 源码Sim3Solver::iterate()讲解
讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (0 ...
- MyBatis 源码分析 - 配置文件解析过程
文章目录 * 本文速览 1.简介 2.配置文件解析过程分析 2.1 配置文件解析入口 2.2 解析 properties 配置 2.3 解析 settings 配置 2.3.1 settings 节点 ...
- Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求
Elasticsearch源码分析-线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...
- elasticsearch源码分析之search模块(server端)
elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...
- Spring源码-applicationcontext.xml解析过程
为什么80%的码农都做不了架构师?>>> Spring源码-applicationcontext.xml解析过程 核心流程:Spring中对于applicationcontex ...
- 【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点
2019.2.14 情人节,Filecoin项目开放了核心源码仓库go-filecoin,并更新了 filecoin-project organization下的诸多核心成果,这意味着,Filecoi ...
最新文章
- JS收集:限制输入格式
- ABAP 中的变量和常量
- 介绍一个免费的采用人工智能放大老照片的在线网站
- tcpdump 抓二层包_可能是我见过的最简单易懂且实用的 TCPDump 和 Wireshark 抓包及分析教程!( 强烈建议收藏 )...
- 今后最有前途的媒体格式 MXF
- createtrackbar函数_【3】OpenCV图像处理模块(10)inRange函数实现阈值化,HSV图像分割...
- 漫步线性代数二十三——行列式公式
- canoe变量和信号_CANoe的经验总结及如何进行 CAN Signal layout
- mysql的压缩版安装
- Jmeter多机联合产生负载 (转)
- php调用声卡,利用vb测声卡_visualbasic教程
- 超级鹰+selenium规避检测模拟登录12306
- centeros域名解析失败
- 你中了微软的圈套么?
- HTML+CSS基础训练之实现一个“真实”的网页~
- 【职业规划】第一篇:程序员分级之初级程序员
- 无存储式优惠券编码方案
- 057.(2.26)遇到人生低谷期该怎么度过?
- vue-i18n插件报错Uncaught SyntaxError: Not available in legacy mode
- STW43NM60ND意法车规MOS管\原装现货ASEMI代理
热门文章
- python实现均匀分配_python 实现生成均匀分布的点
- 修正蹩脚的Scratch汉化
- 关于JS获取网页地址并截取其中wxid
- 【Linux 内核】Linux 内核源码根目录下的文件 ( .clang-format | COPYING | CREDITS | Kbuild | Kconfig | MAINTAINERS )
- xp 架设网站服务器,WinXP如何设置iis服务器?WinXP iis服务器设置教程
- 2020 年的风口是什么?
- 【计算机体系结构量化与研究方法笔记】
- 浦发笔试考计算机知识么,浦发银行考试:笔试到底考什么?
- 深度理解感受野(一)什么是感受野?
- 手机拍照反差对焦、相位对焦和激光对焦系统解析