Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Detección de clústeres

Descripción general

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.

Configuración de los servidores remotos

Configuración manual tradicional

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

<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>

Uso de Detección de clústeres

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.

<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:

<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <shard>1</shard>
</discovery>

para node3 y node4:

<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <shard>2</shard>
</discovery>

Modo observador

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>:

<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <observer/>
</discovery>

Detección de clústeres

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:

<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:

<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.

Casos de uso y limitaciones

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:

<remote_servers>
    <default>
        <discovery>
            <path>/clickhouse/discovery/default_cluster</path>
        </discovery>
    </default>
</remote_servers>
SELECT * EXCEPT (default_database, errors_count, slowdowns_count, estimated_recovery_time, database_shard_name, database_replica_name)
FROM system.clusters WHERE cluster = 'default';

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:

┌─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:

SELECT hostname(), database, table FROM clusterAllReplicas(default, system.tables) WHERE table = 'event_table' FORMAT PrettyCompactMonoBlock

Si necesita que las tablas estén replicadas en todos los nodos, puede usar el motor de base de datos Replicated como alternativa al descubrimiento del clúster.

Navigation