<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE html>

      
      
<html lang="en">
<head>
    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-1382082-1"></script>
    <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'UA-61232409-1');
    </script>

    

    <meta charset="UTF-8">
    <title>ZooKeeper IP Finder | Ignite Documentation</title>
    
    <link rel="canonical" href="/docs/zookeeper/zookeeper-ip" />
    
	
	<link rel="stylesheet" href="/assets/css/styles.css?1651672546">
    <link rel="stylesheet" href="/assets/css/asciidoc-pygments.css">
    <link rel="shortcut icon" href="/favicon.ico">
    <meta name='viewport' content='width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0'>

	<link rel="stylesheet"
	  href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type="text/javascript" src="/assets/js/jquery.swiftype.autocomplete.js?1651672546"></script>
    <script type="text/javascript" src="/assets/js/anchor.min.js?1651672546"></script>
    

</head>
<body>
    <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<header>
    <div class="container">
        <button type='button' class='menu' title='Docs menu'>
          <img src="/assets/images/menu-icon.svg"/>
        </button>

        <div class='home'>
            <a href="/" class='home' title='Apache Ignite home'>
                <img src="/assets/images/apache_ignite_logo.svg" alt="Apache Ignite logo" width="103" height="36" >
            </a>
        </div>

        <nav>

        </nav>
        <form class='search'>
            <button class="search-close" type='button'><img src='/assets/images/cancel.svg'></button>
            <input type="search" placeholder="Search…" id="search-input">
        </form>
        <button type='button' class='search-toggle'><img src='/assets/images/search.svg'></button>
        <button type='button' class='top-nav-toggle'>⋮</button>
        <a href="https://github.com/ignite" title='GitHub' class='github' target="_blank">
            <img src="/assets/images/github-gray.svg" alt="GitHub logo">
        </a>
    </div>
</header>


    <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
	 <link rel="stylesheet" href="/assets/css/docs.css">
<section class='page-docs'>
    <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->







<nav class='left-nav' data-swiftype-index='false'>

    
    <li>
        

<a href="/docs/extensions/aws/aws" class='' >Amazon S3 IP Finder</a>

</li>

    <li>
        

<a href="/docs/extensions/camel/camel-streamer" class='' >Apache Camel Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/flink/flink-streamer" class='' >Apache Flink Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/flume/flume-sink" class='' >Apache Flume Sink</a>

</li>

    <li>
        

<a href="/docs/extensions/azure/azure" class='' >Apache Ignite Azure Module</a>

</li>

    <li>
        

<a href="/docs/extensions/gce/gce" class='' >Apache Ignite GCE Module</a>

</li>

    <li>
        

<a href="/docs/extensions/pub-sub/pub-sub" class='' >Apache Ignite Pub/Sub Module</a>

</li>

    <li>
        

<a href="/docs/extensions/spring/spring-boot" class='' >Apache Ignite and Spring Boot</a>

</li>

    <li>
        

<a href="/docs/extensions/spring/spring-data" class='' >Apache Ignite and Spring Data</a>

</li>

    <li>
        

<a href="/docs/extensions/spring/spring-caching" class='' >Apache Ignite and Spring Cache</a>

</li>

    <li>
        

<a href="/docs/extensions/spring/spring-tx" class='' >Apache Ignite and Spring Transactions</a>

</li>

    <li>
        

<a href="/docs/extensions/kafka/kafka-streamer" class='' >Apache Kafka Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/storm/storm-streamer" class='' >Apache Storm Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/cdc/change-data-capture-extensions" class='' >Change Data Capture Extension</a>

</li>

    <li>
        

<a href="/docs/extensions/jms/jms-streamer" class='' >JMS Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/mqtt/mqtt-streamer" class='' >MQTT Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/perf-statistics/performance-statistics" class='' >Performance Statistics Extension</a>

</li>

    <li>
        

<a href="/docs/extensions/rocketmq/rocketmq-streamer" class='' >RocketMQ Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/topology-validator/topology-validator" class='' >Topology Validator</a>

</li>

    <li>
        

<a href="/docs/extensions/twitter/twitter-streamer" class='' >Twitter Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/zeromq/zeromq-streamer" class='' >ZeroMQ Streamer</a>

