Almacenando medidas: Influx DB

Objetivos

 

  • Veremos que son las BDs de series de datos TSDB.
  • Presentaremos e instalaremos Influx DB.
  • Veremos los primeros comandos basicos.
  • Veremos como requerir usuario contraseña para entrar.  

    Material requerido.

     

     Vista mayor  Una Raspberry Pi
    personal computer  Un PC

     

    Bases de datos de series temporales

     

    En las sesiones previas hemos definido un broker MQTT para centralizar la gestión de los sensores que nos envían información y vimos también un ejemplo de unos ESP32 que nos enviaba lecturas simuladas  de CO2 al Mosquitto, que puede rebotarnos esas mediadas a nuestro sistema si suscribíamos unas determinadas publicaciones.

    Pero el Mosquito no dispone de una base de datos interna que almacene esas lecturas de sensores y si queremos guardarlas a largo plazo para, por ejemplo, hacer estadísticas o graficas de evolución a lo largo del tiempo, necesitaremos almacenarlas en una base de datos externa que las conserve.

    En un primer acercamiento podríamos pensar en usar Bases de datos tradicionales como SQL server, SQLite o MySQL y no sería disparatado, pero si lo que queremos guardar son series de lecturas que se producen en momentos concretos, no es muy buena idea usar BBDD que se diseñaron y pensaron para registros bancarios o interminables listas de pagos o personas, porque aunque parezca mentira, no somos los primeros que queremos guardar este tipo de datos con firma temporal, y gente mucho más lista que nosotros, le ha dado vueltas al tema, hasta llegar a la conclusión de que lo que necesitaban era una Time Series Data Base(TSDB) Y, lo que, es más, han desarrollado varias de este tipo de bases de datos en Open Source que podemos usar en nuestros proyectos.

    Las bases de datos transaccionales se desarrollaron básicamente para las necesidades bancarias con COBOL como su primer abanderado. Son magnificas y están muy afinadas para manejar los apuntes bancarios, listas de clientes, el censo de un país u operaciones de ventas y cobros, pero tienen un objetivo muy definido… que no es exactamente la problemática que vamos a tener nosotros, en cosas como lecturas masivas de cientos de sensores de un oleoducto por ejemplo o de valores de bolsa a lo largo del día, mes…. Etc.

    ¿Por qué no? ¿No valdría una tabla SQL de toda la vida para almacenar información de sensores? En realidad, sí. Podríamos cubrir el problema asíperfectamente, pero, en general, las Bases de datos SQL buscan conservar a toda costa los grandes volúmenes de información que generan las transacciones comerciales, mientras que los datos de bolsa instantáneos son más bien efímeros.

    Imagínate una aplicación que guarda los valores de las cotizadas en bolsa cada 5 segundos. En bolsa los datos de hoy y su variación a lo largo del día, son muy importantes para los analistas (Para decidir en que colocan la pasta) y lo mismo es cierto con los del ultimo mes y si me apuras hasta del ultimo año, pero lo cierto es que los valores instantáneos van caducando con rapidez y pronto no tienen sentido. Al cabo de un año, solo interesan los promedios estadísticos, pero no los valores instantáneos de un momento determinado del 15 de julio de 2019 a las 11:35 AM.

    Es decir, los valores que llevan sello de fecha/hora suelen caducar con rapidez y conservarlos tiene poco sentido, pero en cambio los movimientos bancarios de tu cuenta siguen teniendo importancia decisiva conservarlos, al menos durante los 5 años que legalmente te pueden exigir.

    En el caso de la IOT, donde manejaremos muchos sensores enviando datos instantáneos de digamos CO2, Temperatura y humedad, necesitan ser almacenados con su sello temporal para ver su evolución o sus tendencias, pero en unos pocos meses ya no será necesario conservar el dato concreto más allá de hacer unas estadísticas y por eso cuando el volumen de datos crece (Piensa en miles de sensores repartidos por las aulas del país un proceso industrial que toma muestras cada segundo) una tabla SQL resulta inadecuada porque por definición nos obliga a almacenar miles de datos instantáneos de digamos los últimos 5 años, lo que en general no tiene el menor sentido y ocupa un volumen descomunal de espacio en disco.

    Podrimos resumir que en general necesitaras una BBDD de series temporales si:

  • Cada registro en la BBDD tiene que tener su marca de tiempo y el sistema la tiene que anotar automáticamente siempre, sin excepsión.
  • La variable que registramos suele incluir metadatos: lugar, sensor, organización, además del valor.
  • Almacenaremos cantidades ingentes de datos de flujo rápido y que proceden de fuentes muy diversas y rara vez homogéneas.
  • Necesidad de conectar con sistemas de captación de datos estándar en el mercado MQTT, HTTP, JSON… etc.
  • Cada valor concreto o evento, tiene poco interés de por sí. Lo que nos interesa son las variaciones a lo largo del tiempo en oposición a las situaciones en las que cada línea tiene importancia intrínseca, una venta, por ejemplo.
  • El análisis de los datos se hace a largo plazo lo que determina decisivamente la forma de guardarlos y de gestionarlos..   [/fancy-ul] [/three-fourth]
  •  

     

    Influx DB TSDB en Raspberry Pi

     

    Una vez que os he pegado el rollo inicial de porque necesitamos una TSDB para nuestra IOT es el momento de ver una de ellas, Influx DB y como instalarla en nuestra Raspberry. ¿Por qué Influx y no otra? Bueno, la verdad es que uno no puede probar todas las que hay disponibles, e Influx tiene ciertas virtudes:

  • Es Open Source, aunque hay versiones corporativas de pago si necesitas escalar tu sistema.
  • Es muy conocida, recomendada y probada y además tiene una magnifica documentación.
  • Es rápida de empezar a enredar sin necesidad de estudiar como un perro manuales interminables.
  • Funciona en todas las plataformas: Linux, Raspberry Pi, Mac, Windows
  • Es de mi marca favorita: Gratis.   [/fancy-ul] [/three-fourth]
  •  

    Para instalar en nuestra Raspberry podemos seguir unos pasos sencillos. Empecemos actualizando el sistema (Para variar):

    sudo apt update
    sudo apt upgrade

    Ahora vamos a añadir los repositorios de Influx db a nuestra Raspi con uno de esos comando imposibles de recordar:

    wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
    source /etc/os-release 
    
    echo "deb https://repos.influxdata.com/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

    Ahora nos conviene volver a actualizar el sistema (Por si hubiera algo distinto en el nuevo repositorio) en instalar Influx DB con:

    sudo apt update
    sudo apt install influxdb

    Bien, al cabo de unos segundos tendrás instalada Influxdb en tu Raspberry. De nuevo, no queremos tener que arrancar a mano Influx cada vez que la necesitemos (Porque menuda cabeza tengo yo) por lo que conviene que la convirtamos en un servicio de arranque automático:

    sudo systemctl unmask influxdb.service
    sudo systemctl start influxdb
    sudo systemctl enable influxdb.service

    Y eso es todo. Ahora podemos comprobar que la instalación es correcta con:

    systemctl status influxdb
    
    

    indicador de que influx estas corriendo

    Fíjate que pone en verde, active(running)

     

    Primeros pasos con Influx DB

     

    Una de los motivos por los que mas me gusta de Influx, es que se puede empezar rápidamente creando bases de datos sin muchos conocimientos (Aunque como todo, al final, tendrás que meterle horas si quieres dominarla)

    Para empezar, podemos usar el intérprete de comandos Influx que nos permite usar comandos básicos desde la terminal (La maldición de Linux). Escribe

    influx

    Entraras en el CLI de Influx:

    Interprete de comando Influx

    Aquí ya nos informa de la versión en curso y de que esta corriendo en el puerto por defecto 8086 (Fácil de recordar para los que llevamos muchos años con los PC)

    El primer comando que vas a tener que aprender es “exit” que finaliza la sesión del interprete. Pruébalo y vuelve a entrar y así podemos seguir creando una base de datos de pruebas que voy a llamar prueba:

    create dabase prueba
    
    show databases

    muestra als BD dispooinibles en influx

    Yo tengo mas BBDD creadas, pero en tu caso y, si eres nuevo, verás la base de datos prueba e _internal (Que no deberías borrar porque es del sistema). Para usar la base de datos recién creada debemos hacer:

    use prueba

    Lo que significa que, a partir de ahora y hasta que salgamos, todas nuestras ordenes se refieren a esta BD. Nos toca definir usuarios en nuestra BD para poder al menos usar un control de user / pass por lo que podemos hacer (Fíjate en las comillas simples) para después darle todos los derechos en la BD:

    create user prueba with password ‘prueba’
    
    grant all on prueba to prueba

    Creando usuarios

    Ya tenemos creada nuestra BD Influx llamada prueba y un usuario llamado prueba al que hemos dado todos los derechos en ella, así que es el momento de ver lo más básico de como trabajar con la base de datos y para eso, nos toca ver un par de conceptos nuevos.

     

    Escribiendo y leyendo datos con Influx DB

    Las TSDB tiene su propio lenguaje o terminología, me imagino que, para diferenciarse de las SQL habituales, pero también porque conceptualmente son algo diferentes. Por eso, aquí nos se habla de registro sino de puntos o medidas, que siempre llevan una marca temporal que el sistema añade en automático.

    Los puntos llevan, además, un descriptor de la medida del tipo temperatura o humedad llamado Measurement, por lo menos un valor clave llamado field, la medida en si misma (Temperatura=21.3), y algún metadato llamado tag, que contiene cosas como la localización de la medida o su país o la planta en cuestión (región = ‘Spain’).

    Si estas acostumbrado a las BD SQL, puedes pensar que las medidas son una tabla en la que el índice primario es siempre el tiempo, y los Fields & tags son columnas donde los tags se indexan, pero los fields no. A diferencia de las tablas SQL, aquí no tienes que predefinir tablas ni índices ni cosas así. Las medidas o puntos que cumplen con la sintaxis se almacenan y listo (Al resto que las den y se ignoran con elegancia). Si quieres consultar el manual de Influx.

    Para ver como insertamos valores (puntos o medidas) en Influx DB, vamos a hacer un ejemplo simulando sensores de temperatura repartidos por casa, con nombre de la medida “temperatura”, un tag key que puede ser: sala, cocina, dormitorio…, y por último un valor de la medida o value. Prueba a escribir:

    insert temperatura,location=salon value =20

    Para que podamos mostrar cosas, nos conviene disponer de mas datos por lo que puedes meter valores al azar como estos por ejemplo:

  • Recuerda que la flecha arriba repite el ultimo comando.
  •  

    insert temperatura,location=salon value=20
    insert temperatura,location=salon value=22
    insert temperatura,location=salon value=24
    insert temperatura,location=salon value=2420
    insert temperatura,location=cocina value=23
    insert temperatura,location=cocina value=24
    
    insert temperatura,location=cocina value=25

    insertando valores manuales

    Ahora que tenemos unos cuantos puntos metidos podemos ver como interrogar a Influx sobre ellos. Por ejemplo:

    select * from temperatura

    ejemplo de select

    Donde puedes ver que la primera columna es la marca temporal en formato Unix. Por cierto, Influx distingue mayúsculas y minúsculas en los nombres (Pero no en los comandos) así que mucho cuidado al escribir por algo del tipo de estas líneas, que no devuelven nada, claro, pero tampoco devuelven error:

    select * from Temperatura
    
    select * from TEMPERATURA

    cuidado al escribir

    Normalmente, querremos especificar algún tag en nuestra consulta y para ello es importante que entiendas que los tags se guardan siempre como Strings por lo que deben ir entre comillas simples:

    select value from temperatura where location='salon'
    
    select value from temperatura where location='cocina'

    Select with tags

    Las Strings entre comillas dobles no funcionan:

    select value from temperatura where location="cocina"

    delimitacion correcta de string en influx

    También podemos buscar solo los valores como:

    SELECT value FROM temperatura WHERE location='salon'

    select con tags

     

    Añadiendo autentificación a Influx DB

     

     

    Hasta ahora hemos creado nuestro servidor Influx siguiendo la política de “Todo el mundo es bueno” pero la realidad es que dejar algo así abierto, es pedir a grites que te la líen si tu servidor está expuesto a internet. Por eso, vamos a continuación a establecer un mínimo de seguridad requiriendo usuario y contraseña para acceder a las BDs

    Para ello vamos crear un usuario admin con todos los derechos de administración en Influx (No seas melón y copies la línea sin más. Fíjate que tiene que poner tu propio pass):

    create user admin with password ‘tu password’ with all privileges

    Creando usuarios

    ya podemos salir de Influx con exit, y ahora, siguiendo la tradición Linuxera, tenemos que modificar a pelo un joído fichero de configuración de texto (Odio el nano, pero si a ti te gusta puedes usarlo):

    sudo mousepad/etc/influxdb/influxdb.conf

    Busca con [ctrl]+F la línea [HTTP] y cunado lo encuentras escribe debajo esto:

    auth-enabled = true
    
    pprof-enabled = true
    pprof-auth-enabled = true
    ping-auth-enabled = true

    ¡Accede al contenido!

    Salva el fichero y ahora tenemos que rearrancar el servicio InfluxDB para que los cambios entren en vigor:

    sudo systemctl restart influxdb

    Si ahora vas a la consola y entramos en Influx, si intentas ver la lista de bases de datos con ‘show databases”, recibiremos un bonito corte mangas, porque no nos hemos autenficado:

    error de acceso a influx

    Podemos hacerlo de dos modos. Estando ya dentro con el comando auth y el usuario admin que creamos más arriba:

    Usuario pass para influx

    O bien al entrar especificando usuario y pass:

    influx -username charly -password xxxxxx

    y ahora si que hará caso a las ordenes que hemos visto anteriormente:

    Pasando usuario por line de comandos

    Bueno, en esta sesión hemos visto como instalar InfluxDB y crear usuarios (Creamos prueba como usuario en la BD prueba) hemos vistos los conceptos básicos de como trabajar con Influx y por último como securizar el acceso a nuestra BD mediante usuario y contraseña. Naturalmente, solo hemos arañado la superficie de Influx y las TSDB en lo que se refiere a las búsquedas y como insertar puntos en la serie, pero lo poco que hemos visto, es suficiente para entender cómo vamos a hacer para insertar valores que nos lleguen desde MQTT en una BD Influx. Seguiremos en la próxima sesión.

    IMAGEN DE MARCA

    Deja una respuesta