Amazon DynamoDB gestione di un database NoSQL in cloud
da Davide Riboldi · pubblicato il 11 agosto, 2014 · modificato il 19 febbraio, 2017

Il servizio di Amazon DynamoDB appartiene al gruppo dedicato ai database. La volta precedente abbiamo presentato Amazon RDS per i database relazionali e dato che il servizio di DynamoDB appartiene ai database NoSQL abbiamo voluto pubblicare anche un’articolo chiamato (Database NoSQL introduzione) per chiarire le differenze e le caratteristiche principali senza doverle riportare in questo articolo come introduzione.

Introduzione

Amazon DynamoDB mette a disposizione degli sviluppatori un servizio di database NoSQL che gestisce in maniera automatica tutti gli aspetti legati alle performance e alla scalabilità. È possibile creare diverse tabelle di database su cui memorizzare e leggere dati ad un velocità desiderata. Sarà il servizio di Amazon che gestirà automaticamente il numero dei server necessari alla nostra richiesta.

Tutte i dati vengono memorizzati su dischi (SSD) e duplicati automaticamente in tutte le zone di disponibilità presenti nella regione geografica. In questo modo si otterranno caratteristiche di high availability e data durability. È possibile aumentare la capacità di richiesta del database senza fasi di downtime e senza degradi nelle performance. Sarà anche possibile controllare costantemente tutte le risorse che vengono utilizzate tramite la management console e il servizio Amazon CloudWatch.

Caratteristiche

Gli sviluppatori possono creare tabelle di database senza porsi dei limiti di dimensione o velocità di accesso, sarà il servizio stesso a suddividere la tabelle nelle risorse necessarie e a preoccuparsi della continuità di servizio. Le caratteristiche principali collegate alle tabelle DynamoDB sono diverse, ne riporto alcune qui di seguito:

Provisioned Throughput: quando si crea una tabella bisogna specificare quante richieste al secondo dobbiamo gestire, su tutto il resto che riguarda i server necessari, la quantità di RAM, CPU, etc, viene gestito in automatico dal servizio. Usando le API o la management console potremmo cambiare queste caratteristiche quando lo desideriamo e il servizio DynamoDB applicherà le modifiche senza nessun downtime.

Automated Storage Scaling: la quantità di storage necessaria alla memorizzazione dei dati viene gestita dal servizio, non dobbiamo preoccuparci di allocare spazio anticipatamente ma abbiamo a disposizione uno spazio concettualmente infinito.

High performance: la latenza media del servizio DynamoDB viene indicata in pochissimi millisecondi, per garantire la massima velocità vengono utilizzate solo unità disco SSD a stato solido. In questa maniera può essere garantita anche la consistenza.

Easy Administration: non vengono mai richieste operazioni complesse per operare con questo servizio, lo sviluppatore deve solo creare le tabelle che gli interessano e scrivere le procedure di lettura e scrittura. Tutta la parte che riguarda configurazioni, patching, clustering e partitioning viene gestito in maniera del tutto trasparente.

Built-in Fault Tolerance: il servizio DynamoDB prevede al suo interno delle procedure di fault tolerance che sincronizzano e replicano le informazioni delle nostre tabelle in diverse zone di disponibilità presenti nella regione geografica selezionata. Tutto questo rendendo trasparenti eventuali guasti di macchine assegnate al nostro database.

Flessibile: essendo un sistema di database NoSQL non si ha a disposizione uno schema fisso, come ad esempio in un database MySQL, ma ogni elemento memorizzato nella tabella può avere differenti attributi. Sono permessi diversi tipi di dati, (stringhe, numeri, binari e sets) che hanno comunque dei limiti di dimensione.

Efficient Indexing: ogni elemento (item) presente in una tabella di DynamoDB viene identificato con una chiave primaria, questo permette sempre un’accesso efficiente e molto veloce. È possibile definire anche un’indice secondario su un’elemento che non ha chiave ed eseguire una ricerca (query) usando la chiave alternativa.

Costo efficiente: il servizio è studiato per mantenere un costo molto efficiente rispetto al workload necessario. È possibile anche usare il servizio in modalità free tier che permette di ottenere quasi 40 milioni di operazioni al mese gratuitamente. Rispetto ad un workload di un database relazionale il costo si abbassa in modo significativo.

Sicurezza: il servizio di DynamoDB mette a disposizione molte funzioni di sicurezza sia per quanto riguarda la crittografia che il metodo di autenticazione. È possibile usare il servizio di Amazon IAM e utilizzare gli accessi tramite organizzazione, ad esempio è possibile utilizzare gli account di Amazon, Google e Facebook.

Monitoraggio: è possibile tenere sotto controllo le risorse utilizzate dal servizio per le nostre tabelle sia tramite la management console che con le API. Possiamo definire delle metriche CloudWatch per tenere sotto controllo diverse misurazioni.