</li>

    <li>
        

<a href="/docs/extensions/zookeeper/zookeeper-ip" class='' >ZooKeeper IP Finder</a>

</li>

</nav>
<div class="left-nav__overlay"></div>


    <article data-swiftype-index='true'>
        <a class='edit-link' href="/_docs/zookeeper/zookeeper-ip.adoc" target="_blank">Edit</a>
        
            <h1>ZooKeeper IP Finder</h1>
        
        <div class="paragraph">
<p>To set up ZooKeeper IP finder use <code>TcpDiscoveryZookeeperIpFinder</code> (note that <code>ignite-zookeeper</code> module has to be enabled).</p>
</div>
<code-tabs><code-tab data-tab='XML'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="xml"><span class="nt">&lt;bean</span> <span class="na">class=</span><span class="s">"org.apache.ignite.configuration.IgniteConfiguration"</span><span class="nt">&gt;</span>

    <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"discoverySpi"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;bean</span> <span class="na">class=</span><span class="s">"org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"ipFinder"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;bean</span> <span class="na">class=</span><span class="s">"org.apache.ignite.spi.discovery.tcp.ipfinder.zk.TcpDiscoveryZookeeperIpFinder"</span><span class="nt">&gt;</span>
                    <span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"zkConnectionString"</span> <span class="na">value=</span><span class="s">"127.0.0.1:2181"</span><span class="nt">/&gt;</span>
                <span class="nt">&lt;/bean&gt;</span>
            <span class="nt">&lt;/property&gt;</span>
        <span class="nt">&lt;/bean&gt;</span>
    <span class="nt">&lt;/property&gt;</span>
<span class="nt">&lt;/bean&gt;</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">TcpDiscoverySpi</span> <span class="n">spi</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TcpDiscoverySpi</span><span class="o">();</span>

<span class="nc">TcpDiscoveryZookeeperIpFinder</span> <span class="n">ipFinder</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TcpDiscoveryZookeeperIpFinder</span><span class="o">();</span>

<span class="c1">// Specify ZooKeeper connection string.</span>
<span class="n">ipFinder</span><span class="o">.</span><span class="na">setZkConnectionString</span><span class="o">(</span><span class="s">"127.0.0.1:2181"</span><span class="o">);</span>

<span class="n">spi</span><span class="o">.</span><span class="na">setIpFinder</span><span class="o">(</span><span class="n">ipFinder</span><span class="o">);</span>

<span class="nc">IgniteConfiguration</span> <span class="n">cfg</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">IgniteConfiguration</span><span class="o">();</span>

<span class="c1">// Override default discovery SPI.</span>
<span class="n">cfg</span><span class="o">.</span><span class="na">setDiscoverySpi</span><span class="o">(</span><span class="n">spi</span><span class="o">);</span>

<span class="c1">// Start the node.</span>
<span class="nc">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="nc">Ignition</span><span class="o">.</span><span class="na">start</span><span class="o">(</span><span class="n">cfg</span><span class="o">);</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C#/.NET. You can use XML configuration.</code></pre>
</div>
</div></code-tab><code-tab data-tab='C++' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C++. You can use XML configuration.</code></pre>
</div>
</div></code-tab></code-tabs>
        <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<div class="copyright">
 © 2022 The Apache Software Foundation.<br/>
Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are either registered trademarks or trademarks of The Apache Software Foundation. 

</div>

    </article>
    <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<nav class="right-nav" data-swiftype-index='false'>
    
    <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
      
      
<footer>
</footer>

</nav>
    
</section>
<script type='module' src='/assets/js/code-copy-to-clipboard.js' async></script>

    <script>
    // inits deep anchors -- needs to be done here because of https://www.bryanbraun.com/anchorjs/#dont-run-it-too-late 
    anchors.add('.page-docs h1, .page-docs h2, .page-docs h3:not(.discrete), .page-docs h4, .page-docs h5');
    anchors.options = {
        placement: 'right',
        visible: 'always'
    };
    </script>
</body>
<script type='module' src='/assets/js/index.js?1651672546' async></script>
</html>
