Recensione di Amazon Neptune: un database grafico scalabile per OLTP

I database di grafici, come Neo4j, Apache Spark GraphX, DataStax Enterprise Graph, IBM Graph, JanusGraph, TigerGraph, AnzoGraph, la porzione di grafico di Azure Cosmos DB e l'oggetto di questa recensione, Amazon Neptune, sono utili per diversi tipi di applicazioni che coinvolgono set di dati altamente connessi, come fornire consigli basati su grafici sociali, eseguire il rilevamento di frodi, fornire consigli sui prodotti in tempo reale e rilevare incursioni nelle operazioni di rete e IT. Si tratta di aree in cui i database relazionali tradizionali tendono a diventare inefficienti e lenti a causa della necessità di join SQL complessi che operano su set di dati di grandi dimensioni.

Neptune è un servizio di database a grafo completamente gestito con proprietà ACID e consistenza immediata, che ha al centro un motore di database a grafo appositamente costruito e ad alte prestazioni ottimizzato per memorizzare miliardi di relazioni e interrogare il grafico con una latenza di millisecondi. Neptune supporta due dei più popolari linguaggi di query a grafo open source, Apache TinkerPop Gremlin e W3C SPARQL. Il popolare Cypher Query Language (CQL) utilizzato in Neo4j è iniziato come proprietario, ma in seguito è diventato open source.

Gremlin e SPARQL gestiscono diversi tipi di database a grafo. Gremlin, come CQL, è per database di grafi di proprietà; SPARQL è per tripli Resource Description Framework (RDF), progettato per il web. Gremlin è un linguaggio di attraversamento grafico; SPARQL è un linguaggio di query con clausole SELECT e WHERE.

L'implementazione di Amazon Neptune consente entrambi i linguaggi Gremlin e SPARQL in una singola istanza di database, ma non possono vedere i dati l'uno dell'altro. Il motivo per consentire entrambi è consentire ai nuovi utenti di capire quale funziona meglio per le loro esigenze.

La documentazione di Nettuno contiene esempi che utilizzano le varianti Gremlin-Groovy, Gremlin-Java e Gremlin-Python di Gremlin. Neptune consente a Gremlin nella console, chiamate HTTP REST, programmi Java, Python, .Net e Node.js. Sul lato SPARQL, Neptune supporta la console e il workbench Eclipse RDF4J, chiamate HTTP REST e programmi Java.

Caratteristiche e vantaggi di Amazon Neptune

Essendo un database a grafo transazionale completamente gestito come servizio, Amazon Neptune non solo offre libertà dalla necessità di mantenere l'hardware e il software del database, ma offre anche una facile scalabilità, una disponibilità superiore al 99,99% e più livelli di sicurezza. I cluster di database Neptune possono avere fino a 64 TB di archiviazione con scalabilità automatica in sei repliche dei dati su tre zone di disponibilità e più se si abilita l'alta disponibilità utilizzando repliche di lettura in zone aggiuntive.

Il livello di archiviazione dei dati di Neptune è supportato da SSD, tolleranza agli errori e autoriparazione. Gli errori del disco vengono riparati in background senza perdita di disponibilità del database. Neptune rileva automaticamente gli arresti anomali del database e si riavvia, in genere in 30 secondi o meno, senza la necessità di eseguire il ripristino di arresto anomalo o di ricostruire la cache del database, poiché la cache è isolata dai processi del database e può sopravvivere a un riavvio. Se un'intera istanza primaria non riesce, Neptune eseguirà automaticamente il failover su una delle massimo 15 repliche di lettura. I backup vengono continuamente trasmessi in streaming a S3.

Puoi scalare i cluster di Amazon Neptune su e giù modificando le istanze o (per evitare tempi di inattività) aggiungendo un'istanza della dimensione desiderata e spegnendo la vecchia istanza una volta che una copia dei dati è stata migrata e hai promosso la nuova istanza a primario. Le dimensioni delle istanze VM di Neptune variano da db.r4.large (due vCPU e 16 GiB di RAM) a db.r4.16xlarge (64 vCPU e 488 GiB di RAM).

