Instalación y Configuración de InfluxDB

InfluxDB es la base de datos de series temporales más popular para métricas e IoT, optimizada para almacenar y consultar datos indexados por tiempo con alta velocidad de escritura y compresión eficiente. La versión 2.x introduce Flux como lenguaje de consulta, el concepto de buckets con políticas de retención integradas, y una interfaz web unificada para visualización y administración en servidores Linux.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS/Rocky Linux 8+
  • Al menos 2 GB de RAM (4 GB recomendado para producción)
  • SSD con al menos 20 GB de espacio libre
  • CPU de 64 bits
  • Acceso root o usuario con privilegios sudo

Instalación de InfluxDB

Instalación en Ubuntu/Debian

# Añadir repositorio oficial de InfluxData
curl -s https://repos.influxdata.com/influxdata-archive_compat.key \
    | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg

echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' \
    | sudo tee /etc/apt/sources.list.d/influxdata.list

sudo apt-get update
sudo apt-get install -y influxdb2

# Habilitar e iniciar el servicio
sudo systemctl enable influxdb
sudo systemctl start influxdb

# Verificar el estado
sudo systemctl status influxdb

Instalación en CentOS/Rocky Linux

# Añadir repositorio RPM
cat > /etc/yum.repos.d/influxdata.repo << 'EOF'
[influxdata]
name=InfluxData Repository
baseurl=https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://repos.influxdata.com/influxdata-archive_compat.key
EOF

sudo yum install -y influxdb2 influxdb2-cli

sudo systemctl enable influxdb
sudo systemctl start influxdb

Instalación con Docker

# Docker Compose para InfluxDB
mkdir -p /opt/influxdb && cd /opt/influxdb

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  influxdb:
    image: influxdb:2.7
    restart: unless-stopped
    ports:
      - "8086:8086"
    environment:
      DOCKER_INFLUXDB_INIT_MODE: setup
      DOCKER_INFLUXDB_INIT_USERNAME: admin
      DOCKER_INFLUXDB_INIT_PASSWORD: contraseña_admin_segura
      DOCKER_INFLUXDB_INIT_ORG: mi-organizacion
      DOCKER_INFLUXDB_INIT_BUCKET: metricas
      DOCKER_INFLUXDB_INIT_RETENTION: 30d
    volumes:
      - influxdb_data:/var/lib/influxdb2
      - influxdb_config:/etc/influxdb2

volumes:
  influxdb_data:
  influxdb_config:
EOF

docker-compose up -d

Configuración Inicial

Configurar InfluxDB mediante la CLI influx:

# Configurar InfluxDB por primera vez (instalación nativa)
influx setup \
    --username admin \
    --password "contraseña_segura" \
    --org mi-organizacion \
    --bucket metricas \
    --retention 30d \
    --force

# Verificar la configuración
influx config list

# Crear token de API para aplicaciones
influx auth create \
    --org mi-organizacion \
    --description "Token para Telegraf" \
    --write-buckets \
    --read-buckets

# Listar tokens disponibles
influx auth list

# Acceder a la interfaz web
# http://localhost:8086
# Usuario: admin / contraseña configurada arriba

Configurar la CLI influx para uso habitual:

# Crear perfil de configuración local
influx config create \
    --config-name local \
    --host-url http://localhost:8086 \
    --org mi-organizacion \
    --token "TOKEN_GENERADO_ARRIBA" \
    --active

# Verificar conexión
influx ping

Creación de Buckets

Los buckets son los contenedores de datos con política de retención integrada:

# Crear bucket para métricas de servidores (retención 90 días)
influx bucket create \
    --name metricas-servidores \
    --org mi-organizacion \
    --retention 90d

# Crear bucket para datos IoT (retención 1 año)
influx bucket create \
    --name sensores-iot \
    --org mi-organizacion \
    --retention 365d

# Crear bucket de largo plazo sin expiración (0 = infinito)
influx bucket create \
    --name datos-historicos \
    --org mi-organizacion \
    --retention 0

# Listar buckets disponibles
influx bucket list

# Escribir datos manualmente (Line Protocol de InfluxDB)
# Formato: medición,tags campo=valor timestamp
influx write \
    --bucket metricas-servidores \
    --org mi-organizacion \
    "cpu_usage,host=web-01,region=eu valor=45.2 $(date +%s)000000000"

