Negli ultimi anni, abbiamo assistito ad un sempre maggiore interesse verso le tecnologie NoSQL, ovvero quelle tecnologie di database non relazionali, che permettono di memorizzare i dati utilizzando tecniche non convenzionali, e che tipicamente supportano una strutturazione molto meno stringente. MongoDB, Redis, OrientDB e Neo4j sono solo alcune di queste tecnologie (ampiamente trattate su HTML.it), che spesso vengono anche associate a tutti quegli ambiti applicativi in cui è necessario gestire grandi moli di dati. Tra questi, uno dei più interessanti è quello dell'Internet of Things (IoT), la cui definizione più generalmente accettata è quella di una interconnessione tra oggetti comuni, che diventano quindi sensori in grado di comunicare tra loro, fornendo dati tipicamente eterogenei ed in grandi quantità.
Per ragioni più di marketing che pratiche, la gestione dei dati provenienti da applicazioni di IoT è spesso considerata più affidabile e consona se basata sull'uso di tecnologie NoSQL. Tuttavia, con qualche opportuno accorgimento, è comunque possibile continuare ad utilizzare il proprio database relazione preferito senza che ciò comporti svantaggi significativi. Basandoci quindi su alcune considerazioni di Maria Colgan, master product manager ad Oracle, in questo articolo vedremo quali accorgimenti possono permetterci di utilizzare un database relazionale anche per la gestione dell'IoT e dei dati derivanti da queste applicazioni.
Secondo Colgan, moltissimi utenti di Oracle di fatto riescono a gestire correttamente il flusso di dati provenienti da applicazioni di IoT, grazie ad una opportuna ottimizzazione di soluzioni relazionali. I concetti chiave necessari per tale scopo sono scalabilità, flessibilità e analisi in tempo reale. Vediamo, nello specifico, in cosa consiste l'implementazione di tali concetti su un database relazionale.
Scalabilità
La scalabilità è la capacità di un sistema di fornire un throughput che sia proporzionale alle risorse hardware disponibili, rimanendo inoltre limitato unicamente da esse. In genere, le configurazioni che permettono di garantire un'alto livello di scalabilità consistono nell'uso di cluster e sharding, funzionalità abbastanza avanzate ma supportate da tutti i principali DBMS relazionali.
I cluster permettono di eseguire un database su un pool di server opportunamente interconnessi. Su HTML.it, abbiamo visto come realizzare una configurazione di questo tipo mediante MySQL, di fatto offrendo una serie di vantaggi che includono il load balancing, la possibilità di distribuire geograficamente il database (un grande vantaggio per il disaster recovery), e la capacità di garantire una alta affidabilità. Con i cluster è inoltre possibile aggiungere nuovi nodi cluster in qualsiasi momento (ad esempio al fine di aumentare la capacità computazionale), rendendo appunto scalabile la soluzione, che continuerà ad essere eseguita senza alcun tipo di interruzione. In ambiente Oracle, un concetto simile (e per certi versi forse ancora più funzionale) è legato all'uso dei Real Application Clusters (RAC).
Lo sharding, invece, permette il partizionamento di un grande database in più database di grandezza inferiore. Ognuno di questi database più piccoli può essere quindi memorizzato in diverse unità di memorizzazione hardware (gli shard), e generalmente risulta di più semplice ed efficiente gestione. Ad esempio, possiamo assegnare uno shard ad una specifica classe di utenza, o ad una specifica classe di dati. Sarà quindi il DBMS a mettere correttamente in comunicazione la query con lo specifico shard.
Oggi, la maggior parte dei database che operano su grandi moli di dati forniscono opzioni per implementare lo sharding, inclusi MongoDB, Microsoft SQL Server e PostgreSQL. Tuttavia ciò può non essere sufficiente: oltre alla capacità di suddividere il database in shard, è altrettanto necessario permettere alle query di operare tra più shard, il che reduce significativamente i loro tempi di esecuzione.
Poiché nell'ambito dell'IoT il volume di dati è particolarmente elevato, tutte queste considerazioni passano ovviamente per la disponibilità di una banda di trasmissione sufficientemente elevate. Ciò deve essere garantito anche nell'interconnessione dei vari nodi che compongono un database distribuito, sia che esso usi i cluster o lo sharding.
Altri componenti importanti che permetto un elevato livello di scalabilità sono la possibilità di parallelizzare l'esecuzione delle query (sia di lettura che di scrittura), e l'utilizzo di tabelle esterne.
Flessibilità
La flessibilità è la capacità di un database di adattarsi rapidamente e in modo semplice ai cambiamenti che devono essere applicati alla strutturazione dei dati. Essendo l'ambito dell'IoT ancora particolarmente giovane, è facile che alcune scelte progettuali debbano essere riviste, per svariati motivi. In genere questa necessità è risolta sfruttando il linguaggio JSON (o, meno frequentemente, XML), che permette di aggiungere campi addizionali, risolvendo (seppur non nel modo più efficiente) il problema della strutturazione rigida dei database relazionali. Non è un caso, infatti, se questo tipo di dato è stato recentemente introdotto su MySQL, e può essere ugualmente utilizzato anche in altri DBMS.
Anche la possibilità di partizionare grandi volumi di dati è fondamentale. Questa caratteristica, infatti, consente di gestire agevolmente grandi volumi di dati, migliorando spesso le performance e garantendo un livello di trasparenza che è fondamentale dal punto di vista della applicazioni. I dati più storicamente datati (e quindi magari già analizzati, con conseguente minore necessità di accedervi più rapidamente) possono essere quindi partizionati, compressi e spostati in un'unità di storage meno efficiente e costosa. Ciò permette di effettuare il mining dei dati mantenendo un buon livello di efficienza, senza inficiare la velocità di risposta delle query real-time.
Analisi in tempo reale
Tutti questi escamotage per ottimizzare la gestione dei dati in termini di velocità di accesso, devono essere finalizzati alla possibilità di analizzare dati in tempo reale. Alla fine di ogni giornata, infatti, tutti i dati ricavati da dispositivi IoT devono essere aggregati. Ad esempio, una società potrà voler capire quali sono i prodotti più venduti nei vari reparti, e questi ultimi potrebbero essere organizzati in singoli shard. L'aggregazione ed analisi risulterebbe quindi più efficiente. In un altro esempio, una società di telecomunicazioni potrebbe sfruttare, al tempo stesso, sia lo sharding che il partizionamento, al fine di eliminare grosse quantità di dati dalla mole di dati oggetto di analisi, permettendo di rispondere alle esigenze dei clienti con la velocità che essi, opportunamente, richiedono.
Per aumentare la velocità di analisi, in genere, è fondamentale identificare questo genere di soluzioni, sfruttando il più possibile le caratteristiche fornite dai DBMS più recenti. Come già detto, ciò può essere realizzato anche con database relazionali.
Prima di concludere, segnaliamo un utile insieme di linee guida e best practices per la gestione ottimizzata di grandi moli di dati con database relazionali, redatto da Oracle e reso disponibile a chiunque sia interessato all'ambito dell'IoT.