Integrazione Redshift: il servizio permette il caricamento dei dati presenti nelle nostre tabelle direttamente in Amazon Redshift, un gestore completo di warehouse. In questa maniera è possibile utilizzare un client SQL o uno strumento di business intelligence ed elaborare complesse query di analisi per i nostri dati.

Amazon Elastic MaReduce: il database di DynamoDB è integrato anche con il servizio di Elastic MapReduce che permette l’elaborazione di complesse analisi su una grande molte di dati, usando un framework come quello di Hadoop. Amazon EMR può essere utilizzato anche per leggere un’ambiente misto di database relazionali e NoSQL.

Concetti generali

Il servizio di database Amazon DynamoDB include i concetti di tabelle, elementi (items) e attributi, un database è una collezione di tabelle, una tabella è una collezione di items e un item è una collezione di attributi. In un database relazionale la tabella è creata in base ad uno schema fisso che contiene una chiave primaria e una lista di colonne, tutti i record memorizzati conterranno sempre questo schema.

In DynamoDB, eccetto che per la chiave primaria, ogni elemento può avere uno schema proprio e una lista di attributi differenti. Ogni elemento può occupare al massimo 64KB e il formato dei dati deve essere binario o in codifica UTF-8. Ogni attributo legato ad un’elemento deve essere indicato come (key,value), quest’ultimo può essere indicato in due modi diversi, il primo è chiamato single-valued e l’altro multi-valued set.

// Record (1) Il campo Id è la chiave primaria, il codice
// ISBN è single-valued e Authors è un multi-valued set.
{
  Id : "101",
  ProductName : "Titolo del libro",
  ISBN : "111-1111111111",
  Authors : ["Author 1","Author 2"],
  Price : "50",
  Dimensions : "8.5 x 11.0 x 0.5",
  PageCount : "500",
  InPublication : "1",
  ProductCategory : "Book"
}

// Record (2) La chiave è obbligatoria ma gli altri
// elementi come potete notare possono essere diversi.
{
  Id : "201",
  ProductName : "Bicicletta",
  Description : "Mountain Bike PRO",
  BicycleType : "Road",
  Brand : "Brand-Company A",
  Price : "100",
  Gender : "M",
  Color : ["Red","Black"],
  ProductCategory : "Bike"
}

Sicuramente avrete notato che nei due record ci sono elementi diversi, ricordarsi che a differenza di una tabella relazionale non dobbiamo specificare i campi senza valore, infatti in DynamoDB non sono ammessi items con valori nulli o stringhe vuote.

Primary Key: in DynamoDB quando viene creata una tabella bisogna indicare una chiave primaria. Il servizio supporta due tipologie di chiavi: la Hash Key che viene associata ad un’attributo e creata in modo non-ordinato e la Hash Range Key la quale è composta da un’attributo Hash e uno Range, il primo è di tipo non-ordinato mentre il secondo è di tipo ordinato rispetto alla chiave primaria.

Table Name Primary Key Hash Attribute Range Attribute
Forum ( Name, … ) Hash Name
Thread (Forum, Subject, … ) Hash/Range Forum Subject
Reply ( Id, ReplyDate, … ) Hash/Range Id ReplyDate

Secondary index: quando viene creata una tabella con una chiave Hash & Range è anche possibile definire uno o più indici secondari. Un’indice secondario permette di eseguire delle query sulle tabelle, usando una chiave alternativa rispetto alla chiave primaria. Amazon DynamoDB supporta due tipi di indici chiamati Local & Global.

Operazioni sul database

Il servizio di DynamoDB mette a disposizione tutti gli strumenti necessari alla gestione completa di un database NoSQL. È possibile usare comandi a livello di tabella o di item, eseguire comandi di Query e Scan, configurare le operazioni di consistenza e impostare le modifiche condizionali. Vi riporto una piccola descrizione qui di seguito:

Operazioni Tabelle: il servizio mette a disposizione per le tabelle le operazioni classiche di creazione. modifica e cancellazione. Ad esempio dopo la creazione di una tabella è possibile usare l’operazione UpdateTable per aumentare e diminuire le performance del database secondo le nuove esigenze. Possiamo usare l’operazione DescribeTable per ottenere informazioni sullo stato della tabella, le caratteristiche della chiave primaria e le informazioni sulla creazione. È possibile anche utilizzare l’operazione ListTables per ottenere l’elenco di tutte le tabelle associate al nostro account AWS.

Operazioni Items: tramite le operazioni degli items possiamo aggiungere, modificare e rimuovere gli elementi da una tabella. Ad esempio l’operazione UpdateItem permette di modificare il valore di un’attributo, aggiungerne uno nuovo o cancellarlo. È possibile anche elaborare una condizione per la modifica, ad esempio modificare solo gli elementi che hanno un prezzo di 20$. DynamoDB mette a disposizione anche GetItem per leggere un singolo elemento e BatchGetItem per leggere degli elementi multipli.

