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.


