bclose

Almacenando medidas: Influx DB

Bases de datos de series de tiempo TSDB

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..  

 

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.  

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):

Contenido solo disponible para suscriptores. ¡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

 

No Comments

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login