> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentación sobre la detección de clústeres en ClickHouse

# Detección de clústeres

<div id="overview">
  ## Descripción general
</div>

La funcionalidad Detección de clústeres de ClickHouse simplifica la configuración del clúster al permitir que los nodos se descubran y se registren automáticamente, sin necesidad de definirlos explícitamente en los archivos de configuración. Esto resulta especialmente útil cuando la definición manual de cada nodo se vuelve engorrosa.

<Note>
  Detección de clústeres es una funcionalidad experimental y puede modificarse o eliminarse en futuras versiones.
  Para habilitarla, incluya la opción `allow_experimental_cluster_discovery` en su archivo de configuración:

  ```xml theme={null}
  <clickhouse>
      <!-- ... -->
      <allow_experimental_cluster_discovery>1</allow_experimental_cluster_discovery>
      <!-- ... -->
  </clickhouse>
  ```
</Note>

<div id="remote-servers-configuration">
  ## Configuración de los servidores remotos
</div>

<div id="traditional-manual-configuration">
  ### Configuración manual tradicional
</div>

Tradicionalmente, en ClickHouse, había que especificar manualmente en la configuración cada segmento y cada réplica del clúster:

```xml theme={null}
<remote_servers>
    <cluster_name>
        <shard>
            <replica>
                <host>node1</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>node2</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <host>node3</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>node4</host>
                <port>9000</port>
            </replica>
        </shard>
    </cluster_name>
</remote_servers>

```

<div id="using-cluster-discovery">
  ### Uso de Detección de clústeres
</div>

Con Detección de clústeres, en lugar de definir explícitamente cada nodo, basta con especificar un path en ZooKeeper. Todos los nodos que se registren bajo este path en ZooKeeper se descubrirán automáticamente y se agregarán al clúster.

```xml theme={null}
<remote_servers>
    <cluster_name>
        <discovery>
            <path>/clickhouse/discovery/cluster_name</path>

            <!-- # Parámetros de configuración opcionales: -->

            <!-- ## Credenciales de autenticación para acceder al resto de nodos del clúster: -->
            <!-- <user>user1</user> -->
            <!-- <password>pass123</password> -->
            <!-- ### Como alternativa a la contraseña, se puede usar un secret entre servidores: -->
            <!-- <secret>secret123</secret> -->

            <!-- ## Segmento para el nodo actual (véase más abajo): -->
            <!-- <shard>1</shard> -->

            <!-- ## Modo observador (véase más abajo): -->
            <!-- <observer/> -->
        </discovery>
    </cluster_name>
</remote_servers>
```

Si quieres especificar un número de segmento para un nodo concreto, puedes incluir la etiqueta `<shard>` dentro de la sección `<discovery>`:

para `node1` y `node2`:

```xml theme={null}
<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <shard>1</shard>
</discovery>
```

para `node3` y `node4`:

```xml theme={null}
<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <shard>2</shard>
</discovery>
```

<div id="observer-mode">
  ### Modo observador
</div>

Los nodos configurados en modo observador no se registrarán como réplicas.
Solo observarán y detectarán otras réplicas activas en el clúster sin participar activamente.
Para habilitar el modo observador, incluye la etiqueta `<observer/>` en la sección `<discovery>`:

```xml theme={null}
<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <observer/>
</discovery>
```

<div id="discovery-of-clusters">
  ### Detección de clústeres
</div>

A veces puede ser necesario añadir y eliminar no solo hosts de los clústeres, sino también los propios clústeres. Puede usar el nodo `<multicluster_root_path>` con la ruta raíz de varios clústeres:

```xml theme={null}
<remote_servers>
    <some_unused_name>
        <discovery>
            <multicluster_root_path>/clickhouse/discovery</multicluster_root_path>
            <observer/>
        </discovery>
    </some_unused_name>
</remote_servers>
```

En este caso, cuando algún otro host se registra con la ruta `/clickhouse/discovery/some_new_cluster`, se añadirá un clúster llamado `some_new_cluster`.

Puede usar ambas funciones simultáneamente; el host puede registrarse en el clúster `my_cluster` y descubrir cualquier otro clúster:

