可以在本地或ECS上安裝Cassandra,通過cqlsh工具訪問雲資料庫Cassandra。
下載和安裝Cassandra
在Apache 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串連雲資料Cassandra
在雲資料Cassandra的控制台查看雲資料Cassandra的地址和連接埠,然後在本地或ECS上使用cqlsh串連,命令如下:
bin/cqlsh $host $port -u $username -p $password
如果您需要經常串連到特定節點,您可以將節點的地址和連接埠資訊儲存到環境變數$CQLSH_HOST和$CQLSH_PORT中。更多關於cqlsh命令支援的參數可以使用bin/cqlsh -help
。
基本的cqlsh命令
cqlsh支援多種操作Cassandra的基本命令,您可以使用HELP
或?
命令查看所有支援的命令:
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
如果需要查看特定命令的協助,可以使用HELP
。需要注意的是,很多cqlsh命令並不接收相關的參數,當您使用這些命令時,其輸出為當前的設定,比如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
在cqlsh裡面查看環境變數
您可以使用DESCRIBE
命令,來查看一些叢集的一些環境變數的值,例如:
cqlsh> DESCRIBE CLUSTER;
Cluster: Test Cluster
Partitioner: Murmur3Partitioner
DESCRIBE CLUSTER
顯示了叢集的名字以及採用的Partitioner,Cassandra 1.2版本開始預設為Murmur3Partitioner,其他可選的Partitioner有RandomPartitioner(Cassandra 1.2 版本之前預設的Partitioner)、OrderPreservingPartitioner以及ByteOrderedPartitioner等。
如果您需要查看叢集裡面可用的Keyspaces,可以使用下面命令:
cqlsh> DESCRIBE KEYSPACES;
上面命令將system_traces、system_schema、system_auth、system system_distributed等系統內建的Keyspaces都顯示出來了,如果您建立了Keyspaces,也會在這裡顯示。
可以使用下面命令查看cqlsh、Cassandra以及protocol的版本:
cqlsh> SHOW VERSION;
[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,具體如下:
cqlsh> CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh>
上面命令建立了名為test_keyspace的Keyspace;並且採用SimpleStrategy進行副本複製。由於當前的測試叢集只有單個節點,所以設定副本因子(replication factor)為1。如果是生產環境,請勿將副本因子設定為1,建議將副本因子設定為3。
建立完Keyspace之後,您可以使用DESCRIBE KEYSPACE
命令來查看這個Keyspace:
cqlsh> DESCRIBE KEYSPACE test_keyspace;
CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
現在您可以使用USE
命令來切換到這個Keyspace:
cqlsh> USE test_keyspace;
cqlsh:test_keyspace>
通過cqlsh建立表
建立表:
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的表。其中包含了first_name和last_name兩個欄位,類型都是text,並且first_name是這張表的PRIMARY KEY。當然,您也可以通過下述命令在test_keyspace裡面建表:
cqlsh> CREATE TABLE test_keyspace.test_user(first_name text , last_name text, PRIMARY KEY (first_name));
查看建表語句:
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
命令會將建表語句以格式化的形式顯示出來,除了您制定的設定,還包含了許多預設的設定。
通過cqlsh讀寫資料
往表裡面插入一些資料:
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表中插入三條資料,其中最後一條資料只指定了Key,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)
可以看出,由於first_name為Wang對應的last_name沒有資料,這裡直接顯示null。在Cassandra中,null代表對應的列沒有資料,在底層儲存是不佔用空間的,而在常見的關係型資料庫裡面是佔一定空間的。
刪除列或行
使用DELETE
命令刪除一些列。例如,刪除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>
可以看到Key為test的資料已經成功被刪除。
insert/update
相當於upsert
,如果您插入資料對應的Key在Cassandra已經存在了,這時候Cassandra不會在原來資料位元置上修改資料,而是會新寫入一份資料,舊的資料會被Cassandra刪除。
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)
可以看出,Key為Wang的資料對應的last_name已經有值了。
如果使用UPDATE
命令更新不存在的資料,Cassandra會插入新的資料,例如:
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>
可以看出,Key為Li的資料被插入到表中了,而更新之前該資料不存在。
清空或刪除表
如果您需要清空一張表,您可以使用TRUNCATE
命令或DROP TABLE
命令,例如:
cqlsh:test_keyspace> TRUNCATE test_user;
cqlsh:test_keyspace> DROP TABLE test_user;