# Escritura con múltiples puntos
influx write \
    --bucket metricas-servidores \
    "temperatura,sensor=sala1 celsius=22.5
temperatura,sensor=sala2 celsius=24.1
humedad,sensor=sala1 porcentaje=60.3"

Lenguaje Flux

Flux es el lenguaje de consulta funcional de InfluxDB 2.x:

# Consultas básicas con Flux
influx query \
    --org mi-organizacion << 'EOF'
// Obtener datos de los últimos 5 minutos
from(bucket: "metricas-servidores")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "cpu_usage")
  |> filter(fn: (r) => r.host == "web-01")
EOF

# Consulta con agregación
influx query << 'EOF'
// Media de CPU por host en la última hora, agrupada por 5 minutos
from(bucket: "metricas-servidores")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu_usage")
  |> aggregateWindow(every: 5m, fn: mean, createEmpty: false)
  |> group(columns: ["host"])
  |> yield(name: "media_cpu")
EOF

# Detectar anomalías (valores fuera de rango)
influx query << 'EOF'
// Alertar cuando la temperatura supera 30 grados
from(bucket: "sensores-iot")
  |> range(start: -10m)
  |> filter(fn: (r) => r._measurement == "temperatura")
  |> filter(fn: (r) => r._value > 30.0)
  |> yield(name: "temperaturas_altas")
EOF

# Unir datos de diferentes mediciones
influx query << 'EOF'
cpu = from(bucket: "metricas-servidores")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu_usage")
  |> aggregateWindow(every: 1m, fn: mean)

memoria = from(bucket: "metricas-servidores")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "memoria_libre")
  |> aggregateWindow(every: 1m, fn: mean)

join(
  tables: {cpu: cpu, memoria: memoria},
  on: ["_time", "host"]
)
EOF

Integración con Telegraf

Telegraf es el agente de recolección de métricas de InfluxData:

# Instalar Telegraf
sudo apt-get install -y telegraf

# Configuración básica de Telegraf
sudo cat > /etc/telegraf/telegraf.conf << 'EOF'
# ================================================================
# Configuración de Telegraf para InfluxDB 2.x
# ================================================================

[global_tags]
  entorno = "produccion"
  datacenter = "eu-west"

