solr 独立zookeeper集群 SEVERE: null:java.lang.IllegalArgumentException: port out of range:-1 异常处理

当遇到Solr启动报错'port out of range:-1'时,问题根源在于-DzkRun参数导致,该参数用于启动内部嵌入Zookeeper。在使用独立Zookeeper集群时,不应包含此参数。通过源码分析,可以发现该错误是由于尝试从-DzkRun中获取客户端端口而引发。解决方案是移除-DzkRun参数,正确配置-DzkHost。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常信息如下:

SEVERE: null:java.lang.IllegalArgumentException: port out of range:-1
        at java.net.InetSocketAddress.<init>(InetSocketAddress.java:83)
        at java.net.InetSocketAddress.<init>(InetSocketAddress.java:63)
        at
org.apache.solr.cloud.SolrZkServerProps.setClientPort(SolrZkServer.java:315)
        at
org.apache.solr.cloud.SolrZkServerProps.getMySeverId(SolrZkServer.java:278)
        at
org.apache.solr.cloud.SolrZkServerProps.parseProperties(SolrZkServer.java:453)
        at
org.apache.solr.cloud.SolrZkServer.parseConfig(SolrZkServer.java:90)
        at
org.apache.solr.core.CoreContainer.initZooKeeper(CoreContainer.java:208)

按照solr官网邮件中的解决方式是无法实现的,错误配置如下:

-DzkRun -DzkHost=nodeA:9983,nodeB:9983,nodeC:9983,nodeD:9983/solrroot -DnumShards=2 -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=MyConfig

错误根本原因不是所谓独立zookeeper集群造成,而是因为带有-DzkRun参数造成,该参数是用来启动内部嵌入zookeeper的,外部集群不需要加入该参数。

通过源码可看出该问题出现原因:

1,注入zookeeper集群信息源码如下:

  public static void injectServers(Properties props, String zkRun, String zkHost) {

    // if clientPort not already set, use zkRun
    if (zkRun != null && props.getProperty("clientPort")==null) {
      int portIdx = zkRun.lastIndexOf(':');
      if (portIdx > 0) {
        String portStr = zkRun.substring(portIdx+1);
        props.setProperty("clientPort", portStr);
      }
    }

    boolean hasServers = hasServers(props);

    if (!hasServers && zkHost != null) {
      int alg = Integer.parseInt(props.getProperty("electionAlg","3").trim());
      String[] hosts = zkHost.split(",");
      int serverNum = 0;
      for (String hostAndPort : hosts) {
        hostAndPort = hostAndPort.trim();
        int portIdx = hostAndPort.lastIndexOf(':');
        String clientPortStr = hostAndPort.substring(portIdx+1);
        int clientPort = Integer.parseInt(clientPortStr);
        String host = hostAndPort.substring(0,portIdx);

        String serverStr = host + ':' + (clientPort+1);
        // zk leader election algorithms other than 0 need an extra port for leader election.
        if (alg != 0) {
          serverStr = serverStr + ':' + (clientPort+2);
        }

        props.setProperty("server."+serverNum, serverStr);
        serverNum++;
      }
    }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值