elasticsearch源码:unicast列表解析

本文探讨了Elasticsearch集群发现机制中的unicast模式,详细介绍了如何配置及解析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方法:

    @Override
    public 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 ports
            limitPortCounts = LIMIT_FOREIGN_PORTS_COUNT;
        } else {
            // if unicast hosts are not specified, fill with simple defaults on the local machine
            configuredHosts = 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方法:

    @Override
    public 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个端口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值