全部产品
云市场

使用cqlsh访问cassandra

更新时间:2019-08-15 09:44:22

可以在本地或ECS上安装Cassandra,通过cqlsh工具访问云数据库Cassandra。

下载和安装Cassandra

到Apache Cassandra 的官方网站下载最新版本的 Cassandra然后解压,即可完成安装。

  1. $ wget http://mirror.bit.edu.cn/apache/cassandra/3.11.4/apache-cassandra-3.11.4-bin.tar.gz
  2. $ tar -zxf apache-cassandra-3.11.4-bin.tar.gz
  3. $ cd apache-cassandra-3.11.4

启动cqlsh

在云数据cassandra的控制台查看cassandra的地址和端口,然后使用如下命令连接:

  1. bin/cqlsh $host $port

然后按提示输入用户名密码即可使用。

如果您需要经常连接到特定节点,您可以将节点的地址和端口信息保存到环境变量 $CQLSH_HOST 和 $CQLSH_PORT 中。更多关于 cqlsh 命令支持的参数可以使用 bin/cqlsh -help。

基本的 cqlsh 命令

cqlsh 支持很多操作 Cassandra 的基本命令,您可以使用 HELP 或 ? 命令查看所有支持的命令:

  1. cqlsh> HELP
  2. Documented shell commands:
  3. ===========================
  4. CAPTURE CLS COPY DESCRIBE EXPAND LOGIN SERIAL SOURCE UNICODE
  5. CLEAR CONSISTENCY DESC EXIT HELP PAGING SHOW TRACING
  6. CQL help topics:
  7. ================
  8. AGGREGATES CREATE_KEYSPACE DROP_TRIGGER TEXT
  9. ALTER_KEYSPACE CREATE_MATERIALIZED_VIEW DROP_TYPE TIME
  10. ALTER_MATERIALIZED_VIEW CREATE_ROLE DROP_USER TIMESTAMP
  11. ALTER_TABLE CREATE_TABLE FUNCTIONS TRUNCATE
  12. ALTER_TYPE CREATE_TRIGGER GRANT TYPES
  13. ALTER_USER CREATE_TYPE INSERT UPDATE
  14. APPLY CREATE_USER INSERT_JSON USE
  15. ASCII DATE INT UUID
  16. BATCH DELETE JSON
  17. BEGIN DROP_AGGREGATE KEYWORDS
  18. BLOB DROP_COLUMNFAMILY LIST_PERMISSIONS
  19. BOOLEAN DROP_FUNCTION LIST_ROLES
  20. COUNTER DROP_INDEX LIST_USERS
  21. CREATE_AGGREGATE DROP_KEYSPACE PERMISSIONS
  22. CREATE_COLUMNFAMILY DROP_MATERIALIZED_VIEW REVOKE
  23. CREATE_FUNCTION DROP_ROLE SELECT
  24. CREATE_INDEX DROP_TABLE SELECT_JSON

如果需要查看特定命令的帮助,可以使用 HELP 。需要注意的是,很多 cqlsh 命令并不接收相关的参数,当您使用这些命令时,其输出为当前的设置,比如 CONSISTENCY, EXPAND 和 PAGING 命令,如下:

  1. cqlsh> CONSISTENCY
  2. Current consistency level is ONE.
  3. cqlsh> EXPAND
  4. Expanded output is currently disabled. Use EXPAND ON to enable.
  5. cqlsh> PAGING
  6. Query paging is currently enabled. Use PAGING OFF to disable
  7. Page size: 100

在 cqlsh 里面查看环境变量

您可以使用 DESCRIBE 命令,来查看一些集群的一些环境变量的值,例如:

  1. cqlsh> DESCRIBE CLUSTER;
  2. Cluster: Test Cluster
  3. Partitioner: Murmur3Partitioner

DESCRIBE CLUSTER 显示了集群的名字以及采用的 Partitioner ,Cassandra 1.2 版本开始默认为 Murmur3Partitioner,其他可选的 Partitioner 有 RandomPartitioner(Cassandra 1.2 版本之前默认的 Partitioner)、OrderPreservingPartitioner 以及 ByteOrderedPartitioner 等。

如果您需要查看集群里面可用的 keyspaces,可以使用下面命令:

  1. cqlsh> DESCRIBE KEYSPACES;

system_traces system_schema system_auth system system_distributed上面命令将系统自带的 keyspaces 都显示出来了,如果您创建了keyspaces,也会在这里显示。

可以使用下面命令查看 cqlsh、Cassandra 以及 protocol 的版本:

  1. cqlsh> SHOW VERSION;
  2. [cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]

通过 cqlsh 创建 keyspace

Cassandra中的keyspace和关系型数据库中的database概念比较类似,一个 keyspace 可以包含一个或多个 tables 或 column families。当您启动 cqlsh 时没有指定 keyspace,那么命令提示符为 cqlsh>,您可以使用 CREATE KEYSPACE 命令来创建 keyspace,具体如下:

  1. cqlsh> CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
  2. cqlsh>

上面命令创建了名为 test_keyspace 的 keyspace;并且采用 SimpleStrategy 进行副本复制。由于当前的测试集群只有单个节点,所以设置副本因子(replication factor)为 1。如果是生产环境,请勿将副本因子设置为 1,建议将副本因子设置为 3。

创建完 keyspace 之后,您可以使用 DESCRIBE KEYSPACE 命令来查看这个 keyspace:

  1. cqlsh> DESCRIBE KEYSPACE test_keyspace;
  2. CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;