Amazon Neptune implementa la sicurezza eseguendo il motore in una rete VPC (virtual private cloud) e facoltativamente crittografando i dati inattivi utilizzando AWS Key Management Service. Oltre a crittografare lo storage sottostante, Neptune crittografa anche i backup, gli snapshot e le repliche. Nettuno può essere utilizzato nelle applicazioni HIPAA. Nettuno non richiede la creazione di indici specifici per ottenere buone prestazioni di query, il che è un gradito cambiamento rispetto al bilanciamento delle prestazioni di query e scrittura mediante un'attenta regolazione degli indici.

Amazon Neptune non supporta algoritmi di query analitica, come PageRank, presenti in altri database a grafo, come Neo4j, TigerGraph e AnzoGraph. Neptune è concepito per essere un database a grafo transazionale a bassa latenza (OLTP) per enormi set di dati, non un database analitico (OLAP) e semplicemente non è ottimizzato per casi d'uso analitici o query che coinvolgono più di tre hop e il PageRank tocca ogni elemento nel database.

Amazon Neptune supporta gli aggregati, quindi può fare una piccola analisi, ma non molto. Come Nettuno, anche Neo4j era originariamente concepito per essere utilizzato per OLTP, ma ha aggiunto una libreria di query analitiche nel 2017. Il fatto che le capacità di analisi siano limitate in Nettuno non è necessariamente un motivo per escluderlo, in quanto database OLTP a bassa latenza con repliche di lettura distribuite a livello globale e la capacità di gestire 64 TB di dati non è nulla di cui starnutire.

Inizia con Amazon Neptune

Puoi avviare un cluster Amazon Neptune in due modi: direttamente dalla console Amazon Neptune o utilizzando un modello AWS CloudFormation per creare uno stack Neptune. Tieni presente che il modello CloudFormation fornito non è adatto per la produzione, poiché non è molto sicuro: è inteso come base per un tutorial.

Puoi avviare in piccolo e aggiungere capacità (VM più grandi o più repliche di lettura) ogni volta che la tua applicazione lo richiede. Lo spazio di archiviazione cresce automaticamente e paghi solo per lo spazio di archiviazione che utilizzi.

Nelle schermate seguenti, mostro parte del ciclo di vita di un'immagine di Nettuno creata dalla console di Nettuno. Comincio con la creazione di un cluster.

Desideri un'elevata disponibilità per il tuo cluster? Non è affatto difficile.

Nelle impostazioni avanzate ci sono più pannelli. Fortunatamente, la maggior parte delle impostazioni predefinite dovrebbe soddisfare le tue esigenze.

Infine, vedrai un avviso prima di premere il pulsante per avviare il database. Se hai davvero bisogno di vedere la spiegazione, fai clic con il pulsante destro del mouse sul collegamento e visualizzalo in un'altra scheda. (Spero che questo bug venga corretto.)

Una volta che hai un cluster funzionante, puoi eseguire diverse azioni sulle istanze.

A livello di cluster, puoi visualizzare un riepilogo.

A livello di istanza puoi vedere i grafici delle prestazioni.

Caricamento dei dati in Amazon Neptune

Per caricare i dati in Amazon Neptune, devi prima caricare i file in Amazon S3 in uno dei formati corretti: CSV per Gremlin e triple, quad, RDF / XML o Turtle per RDF. Il caricatore supporta la compressione gzip di singoli file.

Dovrai creare un ruolo IAM e un endpoint VPC S3 per concedere a Neptune l'autorizzazione ad accedere al tuo bucket S3 a meno che non siano già stati creati, ad esempio da un modello CloudFormation. Esiste un'API del caricatore Neptune richiamabile tramite un endpoint REST (ad esempio da un comando curl) che può assumere il ruolo IAM e caricare in blocco i dati nel cluster. C'è anche un convertitore per GraphML in CSV su GitHub. La procedura dettagliata per il caricamento dei dati è per qualsiasi formato di dati supportato.

Interroga Amazon Neptune con Gremlin

Puoi utilizzare la console Gremlin e un endpoint REST per connetterti e interrogare le tue istanze Amazon Neptune in Gremlin da una VM EC2 nello stesso VPC del database. Più utile per le applicazioni, puoi interrogare Nettuno usando Gremlin in Java, Python, .Net e Node.js.

C'è un intero libro su Gremlin, Practical Gremlin: An Apache TinkerPop Tutorial , di Kelvin Lawrence. Il libro utilizza TinkerGraph per il suo database, ma la stessa sintassi di Gremlin funziona per Nettuno con piccole eccezioni documentate da Amazon.