```xml theme={null}
<remote_servers>
    <my_cluster>
        <discovery>
            <path>/clickhouse/discovery/my_cluster</path>
        </discovery>
    </my_cluster>
    <some_unused_name>
        <discovery>
            <multicluster_root_path>/clickhouse/discovery</multicluster_root_path>
            <observer/>
        </discovery>
    </some_unused_name>
</remote_servers>
```

Limitaciones:

* No se pueden usar `<path>` y `<multicluster_root_path>` a la vez en el mismo subárbol de `remote_servers`.
* `<multicluster_root_path>` solo puede usarse con `<observer/>`.
* La última parte de la ruta de Keeper se usa como nombre del clúster, mientras que durante el registro el nombre se toma de la etiqueta XML.

<div id="use-cases-and-limitations">
  ## Casos de uso y limitaciones
</div>

A medida que se añaden o eliminan nodos de la ruta de ZooKeeper especificada, estos se detectan o se eliminan automáticamente del clúster sin necesidad de cambios en la configuración ni de reiniciar el servidor.

Sin embargo, los cambios afectan solo a la configuración del clúster, no a los datos ni a las bases de datos y tablas existentes.

Considere el siguiente ejemplo con un clúster de 3 nodos:

```xml theme={null}
<remote_servers>
    <default>
        <discovery>
            <path>/clickhouse/discovery/default_cluster</path>
        </discovery>
    </default>
</remote_servers>
```

```sql theme={null}
SELECT * EXCEPT (default_database, errors_count, slowdowns_count, estimated_recovery_time, database_shard_name, database_replica_name)
FROM system.clusters WHERE cluster = 'default';

┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user─┬─is_active─┐
│ default │         1 │            1 │           1 │ 92d3c04025e8 │ 172.26.0.5   │ 9000 │        0 │      │      ᴺᵁᴸᴸ │
│ default │         1 │            1 │           2 │ a6a68731c21b │ 172.26.0.4   │ 9000 │        1 │      │      ᴺᵁᴸᴸ │
│ default │         1 │            1 │           3 │ 8e62b9cb17a1 │ 172.26.0.2   │ 9000 │        0 │      │      ᴺᵁᴸᴸ │
└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴──────┴───────────┘
```

```sql theme={null}
CREATE TABLE event_table ON CLUSTER default (event_time DateTime, value String)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/event_table', '{replica}')
ORDER BY event_time PARTITION BY toYYYYMM(event_time);

INSERT INTO event_table ...
```

A continuación, añadimos un nuevo nodo al clúster e iniciamos ese nuevo nodo con la misma entrada en la sección `remote_servers` de un archivo de configuración:

```response theme={null}
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user─┬─is_active─┐
│ default │         1 │            1 │           1 │ 92d3c04025e8 │ 172.26.0.5   │ 9000 │        0 │      │      ᴺᵁᴸᴸ │
│ default │         1 │            1 │           2 │ a6a68731c21b │ 172.26.0.4   │ 9000 │        1 │      │      ᴺᵁᴸᴸ │
│ default │         1 │            1 │           3 │ 8e62b9cb17a1 │ 172.26.0.2   │ 9000 │        0 │      │      ᴺᵁᴸᴸ │
│ default │         1 │            1 │           4 │ b0df3669b81f │ 172.26.0.6   │ 9000 │        0 │      │      ᴺᵁᴸᴸ │
└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴──────┴───────────┘
```

El cuarto nodo forma parte del clúster, pero la tabla `event_table` todavía existe solo en los tres primeros nodos:

```sql theme={null}
SELECT hostname(), database, table FROM clusterAllReplicas(default, system.tables) WHERE table = 'event_table' FORMAT PrettyCompactMonoBlock

┌─hostname()───┬─database─┬─table───────┐
│ a6a68731c21b │ default  │ event_table │
│ 92d3c04025e8 │ default  │ event_table │
│ 8e62b9cb17a1 │ default  │ event_table │
└──────────────┴──────────┴─────────────┘
```

Si necesita que las tablas estén replicadas en todos los nodos, puede usar el motor de base de datos [Replicated](/docs/es/reference/engines/database-engines/replicated) como alternativa al descubrimiento del clúster.
