このトピックでは、cqlsh を使用して ApsaraDB for Cassandra インスタンスを管理する方法について説明します。 cqlsh は、Cassandra Query Language(CQL)に基づいて Cassandra と対話するために使用されるコマンドラインシェルです。オンプレミスのマシンまたは Elastic Compute Service(ECS)インスタンスに Cassandra をインストールできます。
Cassandra をダウンロードしてインストールする
Apache Cassandra の公式 Web サイトから Cassandra の最新バージョンをダウンロードし、ダウンロードしたソフトウェアパッケージを解凍して 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 cqlsh を使用して ApsaraDB for Cassandra インスタンスに接続する
ApsaraDB for Cassandra <コンソール>[コンソール] にログインし、ApsaraDB for Cassandra インスタンスを見つけ、接続するノードのエンドポイントとポート番号を取得します。次に、次のコマンドを実行してノードに接続します。
bin/cqlsh $host $port -u $username -p $password ノードに頻繁に接続する必要がある場合は、そのエンドポイントとポート番号を $CQLSH_HOST および $CQLSH_PORT 環境変数に保存することをお勧めします。 bin/cqlsh -help コマンドを実行して、cqlsh でサポートされているその他のパラメーターを表示できます。
一般的な CQL 文
cqlsh で HELP または ? コマンドを実行して、ApsaraDB for Cassandra インスタンスの管理に使用できるすべての CQL 文を表示できます。
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_USER INSERT UPDATE
APPLY CREATE_TYPE 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 特定の CQL 文の実行方法を知りたい場合は、その文に対して HELP コマンドを実行します。一部の CQL 文では、パラメーターを指定できません。このような CQL 文を実行すると、システムはその文によって照会された設定を返します。このような CQL 文には、CONSISTENCY、EXPAND、PAGING などがあります。例:
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 環境変数を照会する
DESCRIBE 文を実行して、ApsaraDB for Cassandra インスタンスで使用される環境変数の値を照会できます。例:
cqlsh> DESCRIBE CLUSTER;
Cluster: Test Cluster
Partitioner: Murmur3Partitioner DESCRIBE CLUSTER 文は、ApsaraDB for Cassandra インスタンスの名前と partitioner を照会します。RandomPartitioner、Murmur3Partitioner、OrderPreservingPartitioner、ByteOrderedPartitioner の 4 つの partitioner から 1 つを選択できます。バージョン 1.2 より前の Cassandra では、デフォルトの partitioner は RandomPartitioner です。Cassandra 1.2 以降では、デフォルトの partitioner は Murmur3Partitioner です。
ApsaraDB for Cassandra インスタンスで使用可能なキースペースを照会するには、次の文を実行します。
cqlsh> DESCRIBE KEYSPACES; システムは、system_traces、system_schema、system_auth、system_distributed など、ApsaraDB for Cassandra インスタンスによって提供されるすべてのキースペースと、作成したキースペースを返します。
cqlsh、Cassandra、およびプロトコルのバージョンを照会するには、次の文を実行します。
cqlsh> SHOW VERSION;
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4] キースペースを作成する
ApsaraDB for Cassandra インスタンスのキースペースは、ApsaraDB RDS インスタンスのデータベースに似ています。キースペースには、1 つ以上のテーブルまたはカラムファミリが含まれています。cqlsh を起動してキースペースを指定しないと、cqlsh> コマンドプロンプトが表示されます。次に、CREATE KEYSPACE 文を実行してキースペースを作成できます。例:
cqlsh> CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh> この例では、test_keyspace という名前のキースペースが作成され、レプリケーションモードが SimpleStrategy に設定されています。また、テストに使用される ApsaraDB for Cassandra インスタンスは 1 つのノードのみで構成されています。したがって、レプリケーション係数は 1 に設定されています。ただし、ApsaraDB for Cassandra インスタンスを本番環境で使用する場合は、レプリケーション係数を 3 に設定することをお勧めします。
キースペースを作成した後、DESCRIBE KEYSPACE 文を実行してキースペースを照会できます。例:
cqlsh> DESCRIBE KEYSPACE test_keyspace;
CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true; USE 文を実行してキースペースに切り替えることもできます。例:
cqlsh> USE test_keyspace;
cqlsh:test_keyspace> テーブルを作成する
テーブルを作成するには、次の文を実行します。
cqlsh> use test_keyspace;
cqlsh:test_keyspace> CREATE TABLE test_user (first_name text , last_name text, PRIMARY KEY (first_name));
この例では、test_keyspace キースペースに test_user という名前のテーブルが作成されます。テーブルには、TEXT データ型の 2 つのフィールド、first_name と last_name が含まれています。first_name フィールドは、テーブルのプライマリキーです。次の文を実行して、test_keyspace キースペースに test_user テーブルを作成することもできます。
cqlsh> CREATE TABLE test_keyspace.test_user(first_name text , last_name text, PRIMARY KEY (first_name));
test_keyspace キースペースに test_user テーブルを作成するために実行した CQL 文を照会するには、次の文を実行します。
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> DESCRIBE TABLE 文を実行して、テーブルを作成するために実行したすべての文と、カスタム設定とデフォルト設定を含むテーブルのスキーマを照会できます。
データの読み取りと書き込み
INSERT INTO 文を実行して、テーブルにデータを挿入できます。例:
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'); 上記の文は、test_user テーブルに 3 つのデータレコードを挿入するために使用されます。最後のデータレコードでは、first_name フィールドの値のみが指定され、last_name フィールドは空のままです。
SELECT COUNT 文を実行して、データレコードが挿入されたかどうかを確認できます。例:
cqlsh:test_keyspace> SELECT COUNT(*) FROM test_user;
count
-------
3
(1 rows)
Warnings :
Aggregation query used without partition key 返された結果から、データレコードが挿入されたことがわかります。次の文を実行してデータレコードを照会することもできます。
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) 値が Wang の first_name フィールドに関連付けられた last_name フィールドには、null 値が返されます。Cassandra では、null 値はフィールドで指定されたカラムにデータがないことを示し、データのないカラムはストレージシステムで領域を占有しません。ただし、一般的なリレーショナルデータベースでは、カラムにデータがなくてもストレージ領域を占有します。
カラムまたは行を削除する
DELETE 文を実行して、1 つ以上のカラムを削除できます。たとえば、次の文を実行して 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) last_name フィールドで指定されたカラムが削除されます。
DELETE 文を実行して行を削除することもできます。例:
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> first_name フィールドの値が test であるデータレコードが削除されます。
INSERT 文と UPDATE 文を一緒に使用することは、UPSERT 文と同じです。挿入するデータレコードがすでに存在する場合、システムは同じプライマリキー値を持つ既存のデータレコードを更新するのではなく、新しいデータレコードを挿入して既存のレコードを削除します。例:
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) 値が Wang の first_name フィールドに関連付けられた last_name フィールドには、Shi の値が返されます。
存在しないデータレコードを更新するために UPDATE 文を実行すると、システムはデータレコードを挿入します。例:
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> first_name フィールドの値が Li であるデータレコードがテーブルに挿入されますが、このデータレコードは更新前に存在しません。
テーブルをクリアまたは削除する
TRUNCATE 文または DROP TABLE 文を実行して、テーブルをクリアまたは削除できます。例:
cqlsh:test_keyspace> TRUNCATE test_user;
cqlsh:test_keyspace> DROP TABLE test_user;