现在您可以使用 USE 命令来切换到这个 keyspace :

  1. cqlsh> USE test_keyspace;
  2. cqlsh:test_keyspace>

通过 cqlsh 创建表

创建表:

  1. cqlsh> use test_keyspace;
  2. cqlsh:test_keyspace> CREATE TABLE test_user (first_name text , last_name text, PRIMARY KEY (first_name)) ;

上述命令表示在 test_keyspace 下面创建了一张名为 test_user 的表。其中包含了 first_name 和 last_name 两个字段,类型都是 text,并且 first_name 是这张表的 PRIMARY KEY。当然,您也可以通过下述命令在 test_keyspace 里面建表:

  1. cqlsh> CREATE TABLE test_keyspace.test_user(first_name text , last_name text, PRIMARY KEY (first_name)) ;

查看建表语句:

  1. cqlsh:test_keyspace> DESCRIBE TABLE test_user;
  2. CREATE TABLE test_keyspace.test_user (
  3. first_name text PRIMARY KEY,
  4. last_name text
  5. ) WITH bloom_filter_fp_chance = 0.01
  6. AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
  7. AND comment = ''
  8. AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
  9. AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
  10. AND crc_check_chance = 1.0
  11. AND dclocal_read_repair_chance = 0.1
  12. AND default_time_to_live = 0
  13. AND gc_grace_seconds = 864000
  14. AND max_index_interval = 2048
  15. AND memtable_flush_period_in_ms = 0
  16. AND min_index_interval = 128
  17. AND read_repair_chance = 0.0
  18. AND speculative_retry = '99PERCENTILE';
  19. cqlsh:test_keyspace>

DESCRIBE TABLE 命令会将建表语句以格式化的形式显示出来,除了您制定的设置,还包含了许多默认的设置。

通过 cqlsh 读写数据

往表里面插入一些数据:

  1. cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('test', 'Hadoop');
  2. cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('Zhang', 'San');
  3. cqlsh:test_keyspace> INSERT INTO test_user (first_name) VALUES ('Wu');

上述语句表示往 test_user 表中插入三条数据,其中最后一条数据只指定了 key,last_name 没有值。

您可以使用 SELECT COUNT 语句查看数据是否插入成功。

  1. cqlsh:test_keyspace> SELECT COUNT(*) FROM test_user;
  2. count
  3. -------
  4. 3
  5. (1 rows)
  6. Warnings :
  7. Aggregation query used without partition key

通过命令的输出查看已成功插入数据。您还可以使用下述命令查询这条数据:

  1. cqlsh:test_keyspace> SELECT * FROM test_user;
  2. first_name | last_name
  3. ------------+-----------
  4. test | Hadoop
  5. Wu | null
  6. Zhang | San
  7. (3 rows)
  8. cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
  9. first_name | last_name
  10. ------------+-----------
  11. test | Hadoop
  12. (1 rows)

可以看出,由于first_name 为 Wu 对应的 last_name 没有数据,这里直接显示 null。在 Cassandra 中,null代表对应的列没有数据,在底层存储是不占用空间的,而在常见的关系型数据库里面是占一定空间的。

删除列或行

使用 DELETE 命令删除一些列。例如,删除 last_name 列:

  1. cqlsh:test_keyspace> DELETE last_name FROM test_user WHERE first_name='test';
  2. cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
  3. first_name | last_name
  4. ------------+-----------
  5. test | null
  6. (1 rows)

可以看出 last_name 列已经成功被删除。

使用 DELETE 命令删除一整行的数据:

  1. cqlsh:test_keyspace> DELETE FROM test_user WHERE first_name='test';
  2. cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
  3. first_name | last_name
  4. ------------+-----------
  5. (0 rows)
  6. cqlsh:test_keyspace>

可以看到 key 为 test 的数据已经成功被删除。

insert/update 相当于 upsert如果您插入数据对应的 key 在 Cassandra 已经存在了,这时候 Cassandra 不会在原来数据位置上修改数据,而是会新写入一份数据,旧的数据会被 Cassandra 删除。

  1. cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('Wu', 'Shi');
  2. cqlsh:test_keyspace> SELECT * FROM test_user;
  3. first_name | last_name
  4. ------------+-----------
  5. Wu | Shi
  6. Zhang | San
  7. (2 rows)

可以看出,key 为 Wu 的数据对应的 last_name 已经有值了。

如果使用UPDATE命令更新不存在的数据,Cassandra 会插入新的数据,例如:

  1. cqlsh:test_keyspace> SELECT * FROM test_user;
  2. first_name | last_name
  3. ------------+-----------
  4. Wu | Shi
  5. Zhang | San
  6. (2 rows)
  7. cqlsh:test_keyspace> UPDATE test_user SET last_name = 'Si' WHERE first_name = 'Li';
  8. cqlsh:test_keyspace> SELECT * FROM test_user;
  9. first_name | last_name
  10. ------------+-----------
  11. Wu | Shi
  12. Zhang | San
  13. Li | Si
  14. (3 rows)
  15. cqlsh:test_keyspace>

可以看出,key 为 Li 的数据被插入到表中了,而更新之前该数据不存在。

清空或删除表

如果您需要清空一张表,您可以使用 TRUNCATE 命令或 DROP TABLE 命令,例如:

  1. cqlsh:test_keyspace> TRUNCATE test_user;
  2. cqlsh:test_keyspace> DROP TABLE test_user;