Le query di Gremlin descrivono come navigare tra i vertici e i bordi del grafico. Un esempio per il database delle rotte aeree discusso nel libro trova tutti i modi per volare da Austin, Texas (codice aeroporto AUS) ad Agra, India (codice aeroporto AGR) con due fermate:

gV (). has ('code', 'AUS'). repeat (out ()). times (3). has ('code', 'AGR'). path (). by ('code')

Se vuoi provare gli esempi nel libro su Amazon Neptune, devi prima copiare i file CSV di edge e nodi in un bucket S3 utilizzando il comando cp di AWS CLI e caricare i dati da lì in Neptune.

Interroga Amazon Neptune con SPARQL

Puoi utilizzare la console RDF4J, il workbench RDF4J e un endpoint REST per connetterti e interrogare le tue istanze Amazon Neptune in SPARQL da una VM EC2 nello stesso VPC del database. Più utile per le applicazioni, puoi interrogare Nettuno usando SPARQL in Java. La specifica SPARQL 1.1 Query Language definisce come costruire le query. Se cerchi nel web "tutorial sparql" troverai una serie di tutorial scritti e video gratuiti sull'argomento. Dovrebbero funzionare tutti con Neptune una volta caricati i dati.

SPARQL assomiglia meno al codice funzionale di Gremlin e più simile a SQL. Per esempio:

SELEZIONA? Prenota? Chi

WHERE {? Book dc: creator? Who}

Prestazioni e scalabilità di Amazon Neptune

Amazon Neptune è stato progettato per query con grafi a bassa latenza fino a tre hop su database di grandi dimensioni (fino a 64 TB). Supporta fino a 15 repliche di lettura a bassa latenza in tre zone di disponibilità per scalare la capacità di lettura e, secondo Amazon, può eseguire più di 100.000 query di grafici al secondo.

Le dimensioni delle sue istanze vanno da due a 64 vCPU con 15 GiB a 488 GiB di RAM, raddoppiando approssimativamente entrambe ad ogni passaggio. Al massimo, Neptune può utilizzare 64 vCPU per 16 istanze per un totale di 1024 vCPU e 488 GiB di RAM per 16 istanze per un totale di 7808 GiB di RAM. Si tratta di una crescita in scala complessiva possibile di 512 volte, considerando sia la dimensione dell'istanza che il numero di repliche di lettura. I costi tengono traccia della scalabilità delle risorse più o meno esattamente.

Se stai cercando un database a grafo transazionale come servizio, Amazon Neptune è una scelta praticabile. Dato che Neptune supporta entrambi i linguaggi di query Gremlin e SPARQL, dovresti essere in grado di trovare sviluppatori per creare applicazioni per esso. D'altra parte, la mancanza di supporto Cypher da parte di Neptune potrebbe scoraggiare gli utenti Neo4j esistenti e la sua mancanza di supporto OLAP e algoritmo grafico scoraggerà le persone che desiderano un unico database a grafo per transazioni e analisi.

L'ampia gamma di capacità di Amazon Neptune (fino a dimensioni 16x e 16 istanze), l'elevata velocità massima di transazione (100.000 query al secondo) e i prezzi con pagamento in base al consumo dovrebbero soddisfare la maggior parte dei requisiti aziendali. Tuttavia, la sua mancanza di opzioni in loco potrebbe precluderne l'utilizzo presso aziende con politiche contro l'inserimento dei propri dati sensibili nel cloud e aziende che preferiscono sostenere e annotare le spese di capitale rispetto alle spese operative correnti.

-

Costo: da $ 0,348 a $ 5,568 per ora di istanza a seconda della dimensione dell'istanza, 0,10 $ per GB al mese per l'archiviazione, $ 0,20 per milione di richieste I / O, $ 0,023 per GB al mese per l'archiviazione di backup, $ 0,12 per GB per il trasferimento dei dati in uscita; si applicano varie riduzioni di prezzo. 

Piattaforma: Amazon Web Services; supporta le query Apache TinkerPop Gremlin o SPARQL; accesso tramite la console AWS, HTTP REST e Java, nonché RDF4J Workbench (SPARQL) e Python, .Net e Node.js (Gremlin).