// 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.
There are two types of nodes:  servers and clients.

A _server node_ is the base computational and data storage unit. Typically, you start a single server
node per machine or container and it will scale vertically by utilizing all of the CPU, RAM, and other resources
available unless specified differently. Those resources are pooled and become available to Ignite applications
once the server node joins a cluster of other server nodes.

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

A _cluster_ is a group of server nodes interconnected together in order to provide shared resources like RAM and
CPU to your applications.

Operations executed by applications (key-value queries, SQL, computations, etc.) are directed to and performed by
server nodes. If you need more computational power or data storage, scale out your cluster by adding more server
nodes to it.

_Client nodes_ are your connection endpoints and gateways from the application layer to the cluster of
server nodes. You always embed a client into your application code and execute required APIs. The clients shield all
the complexity of Ignite's distributed nature from application developers who will see the cluster as a single unit. It's as simple as connecting to an RDBMS via a JDBC driver or Spring Data framework.
