Apache Cassandra是最流行的开源分布式数据库系统之一。 它的设计目标是处理分布在不同地理位置的许多服务器中存储的大量数据,同时提供高可伸缩性和可用性,而不会出现单点故障。 Cassandra系统可以跨越多个数据中心,从而为所有连接的客户端提供低延迟。
这是一个由三部分组成的系列教程,我将从Cassandra的基础知识开始,使用CQLSH创建表和记录。 然后,我将解释Cassandra支持的各种数据类型,然后我们将使用Go客户端库以编程方式处理Cassandra操作。
在第一部分中,我将简要介绍Cassandra数据模型的布局以及如何使用CQLSH执行基本操作。
对于本教程系列,我假设读者可以根据操作系统自行在各自的计算机上安装Cassandra。
Cassandra数据模型
Cassandra数据模型遵循列族方法,可以很容易地理解为与关系表结构类似,但采用NoSQL方式。 下面的描述应该更清楚:
键空间
键空间可以看作是Cassandra中数据的最外层容器。 Cassandra中的所有数据都应位于键空间内。 可以将其视为RDBMS中的数据库,它是表的集合。 对于Cassandra,键空间是列族的集合。
列族
列族可以看作是行的集合,每一行都是列的集合。 它类似于RDBMS中的表,但有一些区别。 定义了列族,但是不必每一行都具有所有列,并且可以根据需要在一行中添加或删除列。
柱
该列是Cassandra中数据的基本单位。 它具有三个值:键或列名,列值和时间戳。
超级柱
超级列是一种特殊类型的列,用于存储其他子列的映射。 由于Cassandra中的每个列族都存储在文件系统上的单个文件中,因此它使存储复杂数据变得更加容易,并且还使得数据获取速度更快。
使用Cassandra控制台
CQLSH是用于通过CQL(Cassandra查询语言)与Cassandra进行交互的标准外壳。 CQL与SQL非常相似(主要用于RDBMS),因此使刚接触Cassandra的开发人员可以轻松地快速使用它。 CQLSH随每个Cassandra软件包一起提供,并且在安装Cassandra时应该已经安装在计算机上。
创建一个键空间
正如我们在上述数据模型中看到的那样, keyspace
是最外面的容器,应该在其他任何东西之前创建。 要创建它,请运行:
$ cqlsh localhost -e "CREATE KEYSPACE IF NOT EXISTS k1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;"
在上面的命令中,我假设您的Cassandra存在于localhost
没有任何用户身份验证。 我创建了一个名为k1
的keyspace
该keyspace
定义了replication
和durable_writes
策略。
如果定义了用户身份验证,则可以运行:
$ cqlsh -u -p localhost -e "CREATE KEYSPACE IF NOT EXISTS k1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;"
在上面的命令中,将
和
替换为您的身份验证凭据。
运行这样的命令可能有点麻烦。 另一种方法是启动CQLSH提示符,然后直接在其中运行查询。
$ cqlsh -u -p localhost
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4]
Use HELP for help.
cassandra@cqlsh> CREATE KEYSPACE IF NOT EXISTS k1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
继续前进,我将使用上述运行查询的方法。 在运行任何其他查询之前,我们需要告诉CQLSH应该使用哪个键空间。
cassandra@cqlsh> USE k1;
cassandra@cqlsh:k1>
可以更改键空间的replication_factor
以适应每个复制class
需要多少复制。
cassandra@cqlsh:k1> ALTER KEYSPACE "k1" WITH REPLICATION =
{ 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
创建和更改表
表等效于Cassandra中的列族。 Cassandra支持许多不同的数据类型来存储数据,在本系列教程的下一部分中将详细介绍。 要创建表,只需运行CREATE TABLE
命令。
cassandra@cqlsh:k1> CREATE TABLE person (
id text,
name text,
surname text,
PRIMARY KEY (id));
要检查表结构在创建后的外观,请执行以下操作:
cassandra@cqlsh:k1> DESCRIBE person;
CREATE TABLE k1.person (
id text PRIMARY KEY,
name text,
surname 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';
现在,我们要更改表以存储该人的电子邮件。
cassandra@cqlsh:k1> ALTER TABLE person ADD email text;
cassandra@cqlsh:k1> DESCRIBE person;
CREATE TABLE k1.person (
id text PRIMARY KEY,
email text,
name text,
surname 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';
插入和更新数据
使用CQL将数据插入Cassandra表非常简单。
cassandra@cqlsh:k1> SELECT * FROM person;
id | email | name | surname
----+-------+------+---------
(0 rows)
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES ('001', 'Shalabh', 'Aggarwal', '[email protected]');
cassandra@cqlsh:k1> SELECT * FROM person;
id | email | name | surname
-----+-----------------------------+---------+----------
001 | [email protected] | Shalabh | Aggarwal
在此表中,我们仅具有一种数据类型的所有字段。 当我们使用不同的数据类型或复合数据类型时,事情变得有些复杂。 这将是本系列下一部分的讨论。
假设我们要将列email
的值更新为其他内容。
cassandra@cqlsh:k1> UPDATE person SET email='[email protected]' WHERE id='001';
cassandra@cqlsh:k1> SELECT * FROM person;
id | email | name | surname
-----+--------------------------+---------+----------
001 | [email protected] | Shalabh | Aggarwal
查询数据
只需使用SELECT
语句即可查询表中的数据。
让我们插入更多记录并查询它们。
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES ('002', 'John', 'Doe', '[email protected]');
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES ('003', 'Harry', 'Potter', '[email protected]');
cassandra@cqlsh:k1> SELECT * from person;
id | email | name | surname
-----+--------------------------+---------+----------
002 | [email protected] | John | Doe
001 | [email protected] | Shalabh | Aggarwal
003 | [email protected] | Harry | Potter
(3 rows)
cassandra@cqlsh:k1> SELECT name FROM person WHERE id='001';
name
---------
Shalabh
(1 rows)
cassandra@cqlsh:k1> SELECT name FROM person WHERE id IN ('001', '002');
name
---------
Shalabh
John
(2 rows)
也可以使用更复杂的查询运算符,例如不等式运算符,或者可以使用AND
/ OR
等连接多个WHERE
条件。
结论
Cassandra是最流行的NoSQL数据库系统之一,并且是在分布式环境中使用的最佳构建。 对于具有RDBMS和SQL知识的初学者来说,与Cassandra进行交易非常容易。
CQL在某种程度上与SQL非常相似,并且CQLSH使测试和调试更加容易。 在本系列的下一部分中,我将介绍Cassandra提供的各种数据类型以及如何处理它们。
翻译自: https://code.tutsplus.com/articles/getting-started-with-cassandra-using-cql-api-and-cqlsh--cms-28026