相比之前的Thrift API,CQL为新应用提供了更为简单的接口来访问Cassandra。Thrift API和传统版本的CQL面向的是Cassandra的内部存储结构。新的CQL增加了一个抽象层,隐藏了这种结构的实现细节,并且为集合和其他常见编码提供了本地化的语法,DataStax文档中推荐使用这种方式来访问Cassandra。这种语法跟SQL非常类似,感觉好像在操作关系数据库一样。
有许多方式可以使用CQL,比如之前用过的cqlsh、各种语言客户端驱动,或者DataStax DevCenter等,最简单的方式就是客户端cqlsh了。
其语法如下:
cqlsh [选项] [主机 [端口]]
常用选项如下:
--version 显示cqlsh的版本号并退出
--ssl 使用SSL
-u USERNAME, --username=USERNAME 用户名
-p PASSWORD, --password=PASSWORD 密码
-k KEYSPACE, --keyspace=KEYSPACE 指定keyspace
-f FILE, --file=FILE 从文件执行命令并退出
-e EXECUTE, --execute=EXECUTE 执行语句并退出
更多选项可以使用cqlsh –h 来查看。
Cassandra2.1默认监听localhost,端口9042;如果修改过集群默认配置,比如rpc_address
(conf/cassandra.yaml)这个变量,那么在连接时就需要指定该IP了,如:
登录之后可以尽情的使用TAB键来查看各种命令了,任意时刻都可以用TAB来查看一下当前可用的命令,或者我们可以输入help来查看所有的命令。
这里的命令主要分为两种:一种是shell式命令;另一种是CQL帮助主题,也即CQL相关的操作语句。每个命令都可以用help command 的形式查看详细语法,如:
这无疑是一份很好的命令参考文档。
需要提醒的是,这些命令都不区分大小写,但是cqlsh默认显示为大写,这就要看个人习惯了。
CQL许多语法都可以类比到SQL,虽然它们并不一样,但这种类比未尝不是一种便于理解的方式,别认为这样会产生误导,因为CQL这个东西本身就在向SQL靠拢。
用CQL创建keyspace就好像SQL创建database一样,但还是有些区别的。Cassandra中的keyspace定义数据在节点之间如何复制(分布)。典型地,一个集群中每个应用都有单独的一个keyspace。副本是在每个keyspace基础上来控制的,所以有不同副本需求的数据通常分布在不同的keyspace中。Keyspaces并不是设计用来作为数据模型的重要映射层。Keyspaces是设计用来控制一组列族(表)的数据副本的。
当创建一个keyspace时,需要指定一种复制策略类(strategy class)。SimpleStrategy(简单策略)这个类用来学习Cassandra还是不错的,生产环境或混合工作负载模式下应该使用NetworkTopologyStrategy(网络拓扑策略)类,能够感知数据中心和机架。
创建keyspace的语法如下:
create keyspace
ksname可以是任意字母数字下划线,有必要的话可以加双引号引起来作为字符串;
strategy等属性应该以键值对的形式出现在replication中,不同的策略语法会稍有不同。
注意,你应该记得随时使用help命令来了解一下详细语法。
如果使用SimpleStrategy策略类,并且指定副本因子为1,我们可以这样创建:
create keyspace
如果使用NetworkTopologyStrategy网络拓扑策略,并且数据中心1指定副本因子为2,则可以这样创建:
create keyspace
其中数据中心的名字可以使用nodetool来查询:
$ bin/nodetool status
示例:
cqlsh> create keyspace mykeyspace with replication = {'class':'SimpleStrategy','replication_factor':1};
此时我们可以使用desc keyspaces;来查看一下我们刚创建的keyspace:
创建好后可以使用use命令切换到该keyspace下:
cqlsh> use mykeyspace;
更新跟创建差不多,就把create换成alter即可:
更新副本因子为2:
alter keyspace mykeyspace with replication = {'class':'SimpleStrategy', 'replication_factor' : 2};
修改完后对于每个受影响的节点,需要挨个运行一下nodetool repair,并且需要等一个执行完再执行另一个。
注:副本因子决定一份数据在一个集群中有多少个副本,1代表只有一个节点保存数据,即只有一份数据,该参数是非常重要的,对于系统类的数据(如使用了认证的数据库用户信息)该值应该等于节点数,以确保不会因为单个节点down掉导致无法登录数据库;对于业务数据,应该根据集群的网络拓扑来权衡一个适当的值,以保证系统的高可用。
(待续..)
参考:http://docs.datastax.com/en/cql/3.1/cql/cql_using/about_cql_c.html