# Introducción a Time-Structured Merge Tree (TSM)

El **Time-Structured Merge Tree (TSM)** es el motor de almacenamiento central de InfluxDB 2.x, diseñado específicamente para manejar datos de series temporales de alta velocidad y gran volumen, como los generados en entornos SCADA. Su arquitectura optimiza la escritura, compresión y consulta eficiente de datos, clave para sistemas industriales que requieren monitorización en tiempo real.

### ¿Qué es TSM y por qué es fundamental en InfluxDB? <a href="#id-1-qu-es-tsm-y-por-qu-es-fundamental-en-influxdb" id="id-1-qu-es-tsm-y-por-qu-es-fundamental-en-influxdb"></a>

* **Definición**: TSM es una estructura de almacenamiento basada en árboles que organiza los datos por tiempo, agrupando puntos en bloques comprimidos para reducir la latencia y mejorar la eficiencia en consultas temporales.
* **Ventajas clave**:
  * **Alta velocidad de ingesta**: Soporta millones de escrituras por segundo, ideal para sensores industriales.
  * **Compresión optimizada**: Reduce el espacio en disco hasta un 90% mediante algoritmos para campos numéricos.
  * **Consulta rápida**: Los datos se indexan por tiempo y etiquetas, acelerando filtrados en rangos temporales.

### Arquitectura de TSM <a href="#id-2-arquitectura-de-tsm" id="id-2-arquitectura-de-tsm"></a>

<figure><img src="/files/K9t63HHaJ3aCFIOnLzbk" alt="" width="375"><figcaption><p>Arquitectura de TSM</p></figcaption></figure>

**Componentes principales:**

* **TSM Files**: Archivos que almacenan datos comprimidos organizados por series de tiempo. Incluyen metadatos (tags, fields) y bloques de datos ordenados cronológicamente.
* **Write-Ahead Log (WAL)**: Garantiza la durabilidad de los datos ante fallos, registrando todas las escrituras antes de persistirlas en archivos TSM.
* **Cache**: Almacena datos recientes en memoria para escrituras rápidas y se vacía periódicamente a los archivos TSM mediante el proceso de snapshot.

**Flujo de escritura:**

1. Los datos ingresan al WAL y a la cache en memoria.
2. Cuando la cache alcanza su límite, se convierte en un archivo TSM.
3. Los archivos TSM se fusionan (compaction) para eliminar datos duplicados u obsoletos.

{% code title="text" overflow="wrap" %}

```
/data/wal/    # Write-Ahead Log
/data/data/   # Archivos TSM organizados por buckets
```

{% endcode %}

**Índices de series temporales (TSI)**

* Los índices TSI permiten gestionar millones de series y búsquedas rápidas sobre datos históricos, almacenando los índices en disco y no solo en memoria.
* Esto facilita la escalabilidad y la consulta eficiente de históricos extensos.

### TSM vs. LSM-Tree: Diferencias clave <a href="#id-3-tsm-vs-lsm-tree-diferencias-clave" id="id-3-tsm-vs-lsm-tree-diferencias-clave"></a>

| Característica | TSM (InfluxDB)           | LSM-Tree (Cassandra, etc.) |
| -------------- | ------------------------ | -------------------------- |
| Ordenación     | Por tiempo y tags        | Por clave                  |
| Compresión     | Optimizada para series   | Genérica                   |
| Consultas      | Agregaciones temporales  | Búsquedas por clave        |
| Uso de memoria | Cache orientada a tiempo | Memtables genéricas        |

### &#x20;<a href="#id-4-optimizacin-de-tsm-para-entornos-scada" id="id-4-optimizacin-de-tsm-para-entornos-scada"></a>

### Optimización de TSM para entornos SCADA <a href="#id-4-optimizacin-de-tsm-para-entornos-scada" id="id-4-optimizacin-de-tsm-para-entornos-scada"></a>

**Manejo de alta cardinalidad:**

* **Problema**: En sistemas SCADA, la alta cardinalidad (miles de tags únicos) puede ralentizar consultas.
* **Soluciones**:
  * Estrategia de tags: Evitar tags con valores únicos excesivos.
  * Uso de campos: Almacenar metadatos variables como campos en vez de tags.

**Retención y compresión:**

* Ejemplo de política:

  <pre class="language-sql" data-title="sql" data-overflow="wrap"><code class="lang-sql">CREATE RETENTION POLICY "scada_1year" ON "industrial" DURATION 52w REPLICATION 1
  </code></pre>
* Downsampling: Usar Continuous Queries para reducir la resolución de datos históricos.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://darioaplicano.gitbook.io/influxdb2.x/sesion-1/guion-de-la-sesion/documentacion/introduccion-a-influxdb-y-bases-de-datos-de-series-temporales/introduccion-a-time-structured-merge-tree-tsm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
