// 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.
= Clustering

== Overview

In this chapter, we discuss different ways nodes can discover each other to form a cluster.

On start-up, a node is assigned either one of the two roles: _server node_ or _client node_.
Server nodes are the workhorses of the cluster; they cache data, execute compute tasks, etc.
Client nodes join the topology as regular nodes but they do not store data. Client nodes are used to stream data into the cluster and execute user queries.

To form a cluster, each node must be able to connect to all other nodes. To ensure that, a proper <<Discovery Mechanisms,discovery mechanism>> must be configured.


NOTE: In addition to client nodes, you can use Thin Clients to define and manipulate data in the cluster.
Learn more about the thin clients in the link:thin-clients/getting-started-with-thin-clients[Thin Clients] section.


image::images/ignite_clustering.png[Ignite Cluster]



== Discovery Mechanisms

Nodes can automatically discover each other and form a cluster.
This allows you to scale out when needed without having to restart the whole cluster.
Developers can also leverage Ignite's hybrid cloud support that allows establishing connection between private and public clouds such as Amazon Web Services, providing them with the best of both worlds.

Ignite provides two implementations of the discovery mechanism intended for different usage scenarios:

* link:clustering/tcp-ip-discovery[TCP/IP Discovery] is designed and optimized for 100s of nodes.
* link:clustering/zookeeper-discovery[ZooKeeper Discovery] that allows scaling Ignite clusters to 100s and 1000s of nodes preserving linear scalability and performance.






