Objetivos
Material requerido.
Una Raspberry Pi | |
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:
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:
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
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:
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
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
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:
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
Ahora que tenemos unos cuantos puntos metidos podemos ver como interrogar a Influx sobre ellos. Por ejemplo:
select * from temperatura
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
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'
Las Strings entre comillas dobles no funcionan:
select value from temperatura where location="cocina"
También podemos buscar solo los valores como:
SELECT value FROM temperatura WHERE location='salon'
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
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
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:
Podemos hacerlo de dos modos. Estando ya dentro con el comando auth y el usuario admin que creamos más arriba:
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:
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.