[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

# ---- SALIDA: InfluxDB 2.x ----
[[outputs.influxdb_v2]]
  urls = ["http://127.0.0.1:8086"]
  token = "TOKEN_DE_ESCRITURA_AQUI"
  organization = "mi-organizacion"
  bucket = "metricas-servidores"

# ---- ENTRADAS: Métricas del sistema ----
[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false

[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

[[inputs.diskio]]

[[inputs.mem]]

[[inputs.net]]
  interfaces = ["eth0", "eth1"]

[[inputs.netstat]]

[[inputs.processes]]

[[inputs.swap]]

[[inputs.system]]

# ---- NGINX: Métricas del servidor web ----
[[inputs.nginx]]
  urls = ["http://127.0.0.1:8080/nginx_status"]

# ---- MYSQL: Métricas de la base de datos ----
# [[inputs.mysql]]
#   servers = ["user:password@tcp(127.0.0.1:3306)/"]

EOF

sudo systemctl enable telegraf
sudo systemctl start telegraf

# Verificar que Telegraf envía datos
sudo journalctl -u telegraf -f --no-pager

Políticas de Retención

Gestionar la retención de datos en InfluxDB 2.x:

# Ver políticas de retención de los buckets
influx bucket list

# Actualizar la retención de un bucket existente
influx bucket update \
    --id BUCKET_ID \
    --retention 60d

# Estrategia de downsampling: mantener datos históricos con menor resolución
# Crear tarea Flux para agregar datos antiguos

influx task create \
    --org mi-organizacion \
    --name "downsampling-metricas" << 'EOF'
// Tarea de downsampling: cada hora, agregar datos de la última hora en resolución de 5 minutos
// y guardarlos en el bucket de largo plazo

option task = {name: "downsampling-metricas", every: 1h}

data = from(bucket: "metricas-servidores")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "cpu_usage" or r._measurement == "memoria_libre")
  |> aggregateWindow(every: 5m, fn: mean, createEmpty: false)

data
  |> to(bucket: "datos-historicos", org: "mi-organizacion")
EOF

# Listar tareas configuradas
influx task list

# Ver logs de ejecución de una tarea
influx task log list --task-id TASK_ID

Backup y Restauración

# Crear backup completo
influx backup \
    --host http://localhost:8086 \
    --token "TOKEN_ADMIN" \
    /opt/backups/influxdb-$(date +%Y%m%d)

# Backup de un bucket específico
influx backup \
    --host http://localhost:8086 \
    --token "TOKEN_ADMIN" \
    --bucket metricas-servidores \
    /opt/backups/influxdb-metricas-$(date +%Y%m%d)

# Restaurar desde backup
influx restore \
    --host http://localhost:8086 \
    --token "TOKEN_ADMIN" \
    --full \
    /opt/backups/influxdb-20240315

# Script de backup automático
cat > /usr/local/bin/backup-influxdb.sh << 'EOF'
#!/bin/bash
# Backup automático de InfluxDB

BACKUP_DIR="/opt/backups/influxdb"
TOKEN="TOKEN_ADMIN"
RETENTION_DAYS=30

mkdir -p "$BACKUP_DIR"

FECHA=$(date +%Y%m%d-%H%M%S)

# Crear backup
influx backup \
    --host http://localhost:8086 \
    --token "$TOKEN" \
    "$BACKUP_DIR/$FECHA"

# Comprimir
tar -czf "$BACKUP_DIR/${FECHA}.tar.gz" -C "$BACKUP_DIR" "$FECHA"
rm -rf "$BACKUP_DIR/$FECHA"

# Eliminar backups antiguos
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

echo "Backup completado: ${FECHA}.tar.gz"
EOF

chmod +x /usr/local/bin/backup-influxdb.sh
echo "0 2 * * * root /usr/local/bin/backup-influxdb.sh" | sudo tee /etc/cron.d/influxdb-backup

Visualización con Grafana

Conectar InfluxDB con Grafana para dashboards:

# Instalar Grafana
sudo apt-get install -y apt-transport-https software-properties-common
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update && sudo apt-get install -y grafana

sudo systemctl enable grafana-server
sudo systemctl start grafana-server

# En Grafana (http://localhost:3000):
# 1. Ir a Configuration > Data Sources > Add data source
# 2. Seleccionar "InfluxDB"
# 3. Configurar:
#    - Query Language: Flux
#    - URL: http://localhost:8086
#    - Organization: mi-organizacion
#    - Token: [token de solo lectura]
#    - Default Bucket: metricas-servidores

# Crear token de solo lectura para Grafana
influx auth create \
    --org mi-organizacion \
    --description "Token lectura para Grafana" \
    --read-buckets

Solución de Problemas

InfluxDB no arranca (error de permisos):

sudo chown -R influxdb:influxdb /var/lib/influxdb2
sudo systemctl restart influxdb
sudo journalctl -u influxdb -n 50

Escrituras lentas o rechazadas:

# Verificar el estado del servidor
influx ping

# Ver estadísticas de escritura
influx query << 'EOF'
from(bucket: "_monitoring")
  |> range(start: -10m)
  |> filter(fn: (r) => r._measurement == "influxdb_write")
EOF

# Verificar espacio en disco
df -h /var/lib/influxdb2

Consultas lentas:

# Reducir el rango temporal de las consultas
# Añadir más filtros para reducir datos escaneados
# Usar aggregateWindow para reducir puntos devueltos

# Ver las consultas activas
influx query << 'EOF'
from(bucket: "_monitoring")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "influxdb_query")
  |> sort(columns: ["duration_ns"], desc: true)
  |> limit(n: 10)
EOF

Conclusión

InfluxDB 2.x establece el estándar para bases de datos de series temporales con su combinación de alto rendimiento de escritura, lenguaje Flux para consultas analíticas complejas, y políticas de retención integradas que simplifican la gestión del ciclo de vida de los datos. La integración nativa con Telegraf para recolección de métricas y con Grafana para visualización forma un stack completo de observabilidad que cubre desde métricas de infraestructura hasta datos de sensores IoT con una configuración mínima.