Apache Cassandra è uno dei più diffusi sistemi di database distribuiti open source disponibili. È stato progettato con l'obiettivo di gestire grandi quantità di dati archiviati in molti server distribuiti su aree geografiche fornendo al tempo stesso elevata scalabilità e disponibilità senza un singolo punto di errore. I sistemi Cassandra possono estendersi su più data center, consentendo una bassa latenza per tutti i client connessi.
Questa è una serie di tutorial in tre parti in cui inizierò con le basi di Cassandra, utilizzando CQLSH per creare tabelle e record. Poi spiegherò i vari tipi di dati supportati da Cassandra, e poi useremo una libreria client Go per gestire le operazioni di Cassandra a livello di codice.
In questa prima parte illustrerò come il modello di dati di Cassandra è presentato in breve ed esegue operazioni di base utilizzando CQLSH.
Per questa serie di tutorial, presumo che i lettori siano in grado di installare Cassandra da soli sulle rispettive macchine in base al sistema operativo.
Il modello di dati di Cassandra segue l'approccio della famiglia di colonne, che può essere facilmente inteso come analogo alla struttura di una tabella relazionale, ma in modo NoSQL. La descrizione seguente dovrebbe essere più chiara:
Uno spazio delle chiavi può essere visto come il contenitore più esterno per i dati in Cassandra. Tutti i dati in Cassandra dovrebbero vivere all'interno di un keyspace. Può essere visto come un database in RDBMS che è una raccolta di tabelle. Nel caso di Cassandra, uno spazio delle chiavi è una raccolta di famiglie di colonne.
Una famiglia di colonne può essere vista come una raccolta di righe e ogni riga è una raccolta di colonne. È analogo a una tabella in RDBMS ma presenta alcune differenze. Le famiglie di colonne sono definite, ma non è necessario che ogni riga abbia tutte le colonne e le colonne possono essere aggiunte o rimosse da una riga come e quando richiesto.
La colonna è l'unità di base dei dati in Cassandra. Ha tre valori: nome della chiave o della colonna, valore della colonna e timestamp.
Una super colonna è un tipo speciale di colonna che memorizza una mappa di altre sottocolonne. Rende più facile la memorizzazione di dati complessi e rende anche il recupero dei dati più veloce in quanto ogni famiglia di colonne in Cassandra è memorizzata in un singolo file sul file system.
CQLSH è la shell standard per l'interazione con Cassandra tramite CQL (Cassandra Query Language). CQL è molto simile a SQL (che è usato principalmente per RDBMS) e quindi rende molto facile per gli sviluppatori nuovi a Cassandra lavorare rapidamente con esso. CQLSH viene fornito con ogni pacchetto Cassandra e dovrebbe essere già installato sul tuo computer quando hai installato Cassandra.
Come abbiamo visto nel modello di dati sopra descritto, a keyspace
è il contenitore più esterno e deve essere creato prima di ogni altra cosa. Per crearlo, esegui:
$ cqlsh localhost -e "CREATE KEYSPACE SE NON ESISTE k1 WITH replication = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;"
Nel comando precedente, ho assunto che la tua Cassandra esista localhost
senza alcuna autenticazione dell'utente. Ho creato un keyspace
chiamato k1
con replicazione
e durable_writes
politica definita.
Se hai definito l'autenticazione dell'utente, puoi eseguire:
$ cqlsh -u-p localhost -e "CREATE KEYSPACE SE NON ESISTE k1 WITH replication = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;"
Nel comando precedente, sostituire
e
con le tue credenziali di autenticazione.
Eseguire un comando come questo può essere un po 'macchinoso. Un altro modo è avviare il prompt CQLSH e quindi eseguire query direttamente al suo interno.
$ cqlsh -u-p localhost Connesso a Test Cluster su 127.0.0.1:9042. [cqlsh 5.0.1 | Cassandra 3.9 | Specifiche CQL 3.4.2 | Protocollo nativo v4] Utilizzare HELP per aiuto. cassandra @ cqlsh> CREATE KEYSPACE SE NON ESISTE k1 WITH replication = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;
Andando avanti, userò il metodo sopra riportato per eseguire le query. Prima di eseguire qualsiasi altra query, dobbiamo dire a CQLSH quale spazio delle chiavi dovrebbe essere usato.
cassandra @ cqlsh> USE k1; cassandra @ cqlsh: k1>
Il replication_factor
per uno spazio delle chiavi può essere modificato per soddisfare la quantità di replica necessaria per la replica classe
.
cassandra @ cqlsh: k1> ALTER KEYSPACE "k1" WITH REPLICATION = 'class': 'SimpleStrategy', 'replication_factor': 3;
Una tabella è equivalente a una famiglia di colonne in Cassandra. Cassandra supporta molti tipi di dati diversi per la memorizzazione dei dati, che tratteremo in dettaglio nella prossima parte di questa serie di tutorial. Per creare una tabella, esegui semplicemente il CREA TABELLA
comando.
cassandra @ cqlsh: k1> CREATE TABLE person (id testo, nome testo, testo cognome, PRIMARY KEY (id));
Per verificare come appare la struttura della tabella una volta creata:
cassandra @ cqlsh: k1> DESCRIVERE la persona; CREATE TABLE k1.person (id testo PRIMARY KEY, nome testo, testo cognome) WITH bloom_filter_fp_chance = 0.01 AND caching = 'keys': 'ALL', 'rows_per_partition': 'NONE' AND comment = "AND compaction = ' class ':' org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy ',' max_threshold ':' 32 ',' min_threshold ':' 4 ' AND compression = ' chunk_length_in_kb ':' 64 ',' class ':' org.apache.cassandra.io.compress.LZ4Compressor ' AND crc_check_chance = 1.0 AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry =' 99PERCENTILE ';
Ora diciamo che vogliamo modificare la tabella per memorizzare anche l'email della persona.
cassandra @ cqlsh: k1> ALTER TABLE person ADD testo dell'email; cassandra @ cqlsh: k1> DESCRIVERE la persona; CREATE TABLE k1.person (testo dell'ID PRIMARY KEY, testo dell'email, nome del testo, testo del cognome) WITH bloom_filter_fp_chance = 0.01 AND caching = 'keys': 'ALL', 'rows_per_partition': 'NONE' AND comment = "AND compaction = 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4' AND compression = 'chunk_length_in_kb': '64', 'class ':' org.apache.cassandra.io.compress.LZ4Compressor ' AND crc_check_chance = 1.0 AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99PERCENTILE';
L'inserimento di dati in una tabella Cassandra tramite CQL è piuttosto semplice.
cassandra @ cqlsh: k1> SELECT * FROM person; id | email | nome | cognome ---- + ------- + ------ + --------- (0 righe) cassandra @ cqlsh: k1> INSERISCI IN persona (id, nome, cognome, email) VALORI ('001', 'Shalabh', 'Aggarwal', '[email protected]'); cassandra @ cqlsh: k1> SELECT * FROM person; id | email | nome | cognome ----- + ----------------------------- + --------- + --- ------- 001 | [email protected] | Shalabh | Aggarwal
In questa tabella, abbiamo tutti i campi per un solo tipo di dati. Le cose diventano un po 'complesse quando utilizziamo diversi tipi di dati o tipi di dati compositi. Questa sarà una discussione nella parte successiva di questa serie.
Diciamo che vogliamo aggiornare il valore nella colonna e-mail
a qualcos'altro.
cassandra @ cqlsh: k1> UPDATE person SET email = "[email protected]" DOVE; cassandra @ cqlsh: k1> SELECT * FROM person; id | email | nome | cognome ----- + -------------------------- + --------- + ------ ---- 001 | [email protected] | Shalabh | Aggarwal
I dati in una tabella possono essere interrogati semplicemente usando SELEZIONARE
dichiarazioni.
Inseriamo altri record e li interrogiamo.
cassandra @ cqlsh: k1> INSERISCI NELLA PERSONA (id, nome, cognome, email) VALORI ('002', 'Giovanni', 'Daina', '[email protected]'); cassandra @ cqlsh: k1> INSERISCI NELLA PERSONA (id, nome, cognome, email) VALORI ('003', 'Harry', 'Potter', '[email protected]'); cassandra @ cqlsh: k1> SELECT * da persona; id | email | nome | cognome ----- + -------------------------- + --------- + ------ ---- 002 | [email protected] | John | Doe 001 | [email protected] | Shalabh | Aggarwal 003 | [email protected] | Harry | Potter (3 righe) cassandra @ cqlsh: k1> SELECT name FROM person WHERE; name --------- Shalabh (1 rows) cassandra @ cqlsh: k1> SELECT name FROM person WHERE id IN ('001', '002'); nome --------- Shalabh John (2 righe)
Possono essere utilizzati anche operatori di query più complessi come gli operatori di disuguaglianza o diversi DOVE
le condizioni possono essere concatenate usando E
/O
, eccetera.
Cassandra è uno dei più popolari sistemi di database NoSQL disponibili ed è la migliore build da utilizzare in ambienti distribuiti. Trattare con Cassandra è piuttosto facile per i principianti con una certa conoscenza di RDBMS e SQL.
CQL è molto simile a SQL in una certa misura, e CQLSH semplifica il collaudo e il debugging. Nella parte successiva di questa serie, tratterò i vari tipi di dati forniti da Cassandra e come gestirli.