> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> MergeTree con respaldo en Google Cloud Storage (GCS)

# Integrar Google Cloud Storage con ClickHouse

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

<Note>
  Si usas ClickHouse Cloud en [Google Cloud](https://cloud.google.com), esta página no aplica, ya que tus servicios ya usarán [Google Cloud Storage](https://cloud.google.com/storage). Si buscas hacer `SELECT` o `INSERT` de datos desde GCS, consulta la [table function `gcs`](/es/reference/functions/table-functions/gcs).
</Note>

ClickHouse reconoce que GCS es una solución de almacenamiento atractiva si buscas separar almacenamiento y cómputo. Para facilitarlo, se ofrece compatibilidad para usar GCS como almacenamiento de un motor MergeTree. Esto te permitirá aprovechar la escalabilidad y las ventajas de costo de GCS, así como el rendimiento de inserción y consulta del motor MergeTree.

<div id="gcs-backed-mergetree">
  ## MergeTree respaldado por GCS
</div>

<div id="creating-a-disk">
  ### Crear un disco
</div>

Para utilizar un bucket de GCS como disco, primero debemos declararlo en la configuración de ClickHouse, en un archivo dentro de `conf.d`. A continuación se muestra un ejemplo de declaración de un disco de GCS. Esta configuración incluye varias secciones para configurar el "disco" de GCS, la caché y la política que se especifica en las consultas DDL cuando se crean tablas en el disco de GCS. A continuación se describe cada una de ellas.

<div id="storage_configuration--disks--gcs">
  #### Configuración de almacenamiento > disks > gcs
</div>

Esta parte de la configuración se muestra en la sección resaltada y especifica lo siguiente:

* El tipo de disco es `s3` porque se utiliza la API de S3.
* El endpoint proporcionado por GCS
* La clave HMAC y el secreto de la cuenta de servicio
* La ruta de metadatos en el disco local

```xml highlight={5-10} theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/BUCKET NAME/FOLDER NAME/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

<div id="storage_configuration--disks--cache">
  #### Configuración de almacenamiento > disks > cache
</div>

La configuración de ejemplo destacada a continuación habilita una caché en memoria de 10 Gi para el disco `gcs`.

```xml highlight={12-17} theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/BUCKET NAME/FOLDER NAME/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
            <gcs_cache>
                <type>cache</type>
                <disk>gcs</disk>
                <path>/var/lib/clickhouse/disks/gcs_cache/</path>
                <max_size>10Gi</max_size>
            </gcs_cache>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs_cache</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

<div id="storage_configuration--policies--gcs_main">
  #### Configuración de almacenamiento > políticas > gcs\_main
</div>

Las políticas de configuración de almacenamiento permiten elegir dónde se almacenan los datos.  La política destacada a continuación permite almacenar datos en el disco `gcs` especificando la política `gcs_main`.  Por ejemplo, `CREATE TABLE ... SETTINGS storage_policy='gcs_main'`.

```xml highlight={14-20} theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/BUCKET NAME/FOLDER NAME/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

Puede encontrar una lista completa de los ajustes pertinentes para esta definición de disco [aquí](/es/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-s3).

<div id="creating-a-table">
  ### Crear una tabla
</div>

Si ha configurado su disco para usar un bucket con acceso de escritura, debería poder crear una tabla como en el ejemplo siguiente. Para simplificar, usamos un subconjunto de las columnas de los taxis de NYC y enviamos los datos directamente a la tabla respaldada por GCS:

```sql highlight={20} theme={null}
CREATE TABLE trips_gcs
(
   `trip_id` UInt32,
   `pickup_date` Date,
   `pickup_datetime` DateTime,
   `dropoff_datetime` DateTime,
   `pickup_longitude` Float64,
   `pickup_latitude` Float64,
   `dropoff_longitude` Float64,
   `dropoff_latitude` Float64,
   `passenger_count` UInt8,
   `trip_distance` Float64,
   `tip_amount` Float32,
   `total_amount` Float32,
   `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(pickup_date)
ORDER BY pickup_datetime
SETTINGS storage_policy='gcs_main'
```

```sql theme={null}
INSERT INTO trips_gcs SELECT trip_id, pickup_date, pickup_datetime, dropoff_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, passenger_count, trip_distance, tip_amount, total_amount, payment_type FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames') LIMIT 1000000;
```

Dependiendo del hardware, este último insert de 1m filas puede tardar unos minutos en ejecutarse. Puede confirmar el progreso en la tabla system.processes. Si quiere, puede ajustar el número de filas hasta el límite de 10m y probar algunas consultas de ejemplo.

```sql theme={null}
SELECT passenger_count, avg(tip_amount) AS avg_tip, avg(total_amount) AS avg_amount FROM trips_gcs GROUP BY passenger_count;
```

<div id="handling-replication">
  ### Gestión de la replicación
</div>

La replicación con discos de GCS se puede lograr con el motor de tabla `ReplicatedMergeTree`. Consulta la guía [replicación de un único segmento en dos regiones de GCP mediante GCS](#gcs-multi-region) para obtener más información.

<div id="learn-more">
  ### Más información
</div>

La [API XML de Cloud Storage](https://cloud.google.com/storage/docs/xml-api/overview) es compatible con algunas herramientas y bibliotecas que funcionan con servicios como Amazon Simple Storage Service (Amazon S3).

Para obtener más información sobre cómo ajustar los hilos, consulta [Optimización del rendimiento](/es/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse#s3-optimizing-performance).

<div id="gcs-multi-region">
  ## Uso de Google Cloud Storage (GCS)
</div>

<Tip>
  El almacenamiento de objetos se usa de forma predeterminada en ClickHouse Cloud; no es necesario seguir este procedimiento si ejecutas ClickHouse en ClickHouse Cloud.
</Tip>

<div id="plan-the-deployment">
  ### Planificar la implementación
</div>

Este tutorial se ha escrito para describir una implementación replicada de ClickHouse que se ejecuta en Google Cloud y utiliza Google Cloud Storage (GCS) como "tipo" de disco de almacenamiento de ClickHouse.

En este tutorial, implementará nodos de servidor de ClickHouse en máquinas virtuales de Google Compute Engine, cada uno con un bucket de GCS asociado para el almacenamiento. La replicación la coordina un conjunto de nodos de ClickHouse Keeper, también implementados como máquinas virtuales.

Requisitos de ejemplo para alta disponibilidad:

* Dos nodos de servidor de ClickHouse, en dos regiones de GCP
* Dos buckets de GCS, implementados en las mismas regiones que los dos nodos de servidor de ClickHouse
* Tres nodos de ClickHouse Keeper; dos de ellos se implementan en las mismas regiones que los nodos de servidor de ClickHouse. El tercero puede estar en la misma región que uno de los dos primeros nodos de Keeper, pero en una zona de disponibilidad distinta.

ClickHouse Keeper requiere dos nodos para funcionar; de ahí la necesidad de tres nodos para alta disponibilidad.

<div id="prepare-vms">
  ### Preparar máquinas virtuales
</div>

Implemente cinco VM en tres regiones:

| Región | servidor de ClickHouse | Bucket              | ClickHouse Keeper |
| ------ | ---------------------- | ------------------- | ----------------- |
| 1      | `chnode1`              | `bucket_regionname` | `keepernode1`     |
| 2      | `chnode2`              | `bucket_regionname` | `keepernode2`     |
| 3 `*`  |                        |                     | `keepernode3`     |

`*` Puede ser una zona de disponibilidad distinta en la misma región que la 1 o la 2.

<div id="deploy-clickhouse">
  #### Desplegar ClickHouse
</div>

Despliegue ClickHouse en dos hosts; en las configuraciones de ejemplo, se llaman `chnode1` y `chnode2`.

Ubique `chnode1` en una región de GCP y `chnode2` en otra. En esta guía se utilizan `us-east1` y `us-east4` para las VM de Compute Engine y también para los buckets de GCS.

<Note>
  No inicie `clickhouse server` hasta haberlo configurado. Limítese a instalarlo.
</Note>

Consulte las [instrucciones de instalación](/es/get-started/setup/install) al realizar los pasos de despliegue en los nodos del servidor de ClickHouse.

<div id="deploy-clickhouse-keeper">
  #### Implemente ClickHouse Keeper
</div>

Implemente ClickHouse Keeper en tres hosts; en las configuraciones de ejemplo, estos se denominan `keepernode1`, `keepernode2` y `keepernode3`. `keepernode1` puede implementarse en la misma región que `chnode1`, `keepernode2` junto con `chnode2` y `keepernode3` en cualquiera de las dos regiones, pero en una zona de disponibilidad distinta a la del nodo de ClickHouse de esa región.

Consulte las [instrucciones de instalación](/es/get-started/setup/install) al realizar los pasos de implementación en los nodos de ClickHouse Keeper.

<div id="create-two-buckets">
  ### Crear dos buckets
</div>

Los dos servidores de ClickHouse estarán ubicados en distintas regiones para garantizar alta disponibilidad. Cada uno tendrá un bucket de GCS en la misma región.

En **Cloud Storage > Buckets**, elija **CREATE BUCKET**. Para este tutorial, se crean dos buckets: uno en `us-east1` y otro en `us-east4`. Los buckets son de región única, de clase de almacenamiento estándar y no son públicos. Cuando se le solicite, habilite la prevención de acceso público. No cree carpetas; se crearán cuando ClickHouse escriba en el almacenamiento.

Si necesita instrucciones paso a paso para crear buckets y una clave HMAC, expanda **Create GCS buckets and an HMAC key** y siga el procedimiento:

<Accordion title="Crear buckets de GCS y una clave HMAC">
  ### ch\_bucket\_us\_east1

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-bucket-1.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=27b3795ec2c474f21115db86517d7c94" alt="Creación de un bucket de GCS en US East 1" border width="1437" height="387" data-path="images/integrations/data-ingestion/s3/GCS-bucket-1.png" />

  ### ch\_bucket\_us\_east4

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-bucket-2.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=a529210c01f0debd00d2dc188d2ac502" alt="Creación de un bucket de GCS en US East 4" border width="1437" height="386" data-path="images/integrations/data-ingestion/s3/GCS-bucket-2.png" />

  ### Generar una clave de acceso

  ### Crear una clave HMAC y un secreto para una cuenta de servicio

  Abra **Cloud Storage > Settings > Interoperability** y elija una **Access key** existente o **CREATE A KEY FOR A SERVICE ACCOUNT**. Esta guía describe el proceso para crear una clave nueva para una cuenta de servicio nueva.

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-a-service-account-key.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=c4d60f90c6ac63adf42c0d5b9e46a326" alt="Generación de una clave HMAC para una cuenta de servicio en GCS" border width="969" height="911" data-path="images/integrations/data-ingestion/s3/GCS-create-a-service-account-key.png" />

  ### Agregar una nueva cuenta de servicio

  Si este proyecto no tiene ninguna cuenta de servicio existente, haga clic en **CREATE NEW ACCOUNT**.

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-0.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=5532ca2ab7181e65069c23c7ad0ace77" alt="Adición de una nueva cuenta de servicio en GCS" border width="924" height="317" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-0.png" />

  La creación de la cuenta de servicio consta de tres pasos; en el primero, asigne a la cuenta un nombre, un ID y una descripción significativos.

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-a.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=4ec5be0e99acbf2d2bed9f9e4cad3a95" alt="Definición de un nuevo nombre e ID de cuenta de servicio en GCS" border width="842" height="737" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-a.png" />

  En el cuadro de diálogo de configuración de Interoperability, se recomienda el rol de IAM **Storage Object Admin**; selecciónelo en el segundo paso.

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-2.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=99f98f7f2684736aa2181191b44cc4c0" alt="Selección del rol de IAM Storage Object Admin en GCS" border width="822" height="396" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-2.png" />

  El tercer paso es opcional y no se utiliza en esta guía. Puede permitir que los usuarios tengan estos privilegios según sus políticas.

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-3.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=97534c90225ce94557ea1ea97bc57ec7" alt="Configuración de ajustes adicionales para la nueva cuenta de servicio en GCS" border width="635" height="697" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-3.png" />

  Se mostrará la clave HMAC de la cuenta de servicio. Guarde esta información, ya que se utilizará en la configuración de ClickHouse.

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/5u7Mhe0xzzPTUaXM/images/integrations/data-ingestion/s3/GCS-guide-key.png?fit=max&auto=format&n=5u7Mhe0xzzPTUaXM&q=85&s=898ccd9ed73756ff5cd39843eb29eeaa" alt="Recuperación de la clave HMAC generada para GCS" border width="917" height="390" data-path="images/integrations/data-ingestion/s3/GCS-guide-key.png" />
</Accordion>

<div id="configure-clickhouse-keeper">
  ### Configurar ClickHouse Keeper
</div>

Todos los nodos de ClickHouse Keeper tienen el mismo archivo de configuración, excepto la línea `server_id` (la primera línea resaltada a continuación). Modifique el archivo con los nombres de host de sus servidores de ClickHouse Keeper y, en cada uno de ellos, configure `server_id` para que coincida con la entrada `server` correspondiente en `raft_configuration`. Dado que en este ejemplo `server_id` está establecido en `3`, hemos resaltado las líneas correspondientes en `raft_configuration`.

* Edite el archivo con sus nombres de host y asegúrese de que se resuelvan desde los nodos del servidor de ClickHouse y los nodos de Keeper
* Copie el archivo en la ubicación correspondiente (`/etc/clickhouse-keeper/keeper_config.xml` en cada uno de los servidores de Keeper
* Edite el `server_id` en cada máquina según el número de su entrada en `raft_configuration`

```xml title=/etc/clickhouse-keeper/keeper_config.xml highlight={12,33-37} theme={null}
<clickhouse>
    <logger>
        <level>trace</level>
        <log>/var/log/clickhouse-keeper/clickhouse-keeper.log</log>
        <errorlog>/var/log/clickhouse-keeper/clickhouse-keeper.err.log</errorlog>
        <size>1000M</size>
        <count>3</count>
    </logger>
    <listen_host>0.0.0.0</listen_host>
    <keeper_server>
        <tcp_port>9181</tcp_port>
        <server_id>3</server_id>
        <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
        <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>

        <coordination_settings>
            <operation_timeout_ms>10000</operation_timeout_ms>
            <session_timeout_ms>30000</session_timeout_ms>
            <raft_logs_level>warning</raft_logs_level>
        </coordination_settings>

        <raft_configuration>
            <server>
                <id>1</id>
                <hostname>keepernode1.us-east1-b.c.clickhousegcs-374921.internal</hostname>
                <port>9234</port>
            </server>
            <server>
                <id>2</id>
                <hostname>keepernode2.us-east4-c.c.clickhousegcs-374921.internal</hostname>
                <port>9234</port>
            </server>
            <server>
                <id>3</id>
                <hostname>keepernode3.us-east5-a.c.clickhousegcs-374921.internal</hostname>
                <port>9234</port>
            </server>
        </raft_configuration>
    </keeper_server>
</clickhouse>
```

<div id="configure-clickhouse-server">
  ### Configurar el servidor de ClickHouse
</div>

<Info>
  **práctica recomendada**

  En algunos pasos de esta guía, se le pedirá que coloque un archivo de configuración en `/etc/clickhouse-server/config.d/`. Esta es la ubicación predeterminada en los sistemas Linux para los archivos de sobrescritura de configuración. Cuando coloque estos archivos en ese directorio, ClickHouse fusionará su contenido con la configuración predeterminada. Al colocarlos en el directorio `config.d`, evitará perder la configuración durante una actualización.
</Info>

<div id="networking">
  #### Redes
</div>

De forma predeterminada, ClickHouse escucha en la interfaz de bucle local; en una configuración replicada, es necesario disponer de conectividad de red entre las máquinas. Escuche en todas las interfaces:

```xml title=/etc/clickhouse-server/config.d/network.xml theme={null}
<clickhouse>
    <listen_host>0.0.0.0</listen_host>
</clickhouse>
```

<div id="remote-clickhouse-keeper-servers">
  #### Servidores remotos de ClickHouse Keeper
</div>

La replicación se coordina mediante ClickHouse Keeper. Este archivo de configuración identifica los nodos de ClickHouse Keeper por nombre de host y número de puerto.

* Modifica los nombres de host para que coincidan con tus servidores Keeper

```xml title=/etc/clickhouse-server/config.d/use-keeper.xml theme={null}
<clickhouse>
    <zookeeper>
        <node index="1">
            <host>keepernode1.us-east1-b.c.clickhousegcs-374921.internal</host>
            <port>9181</port>
        </node>
        <node index="2">
            <host>keepernode2.us-east4-c.c.clickhousegcs-374921.internal</host>
            <port>9181</port>
        </node>
        <node index="3">
            <host>keepernode3.us-east5-a.c.clickhousegcs-374921.internal</host>
            <port>9181</port>
        </node>
    </zookeeper>
</clickhouse>
```

<div id="remote-clickhouse-servers">
  #### Servidores remotos de ClickHouse
</div>

Este archivo configura el hostname y el puerto de cada servidor de ClickHouse en el clúster. El archivo de configuración predeterminado contiene definiciones de clúster de ejemplo; para mostrar solo los clústeres que estén completamente configurados, se añade el atributo `replace="true"` a la entrada `remote_servers` para que, cuando esta configuración se fusione con la predeterminada, reemplace la sección `remote_servers` en lugar de añadirse a ella.

* Edite el archivo con sus nombres de host y asegúrese de que se resuelvan desde los nodos del servidor de ClickHouse

```xml title=/etc/clickhouse-server/config.d/remote-servers.xml theme={null}
<clickhouse>
    <remote_servers replace="true">
        <cluster_1S_2R>
            <shard>
                <replica>
                    <host>chnode1.us-east1-b.c.clickhousegcs-374921.internal</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>chnode2.us-east4-c.c.clickhousegcs-374921.internal</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster_1S_2R>
    </remote_servers>
</clickhouse>
```

<div id="replica-identification">
  #### Identificación de la réplica
</div>

Este archivo configura ajustes relacionados con la ruta de ClickHouse Keeper. En concreto, las macros que se usan para identificar a qué réplica pertenecen los datos. En un servidor, la réplica debe especificarse como `replica_1`, y en el otro servidor como `replica_2`. Los nombres pueden cambiarse; siguiendo nuestro ejemplo de una réplica almacenada en Carolina del Sur y la otra en el norte de Virginia, los valores podrían ser `carolina` y `virginia`; solo asegúrese de que sean diferentes en cada máquina.

```xml title=/etc/clickhouse-server/config.d/macros.xml highlight={8} theme={null}
<clickhouse>
    <distributed_ddl>
            <path>/clickhouse/task_queue/ddl</path>
    </distributed_ddl>
    <macros>
        <cluster>cluster_1S_2R</cluster>
        <shard>1</shard>
        <replica>replica_1</replica>
    </macros>
</clickhouse>
```

<div id="storage-in-gcs">
  #### Almacenamiento en GCS
</div>

La configuración de almacenamiento de ClickHouse incluye `disks` y `policies`. El disco que se configura a continuación se llama `gcs` y es de `type` `s3`. El tipo es `s3` porque ClickHouse accede al bucket de GCS como si fuera un bucket de AWS S3. Se necesitarán dos copias de esta configuración, una para cada uno de los nodos del servidor de ClickHouse.

Estas sustituciones deben realizarse en la configuración siguiente.

Estas sustituciones difieren entre los dos nodos del servidor de ClickHouse:

* `REPLICA 1 BUCKET` debe establecerse con el nombre del bucket en la misma región que el servidor
* `REPLICA 1 FOLDER` debe cambiarse a `replica_1` en uno de los servidores y a `replica_2` en el otro

Estas sustituciones son comunes a ambos nodos:

* `access_key_id` debe establecerse con la clave HMAC generada anteriormente
* `secret_access_key` debe establecerse con el secreto HMAC generado anteriormente

```xml title=/etc/clickhouse-server/config.d/storage.xml theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/REPLICA 1 BUCKET/REPLICA 1 FOLDER/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
            <cache>
                <type>cache</type>
                <disk>gcs</disk>
                <path>/var/lib/clickhouse/disks/gcs_cache/</path>
                <max_size>10Gi</max_size>
            </cache>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

<div id="start-clickhouse-keeper">
  ### Iniciar ClickHouse Keeper
</div>

Utilice los comandos correspondientes a su sistema operativo; por ejemplo:

```bash theme={null}
sudo systemctl enable clickhouse-keeper
sudo systemctl start clickhouse-keeper
sudo systemctl status clickhouse-keeper
```

<div id="check-clickhouse-keeper-status">
  #### Comprobar el estado de ClickHouse Keeper
</div>

Envíe comandos a ClickHouse Keeper con `netcat`.  Por ejemplo, `mntr` devuelve el estado del clúster de ClickHouse Keeper.  Si ejecuta el comando en cada uno de los nodos de ClickHouse Keeper, verá que uno es el líder y los otros dos son seguidores:

```bash theme={null}
echo mntr | nc localhost 9181
```

```response highlight={7-9,18-19} theme={null}
zk_version      v22.7.2.15-stable-f843089624e8dd3ff7927b8a125cf3a7a769c069
zk_avg_latency  0
zk_max_latency  11
zk_min_latency  0
zk_packets_received     1783
zk_packets_sent 1783
zk_num_alive_connections        2
zk_outstanding_requests 0
zk_server_state leader
zk_znode_count  135
zk_watch_count  8
zk_ephemerals_count     3
zk_approximate_data_size        42533
zk_key_arena_size       28672
zk_latest_snapshot_size 0
zk_open_file_descriptor_count   182
zk_max_file_descriptor_count    18446744073709551615
zk_followers    2
zk_synced_followers     2
```

<div id="start-clickhouse-server">
  ### Iniciar el servidor de ClickHouse
</div>

En `chnode1` y `chnode`, ejecute:

```bash theme={null}
sudo service clickhouse-server start
```

```bash theme={null}
sudo service clickhouse-server status
```

<div id="verification">
  ### Verificación
</div>

<div id="verify-disk-configuration">
  #### Verifique la configuración del disco
</div>

`system.disks` debe contener registros para cada disco:

* default
* gcs
* cache

```sql theme={null}
SELECT *
FROM system.disks
FORMAT Vertical
```

```response theme={null}
Row 1:
──────
name:             cache
path:             /var/lib/clickhouse/disks/gcs/
free_space:       18446744073709551615
total_space:      18446744073709551615
unreserved_space: 18446744073709551615
keep_free_space:  0
type:             s3
is_encrypted:     0
is_read_only:     0
is_write_once:    0
is_remote:        1
is_broken:        0
cache_path:       /var/lib/clickhouse/disks/gcs_cache/

Row 2:
──────
name:             default
path:             /var/lib/clickhouse/
free_space:       6555529216
total_space:      10331889664
unreserved_space: 6555529216
keep_free_space:  0
type:             local
is_encrypted:     0
is_read_only:     0
is_write_once:    0
is_remote:        0
is_broken:        0
cache_path:

Row 3:
──────
name:             gcs
path:             /var/lib/clickhouse/disks/gcs/
free_space:       18446744073709551615
total_space:      18446744073709551615
unreserved_space: 18446744073709551615
keep_free_space:  0
type:             s3
is_encrypted:     0
is_read_only:     0
is_write_once:    0
is_remote:        1
is_broken:        0
cache_path:

3 rows in set. Elapsed: 0.002 sec.
```

<div id="verify-that-tables-created-on-the-cluster-are-created-on-both-nodes">
  #### Verifique que las tablas creadas en el clúster se hayan creado en ambos nodos
</div>

```sql highlight={1,18} theme={null}
create table trips on cluster 'cluster_1S_2R' (
 `trip_id` UInt32,
 `pickup_date` Date,
 `pickup_datetime` DateTime,
 `dropoff_datetime` DateTime,
 `pickup_longitude` Float64,
 `pickup_latitude` Float64,
 `dropoff_longitude` Float64,
 `dropoff_latitude` Float64,
 `passenger_count` UInt8,
 `trip_distance` Float64,
 `tip_amount` Float32,
 `total_amount` Float32,
 `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4))
ENGINE = ReplicatedMergeTree
PARTITION BY toYYYYMM(pickup_date)
ORDER BY pickup_datetime
SETTINGS storage_policy='gcs_main'
```

```response theme={null}
┌─host───────────────────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode2.us-east4-c.c.gcsqa-375100.internal │ 9000 │      0 │       │                   1 │                1 │
└────────────────────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host───────────────────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode1.us-east1-b.c.gcsqa-375100.internal │ 9000 │      0 │       │                   0 │                0 │
└────────────────────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

2 rows in set. Elapsed: 0.641 sec.
```

<div id="verify-that-data-can-be-inserted">
  #### Verifique que se puedan insertar datos
</div>

```sql theme={null}
INSERT INTO trips SELECT
    trip_id,
    pickup_date,
    pickup_datetime,
    dropoff_datetime,
    pickup_longitude,
    pickup_latitude,
    dropoff_longitude,
    dropoff_latitude,
    passenger_count,
    trip_distance,
    tip_amount,
    total_amount,
    payment_type
FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames')
LIMIT 1000000
```

<div id="verify-that-the-storage-policy-gcs_main-is-used-for-the-table">
  #### Verifique que la política de almacenamiento `gcs_main` se utilice para la tabla.
</div>

```sql theme={null}
SELECT
    engine,
    data_paths,
    metadata_path,
    storage_policy,
    formatReadableSize(total_bytes)
FROM system.tables
WHERE name = 'trips'
FORMAT Vertical
```

```response theme={null}
Row 1:
──────
engine:                          ReplicatedMergeTree
data_paths:                      ['/var/lib/clickhouse/disks/gcs/store/631/6315b109-d639-4214-a1e7-afbd98f39727/']
metadata_path:                   /var/lib/clickhouse/store/e0f/e0f3e248-7996-44d4-853e-0384e153b740/trips.sql
storage_policy:                  gcs_main
formatReadableSize(total_bytes): 36.42 MiB

1 row in set. Elapsed: 0.002 sec.
```

<div id="verify-in-google-cloud-console">
  #### Verificar en la Consola de Google Cloud
</div>

Al examinar los buckets, verá que se creó una carpeta en cada bucket con el nombre usado en el archivo de configuración `storage.xml`. Expanda las carpetas y verá muchos archivos que representan las particiones de datos.

<div id="bucket-for-replica-one">
  #### Bucket de la réplica 1
</div>

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=aae0ab212beb28ec1a27503abff20f1e" size="lg" border alt="Bucket de la réplica 1 en Google Cloud Storage con la estructura de carpetas y las particiones de datos" width="958" height="736" data-path="images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png" />

<div id="bucket-for-replica-two">
  #### Bucket para la réplica dos
</div>

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/5u7Mhe0xzzPTUaXM/images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png?fit=max&auto=format&n=5u7Mhe0xzzPTUaXM&q=85&s=2bd6dabb699bd88ded113cc554f6888b" size="lg" border alt="Bucket de la segunda réplica en Google Cloud Storage que muestra la estructura de carpetas con particiones de datos" width="958" height="736" data-path="images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png" />