Query e Scan: queste operazioni usano gli attributi Hash e volendo anche quelli Range. La query è permessa su tabelle che hanno un hash/range key o una chiave secondaria. L’operazione di Scan è usata su una query o su un’indice secondario, questa operazione può consumare molte risorse e bisogna usarla quando necessario.

Data Read and Consistency: il servizio DynamoDB mantiene più copie di ogni elemento per garantire la durabilità del dato. Quando si riceve la risposta di “operazione riuscita” durante una richiesta di scrittura, DynamoDB si assicura che il dato venga salvato su più server. Tuttavia, dato che ci vuole comunque del tempo affinché l’aggiornamento si propaghi a tutte le copie, questo può portare ai cosiddetti problemi di consistenza.

Quando si parla di dati “eventually consistent“, significa che una richiesta di lettura eseguita subito dopo un’operazione di scrittura potrebbe non mostrare il cambiamento più recente effettuato. Per andare incontro alle varie esigenze applicative, DynamoDB supporta sia “eventually consistent” che “strongly consistent”.

Conditional Updates: DynamoDB supporta una “condizione di scrittura” che è possibile specificare quando viene aggiornato un’elemento della tabella. Il servizio a fronte di una richiesta di modifica eseguirà l’operazione solo se viene soddisfatta la condizione, in caso contrario viene generato un messaggio di errore. Il servizio di DynamoDB supporta anche la funzione di “atomic counter” che serve per incrementare o decrementare un valore evitando la possibilità e la condizione di sovrapposizione.

Creazione di una tabella

Dato che questo articolo è stato dedicato all’introduzione di DynamoDB, vedremo solo come creare una tabella usando la management console e quali sono i strumenti messi a disposizione, rimanderemo tutti gli aspetti specifici ad articoli futuri in cui verranno presentati dei mini tutorial e dove approfondiremo la parte di sviluppo.

Per prima cosa colleghiamoci alla nostra management console e selezioniamo il servizio di Amazon DynamoDB (controllare anche la regione geografica), una volta visualizzata la dashboard del servizio eseguiamo il comando “create table” e inseriamo i parametri richiesti: Il nome della tabella e le caratteristiche della chiave.

Amazon Dynamodb

Una volta inseriti i parametri richiesti andiamo avanti e inseriamo i valori per eventuali indici secondari, per fare le prime prove possiamo saltare questa sezione, la quale viene indicata come (opzionale) e quindi possiamo passare direttamente alla schermata che riguarda il Throughput Capacity, dove dovremmo specificare la capacità delle letture e scritture per secondo che sono necessarie alla nostra applicazione.

Amazon Dynamodb

Al momento possiamo lasciare questi parametri, in quanto stiamo verificando solo le fasi che riguardano la creazione di una tabella, però se volete disegnare un database per la produzione è bene imparare a calcolare la capacità necessaria. Come già detto, approfondiremo questi argomenti in articoli più dettagliati ma al momento se volete avere informazioni aggiuntive andate sulla documentazione ufficiale.

Una volta confermati i valori di Throughput Capacity ci verrà presentata una schermata in cui possiamo attivare un’allarme collegato all’utilizzo delle risorse DynamoDB, infatti quando verrà sorpassata una percentuale indicata (80% per default) di risorse occupate saremmo avvisati tramite un messaggio di posta. Per concludere dobbiamo confermare la schermata del Summary e attendere la creazione della tabella.

Una volta conclusa la creazione della tabella è possibile eseguire diverse operazioni dalla console senza dover scrivere alcun programma, possiamo vedere il contenuto, eseguire funzioni di import/export, eseguire delle query e cambiare la configurazione generale. Ovviamente per sfruttare il database bisognerà integrarlo nel proprio applicativo tramite i vari SDK. Su questo Amazon mette a disposizione una buona documentazione, ad esempio su PHP potete vedere: Amazon SDK PHP.

Guida completa su AWS

Questo articolo appartiene ad una serie di pubblicazioni che costituiscono una guida completa dedicata agli Amazon Web Services.  Molti servizi che trattiamo in questo blog vengono anche spiegati con dei video che trovate nel nostro canale youtube. Se volete seguire questo percorso didattico iscrivetevi alla community Cloud AWS.

1 Commento

  1. Ciao Davide, stavo rileggendo questo vecchio articolo per cercare alcune cose che non ricordavo bene. Dato che sto facendo un piccolo progetto in cui voglio usare DynamoDB sarebbe forse l'occasione buona anche per scrivere un articolo con la presentazione di un mini tutorial ...

condividi