Cette rubrique explique comment gérer une instance ApsaraDB for Cassandra à l'aide de cqlsh. cqlsh est un shell en ligne de commande utilisé pour interagir avec Cassandra via le langage de requête Cassandra (CQL). Vous pouvez installer Cassandra sur une machine locale ou sur une instance Elastic Compute Service (ECS).
Télécharger et installer Cassandra
Vous pouvez télécharger la dernière version de Cassandra depuis le site officiel d'Apache Cassandra, puis décompresser le package logiciel téléchargé pour installer Cassandra.
$ wget http://mirror.bit.edu.cn/apache/cassandra/3.11.4/apache-cassandra-3.11.4-bin.tar.gz
$ tar -zxf apache-cassandra-3.11.4-bin.tar.gz
$ cd apache-cassandra-3.11.4
Utiliser cqlsh pour se connecter à une instance ApsaraDB for Cassandra
Connectez-vous à la console ApsaraDB for Cassandra, localisez votre instance ApsaraDB for Cassandra, puis récupérez le endpoint et le numéro de port du nœud auquel vous souhaitez vous connecter. Exécutez ensuite la commande suivante pour vous connecter au nœud :
bin/cqlsh $host $port -u $username -p $password
Si vous devez vous connecter fréquemment à un nœud, nous vous recommandons d'enregistrer son endpoint et son numéro de port dans les variables d'environnement $CQLSH_HOST et $CQLSH_PORT. Exécutez la commande bin/cqlsh -help pour afficher davantage de paramètres pris en charge par cqlsh.
Instructions CQL courantes
Dans cqlsh, exécutez la commande HELP ou ? pour afficher toutes les instructions CQL utilisables pour gérer les instances ApsaraDB for Cassandra.
cqlsh> HELP
Documented shell commands:
===========================
CAPTURE CLS COPY DESCRIBE EXPAND LOGIN SERIAL SOURCE UNICODE
CLEAR CONSISTENCY DESC EXIT HELP PAGING SHOW TRACING
CQL help topics:
================
AGGREGATES CREATE_KEYSPACE DROP_TRIGGER TEXT
ALTER_KEYSPACE CREATE_MATERIALIZED_VIEW DROP_TYPE TIME
ALTER_MATERIALIZED_VIEW CREATE_ROLE DROP_USER TIMESTAMP
ALTER_TABLE CREATE_TABLE FUNCTIONS TRUNCATE
ALTER_TYPE CREATE_TRIGGER GRANT TYPES
ALTER_USER CREATE_TYPE INSERT UPDATE
APPLY CREATE_USER INSERT_JSON USE
ASCII DATE INT UUID
BATCH DELETE JSON
BEGIN DROP_AGGREGATE KEYWORDS
BLOB DROP_COLUMNFAMILY LIST_PERMISSIONS
BOOLEAN DROP_FUNCTION LIST_ROLES
COUNTER DROP_INDEX LIST_USERS
CREATE_AGGREGATE DROP_KEYSPACE PERMISSIONS
CREATE_COLUMNFAMILY DROP_MATERIALIZED_VIEW REVOKE
CREATE_FUNCTION DROP_ROLE SELECT
CREATE_INDEX DROP_TABLE SELECT_JSON
Pour savoir comment exécuter une instruction CQL spécifique, lancez la commande HELP suivie de cette instruction. Certaines instructions CQL ne permettent pas de spécifier de paramètres. Lorsque vous exécutez ce type d'instruction, le système renvoie les paramètres interrogés par celle-ci. Cela concerne notamment les instructions CONSISTENCY, EXPAND et PAGING. Voici des exemples :
cqlsh> CONSISTENCY
Current consistency level is ONE.
cqlsh> EXPAND
Expanded output is currently disabled. Use EXPAND ON to enable.
cqlsh> PAGING
Query paging is currently enabled. Use PAGING OFF to disable
Page size: 100
Interroger les variables d'environnement
Exécutez l'instruction DESCRIBE pour interroger les valeurs des variables d'environnement utilisées dans une instance ApsaraDB for Cassandra. Exemple :
cqlsh> DESCRIBE CLUSTER;
Cluster: Test Cluster
Partitioner: Murmur3Partitioner
L'instruction DESCRIBE CLUSTER permet d'interroger le nom et le partitionneur de l'instance ApsaraDB for Cassandra. Vous pouvez choisir parmi les quatre partitionneurs suivants : RandomPartitioner, Murmur3Partitioner, OrderPreservingPartitioner et ByteOrderedPartitioner. Dans les versions de Cassandra antérieures à la 1.2, le partitionneur par défaut est RandomPartitioner. À partir de Cassandra 1.2, le partitionneur par défaut est Murmur3Partitioner.
Pour interroger les keyspaces disponibles dans une instance ApsaraDB for Cassandra, exécutez l'instruction suivante :
cqlsh> DESCRIBE KEYSPACES;
Le système renvoie tous les keyspaces fournis par l'instance ApsaraDB for Cassandra, tels que system_traces, system_schema, system_auth et system_distributed, ainsi que les keyspaces que vous avez créés.
Pour interroger les versions de cqlsh, de Cassandra et du protocole, exécutez l'instruction suivante :
cqlsh> SHOW VERSION;
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]
Créer un keyspace
Les keyspaces d'une instance ApsaraDB for Cassandra sont similaires aux bases de données d'une instance ApsaraDB RDS. Un keyspace contient une ou plusieurs tables ou familles de colonnes. Si vous démarrez cqlsh sans spécifier de keyspace, l'invite de commande cqlsh> s'affiche. Vous pouvez alors exécuter l'instruction CREATE KEYSPACE pour créer un keyspace. Exemple :
cqlsh> CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh>
Dans cet exemple, un keyspace nommé test_keyspace est créé et le mode de réplication est défini sur SimpleStrategy. De plus, l'instance ApsaraDB for Cassandra utilisée pour les tests ne comporte qu'un seul nœud. Le facteur de réplication est donc défini sur 1. Toutefois, si l'instance ApsaraDB for Cassandra est utilisée en environnement de production, nous vous recommandons de définir le facteur de réplication sur 3.
Après avoir créé un keyspace, vous pouvez exécuter l'instruction DESCRIBE KEYSPACE pour l'interroger. Exemple :
cqlsh> DESCRIBE KEYSPACE test_keyspace;
CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
Vous pouvez également exécuter l'instruction USE pour basculer vers le keyspace. Exemple :
cqlsh> USE test_keyspace;
cqlsh:test_keyspace>
Créer une table
Pour créer une table, exécutez les instructions suivantes :
cqlsh> use test_keyspace;
cqlsh:test_keyspace> CREATE TABLE test_user (first_name text , last_name text, PRIMARY KEY (first_name));
Dans cet exemple, une table nommée test_user est créée dans le keyspace test_keyspace. La table contient deux champs de type de données TEXT : first_name et last_name. Le champ first_name constitue la clé primaire de la table. Vous pouvez également exécuter l'instruction suivante pour créer la table test_user dans le keyspace test_keyspace :
cqlsh> CREATE TABLE test_keyspace.test_user(first_name text , last_name text, PRIMARY KEY (first_name));
Pour interroger les instructions CQL que vous avez exécutées pour créer la table test_user dans le keyspace test_keyspace, exécutez l'instruction suivante :
cqlsh:test_keyspace> DESCRIBE TABLE test_user;
CREATE TABLE test_keyspace.test_user (
first_name text PRIMARY KEY,
last_name text
) 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';
cqlsh:test_keyspace>
L'instruction DESCRIBE TABLE permet d'interroger toutes les instructions exécutées lors de la création de la table, ainsi que le schéma de celle-ci, y compris les paramètres personnalisés et les paramètres par défaut.
Lire et écrire des données
Exécutez l'instruction INSERT INTO pour insérer des données dans une table. Exemple :
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('test', 'Hadoop');
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('Zhang', 'San');
cqlsh:test_keyspace> INSERT INTO test_user (first_name) VALUES ('Li');
Les instructions ci-dessus servent à insérer trois enregistrements de données dans la table test_user. Pour le dernier enregistrement, seule la valeur du champ first_name est spécifiée ; le champ last_name reste vide.
Exécutez l'instruction SELECT COUNT pour vérifier si les enregistrements ont bien été insérés. Exemple :
cqlsh:test_keyspace> SELECT COUNT(*) FROM test_user;
count
-------
3
(1 rows)
Warnings :
Aggregation query used without partition key
Les résultats renvoyés confirment l'insertion des enregistrements. Vous pouvez également exécuter l'instruction suivante pour interroger les données :
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
test | Hadoop
Wang | null
Zhang | San
(3 rows)
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
first_name | last_name
------------+-----------
test | Hadoop
(1 rows)
Une valeur null est renvoyée pour le champ last_name associé au champ first_name dont la valeur est Wang. Dans Cassandra, une valeur null indique que la colonne spécifiée par le champ ne contient aucune donnée ; une colonne vide n'occupe aucun espace dans le système de stockage. En revanche, dans les bases de données relationnelles classiques, une colonne occupe de l'espace de stockage même si elle est vide.
Supprimer une colonne ou une ligne
Exécutez l'instruction DELETE pour supprimer une ou plusieurs colonnes. Par exemple, exécutez les instructions suivantes pour supprimer la colonne last_name :
cqlsh:test_keyspace> DELETE last_name FROM test_user WHERE first_name='test';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
first_name | last_name
------------+-----------
test | null
(1 rows)
La colonne spécifiée par le champ last_name est supprimée.
Vous pouvez également exécuter l'instruction DELETE pour supprimer une ligne. Exemple :
cqlsh:test_keyspace> DELETE FROM test_user WHERE first_name='test';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
first_name | last_name
------------+-----------
(0 rows)
cqlsh:test_keyspace>
L'enregistrement de données dont la valeur du champ first_name est test est supprimé.
L'utilisation conjointe des instructions INSERT and UPDATE équivaut à l'instruction UPSERT . Si l'enregistrement que vous souhaitez insérer existe déjà, le système ne met pas à jour l'enregistrement existant ayant la même valeur de clé primaire. Il insère le nouvel enregistrement et supprime l'ancien. Exemple :
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('Wang', 'Shi');
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
Wang | Shi
Zhang | San
(2 rows)
Une valeur Shi est renvoyée pour le champ last_name associé au champ first_name dont la valeur est Wang.
Si vous exécutez l'instruction UPDATE pour mettre à jour un enregistrement qui n'existe pas, le système insère cet enregistrement. Exemple :
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
Wang | Shi
Zhang | San
(2 rows)
cqlsh:test_keyspace> UPDATE test_user SET last_name = 'Si' WHERE first_name = 'Li';
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
Wang | Shi
Zhang | San
Li | Si
(3 rows)
cqlsh:test_keyspace>
Un enregistrement dont la valeur du champ first_name est Li est inséré dans la table, bien qu'il n'existait pas avant la mise à jour.
Vider ou supprimer une table
Exécutez l'instruction TRUNCATE ou DROP TABLE pour vider ou supprimer une table. Exemple :
cqlsh:test_keyspace> TRUNCATE test_user;
cqlsh:test_keyspace> DROP TABLE test_user;