Apache Cassandra is een van de meest populaire open-source gedistribueerde databasesystemen die beschikbaar zijn. Het is ontworpen met het doel om grote hoeveelheden gegevens te verwerken die zijn opgeslagen op vele servers die over verschillende geografische locaties zijn verspreid, terwijl ze een hoge schaalbaarheid en beschikbaarheid bieden zonder een enkel storingspunt. Cassandra-systemen kunnen meerdere datacenters overspannen, waardoor een lage latentie mogelijk is voor alle verbonden clients.
Dit is een drieledige tutorialserie waarin ik zal beginnen met de basis van Cassandra, met behulp van CQLSH om tabellen en records te maken. Vervolgens zal ik de verschillende gegevenstypen uitleggen die worden ondersteund door Cassandra, en dan zullen we een Go-clientbibliotheek gebruiken om Cassandra-bewerkingen programmatisch af te handelen.
In dit eerste deel zal ik ingaan op hoe het Cassandra-gegevensmodel in het kort wordt uiteengezet en basisbewerkingen uitvoeren met behulp van CQLSH.
Voor deze serie tutorials veronderstel ik dat lezers Cassandra zelf op hun respectievelijke machines kunnen installeren, afhankelijk van het besturingssysteem.
Het Cassandra-gegevensmodel volgt de kolomfamiliebenadering, die gemakkelijk kan worden begrepen als analoog aan een relationele-tabelstructuur maar op een NoSQL-manier. De onderstaande beschrijving zou het duidelijker moeten maken:
Een sleutelruimte kan worden gezien als de buitenste container voor gegevens in Cassandra. Alle gegevens in Cassandra zouden in een sleutelruimte moeten leven. Het kan worden gezien als een database in RDBMS, een verzameling tabellen. In het geval van Cassandra is een sleutelruimte een verzameling kolomfamilies.
Een kolomfamilie kan worden gezien als een verzameling rijen en elke rij is een verzameling kolommen. Het is analoog aan een tabel in RDBMS maar heeft enkele verschillen. De kolomfamilies zijn gedefinieerd, maar het is niet nodig dat elke rij alle kolommen heeft en kolommen kunnen worden toegevoegd of verwijderd uit een rij wanneer en wanneer nodig.
De kolom is de basiseenheid van gegevens in Cassandra. Het heeft drie waarden: sleutel- of kolomnaam, kolomwaarde en een tijdstempel.
Een superkolom is een speciaal kolomtype dat een kaart van andere subkolommen opslaat. Het maakt het opslaan van complexe gegevens eenvoudiger en maakt ook het ophalen van gegevens sneller, omdat elke kolomfamilie in Cassandra wordt opgeslagen in een enkel bestand op het bestandssysteem.
CQLSH is de standaard shell voor interactie met Cassandra via CQL (Cassandra Query Language). CQL lijkt veel op SQL (dat meestal wordt gebruikt voor RDBMS) en maakt het daarom zeer gemakkelijk voor ontwikkelaars die nieuw voor Cassandra zijn om er snel mee aan de slag te gaan. CQLSH wordt bij elk Cassandra-pakket meegeleverd en zou al op uw computer geïnstalleerd moeten zijn toen u Cassandra installeerde.
Zoals we zagen in het hierboven beschreven gegevensmodel, keyspace
is de buitenste container en moet vóór alle andere worden gemaakt. Om het te maken, voer:
$ cqlsh localhost -e "CREËER KEYSPACE INDIEN NIET BESTAAT K1 MET replicatie = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;"
In het bovenstaande commando heb ik aangenomen dat jouw Cassandra bestaat localhost
zonder enige gebruikersauthenticatie. Ik heb een gemaakt keyspace
riep k1
met kopiëren
en durable_writes
beleid gedefinieerd.
Als u gebruikersverificatie hebt gedefinieerd, kunt u het volgende uitvoeren:
$ cqlsh -u-p localhost -e "CREATE KEYSPACE INDIEN NIET BESTAAT K1 MET replicatie = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;"
Vervang in het bovenstaande commando
en
met uw authenticatiegegevens.
Het uitvoeren van een opdracht als deze kan een beetje omslachtig zijn. Een andere manier is om de CQLSH-prompt te starten en vervolgens query's rechtstreeks daarbinnen uit te voeren.
$ cqlsh -u-p localhost Verbonden met testcluster op 127.0.0.1:9042. [cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4] Gebruik HELP voor hulp. cassandra @ cqlsh> CREATE KEYSPACE INDIEN NIET BESTAAT K1 MET replicatie = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;
In de toekomst zal ik de bovenstaande methode voor het uitvoeren van query's gebruiken. Voordat we een andere query uitvoeren, moeten we CQLSH vertellen welke sleutelruimte moet worden gebruikt.
cassandra @ cqlsh> GEBRUIK K1; cassandra @ cqlsh: k1>
De replication_factor
want een sleutelruimte kan worden aangepast aan de hoeveelheid replicatie die nodig is vanaf de replicatie klasse
.
cassandra @ cqlsh: k1> ALTER KEYSPACE "k1" MET REPLICATION = 'class': 'SimpleStrategy', 'replication_factor': 3;
Een tabel is equivalent aan een kolomfamilie in Cassandra. Cassandra ondersteunt veel verschillende datatypen voor het opslaan van data, die ik in het volgende deel van deze tutorials in detail zal behandelen. Om een tabel te maken, voert u eenvoudig het CREËER TAFEL
commando.
cassandra @ cqlsh: k1> CREATE TABLE-persoon (id-tekst, naamtekst, achternaamstekst, PRIMAIRE SLEUTEL (id));
Om te controleren hoe de structuur van de tabel er eenmaal uitzag creëerde:
cassandra @ cqlsh: k1> DESCRIBE persoon; CREATE TABLE k1.person (id-tekst PRIMARY KEY, naamtekst, achternaamstekst) 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 ' EN crc_check_chance = 1.0 EN dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 EN memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry =' 99PERCENTILE ';
Laten we nu zeggen dat we de tabel willen aanpassen om de e-mail van de persoon ook op te slaan.
cassandra @ cqlsh: k1> ALTER TABLE person VOEG e-mailtekst toe; cassandra @ cqlsh: k1> DESCRIBE persoon; CREATE TABLE k1.person (id-tekst PRIMARY KEY, e-mailtekst, naamtekst, achternaamstekst) 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 ' EN crc_check_chance = 1.0 EN dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 EN memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99PERCENTIEL';
Het invoegen van gegevens in een Cassandra-tabel met CQL is vrij eenvoudig.
cassandra @ cqlsh: k1> SELECT * FROM person; id | e-mail | naam | achternaam ---- + ------- + ------ + --------- (0 rijen) cassandra @ cqlsh: k1> INSERT INTO person (id, naam, achternaam, email) VALUES ('001', 'Shalabh', 'Aggarwal', '[email protected]'); cassandra @ cqlsh: k1> SELECT * FROM person; id | e-mail | naam | achternaam ----- + ----------------------------- + --------- + --- ------- 001 | [email protected] | Shalabh | Aggarwal
In deze tabel hebben we alle velden voor slechts één gegevenstype. Dingen worden een beetje ingewikkeld als we verschillende datatypes of samengestelde datatypes gebruiken. Dit zal een discussie zijn in het volgende deel van deze serie.
Laten we zeggen dat we de waarde in de kolom willen bijwerken e-mail
naar iets anders.
cassandra @ cqlsh: k1> UPDATE persoon SET email = "[email protected]" WAAR; cassandra @ cqlsh: k1> SELECT * FROM person; id | e-mail | naam | achternaam ----- + -------------------------- + --------- + ------ ---- 001 | [email protected] | Shalabh | Aggarwal
Gegevens in een tabel kunnen eenvoudig worden opgevraagd door te gebruiken SELECT
statements.
Laten we wat meer records invoegen en deze opvragen.
cassandra @ cqlsh: k1> INSERT INTO persoon (id, naam, achternaam, e-mailadres) VALUES ('002', 'John', 'Doe', '[email protected]'); cassandra @ cqlsh: k1> INSERT INTO persoon (id, naam, achternaam, e-mailadres) VALUES ('003', 'Harry', 'Potter', '[email protected]'); cassandra @ cqlsh: k1> SELECT * van persoon; id | e-mail | naam | achternaam ----- + -------------------------- + --------- + ------ ---- 002 | [email protected] | John | Doe 001 | [email protected] | Shalabh | Aggarwal 003 | [email protected] | Harry | Potter (3 rijen) cassandra @ cqlsh: k1> KIES naam VAN persoon WHERE; name --------- Shalabh (1 rijen) cassandra @ cqlsh: k1> KIES naam VAN persoon WHERE id IN ('001', '002'); naam --------- Shalabh John (2 rijen)
Complexere queryoperators zoals ongelijkheidsexploitanten kunnen ook worden gebruikt, of meerdere WAAR
voorwaarden kunnen worden samengevoegd met behulp van EN
/OF
, enz.
Cassandra is een van de meest populaire beschikbare NoSQL-databasesystemen en is de beste versie voor gebruik in gedistribueerde omgevingen. Omgaan met Cassandra is vrij eenvoudig voor beginners met enige kennis van RDBMS en SQL.
CQL lijkt in zekere mate erg op SQL, en CQLSH maakt testen en debuggen veel eenvoudiger. In het volgende deel van deze serie zal ik de verschillende datatypes van Cassandra bespreken en bespreken hoe daarmee om te gaan.