Cassandra

来源:互联网 发布:电气工程师绘图软件 编辑:程序博客网 时间:2024/04/29 17:52

Cassandra是有FaceBook开发并开源的一个NoSQL分布式存储。目前是Apache基金会下面的一级项目,它的官方网站是http://cassandra.apache.org/。

 

相对于Memcache和Redis这些NoSQL(not SQL)或者说Key-Value存储,Cassandra与MongoDB、HBase在形态在趋于一致,为NoSQL(Not Only SQL)。这是因为Cassandra相对于简单的Key-Value存储,能够支持比较复杂的嵌套结构,有着Cluster、KeySpaces、Column Family、SuperColumn、Column等概念。

 

标准的Column结构图

 

含有 Super Column 的结构图

以上两图来自http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandraxu1/index.html

 

整体结构图

上图来自http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandra/

 

Cluster集群是组网结构名词,由于本文仅讲述新手入门,使用的是单点测试环境,暂不提及这个概念;

KeySpaces相当于关系数据库MySQL中的DataBase的概念,就像DataBase中有多个Table,KeySpaces中含有多个Column Family。你可以把KeySpaces理解为操作表的容器,Cassandra官方建议一个App使用一个KeySpaces。

Column Family相当于MySQL中的Table的概念,同MySQL中的Table一样,ColumnFamily中也含有多个Column。不一样的是,MySQL中的Table的每个Column中有多行(嗯,说每个Table可以有多行更加正确),而ColumnFamily中的Column没有行的概念,ColumnFamily的Row其实也是Column的意思。

Column就是行,Column的Key则是索引键。

Super Column则是拥有Column的超级Column。

 

闲话少说,实践为王。我测试使用的是Linux X64的操作系统。

装载Java JDK,这个网上有教程,其中需要注意的是设置正确JAVA_HOME

 

从官方网站下载下来最新稳定版本Cassandra V0.7.4。压缩包为apache-cassandra-0.7.4-bin.tar.gz,大小为9.796KB。

在Linux操作系统上,使用超级账户将此文件放在/opt或者/app下,由你喜欢。

解压,敲击命令:tar -zxvf apache-cassandra-0.7.4-bin.tar.gz

进入解压后的目录:cd ./apache-cassandra-0.7.4

目录结构为:

======================================

bin                   可执行文件的文件夹
CHANGES.txt
conf                 配置文件的文件夹
interface         
javadoc           javadoc的文件夹,可查看Cassandra的Java document文件
lib                    Cassandra的jar包的文件夹
LICENSE.txt
NEWS.txt
NOTICE.txt
README.txt

======================================

其中,

Cassandra服务器执行文件为./bin/cassandra(Windows环境的执行文件为cassandra.bat)

测试客户端执行文件为./bin/cassandra-cli(Windows环境的执行文件为cassandra-cli.bat)

 

最重要的三个配置文件为:

./conf/cassandra.yaml 配置cassandra的参数

./conf/log4j-server.properties 配置Log日志参数

./bin/cassandra.in.sh 配置操作系统参数和Java的参数

 

由于这里的目的仅仅是感受一下cassandra的使用,且是单点测试,需要注意的参数也只有以下几个:

./conf/cassandra.yaml
data_file_directories: dir path #数据文件存储的位置
commitlog_directory: dir path #commit log日志存储的位置
saved_caches_directory: dir path

rpc_port: 9160 这是客户端连接Cassandra服务器的端口号,当在同一个台物理服务器上启动两个Cassandra端口号必须不一样

storage_port: 7000 这是Cassandra服务器与服务器之间连接的端口号,在这里本无须注意,但是,当同时启动两个Cassandra时,不需要不一样

 

./conf/log4j-server.properties

log4j.appender.R.File=file path #每日轮转日志文件的路径,用于查找问题

 

./bin/cassandra.in.sh

如果.bash_profile或者.bashrc中没有设置JAVA_HOME,可以在这个文件中设置JAVA_HOME,也可以在这个文件中设置JAVA_OPT

 

另外,非常重要的是,由于Cassandra使用的缺省JMX端口号是8080,如果服务器上装载了Apache之类的Web服务器,冲突的可能性非常大(大家都知道8080这个端口号是多么常见)。因此,设置JMX端口号是非常重要的,这里提供一种设置方式:

命令行设置JAVA OPT参数:

./bin/cassandra -Dcom.sun.management.jmxremote.port=JMX端口号

如果你需要远程通过JMX访问cassandra的信息,则需要多设置一个参数:

./bin/cassandra -Dcom.sun.management.jmxremote.port=JMX端口号 -Djava.rmi.server.hostname=服务器外网IP地址

 

如果想看帮助,cassandra服务器请执行./bin/cassandra -h

 

启动cassandra服务器端后,如果在本地测试,可以使用cassandra-cli。

由于我们设置了JMX端口号,所以,执行测试客户端需要如下执行:

./bin/cassandra-cli --jmxport <JMX-PORT>

如果想看帮助,cassandra-cli可以使用./bin/cassandra-cli -?

进入测试客户端交互式界面后,执行?或者help;即可看到所有的命令

 

===================================================

[default@unknown] ?
List of all CLI commands:
?                                                          Display this message.
help;                                                         Display this help.
help <command>;                         Display detailed, command-specific help.
... ...
====================================================

示例:

====================================================

[default@unknown] connect localhost/9160;
Connected to: "Test Cluster" on localhost/9160

[default@unknown] create keyspace MyKeySpace;
d10524e1-4c98-11e1-9eb5-e711f669bbfe

[default@unknown] use MyKeySpace;
Authenticated to keyspace: MyKeySpace

[default@MyKeySpace] create column family MyCF with comparator = UTF8Type;
00419812-2c94-ffe0-9fb5-e799f699bcfc

[default@MyKeySpace] set MyCF['MyKey']['MyColumn'] = 'MyValue';
Value inserted.

[default@MyKeySpace] update column family MyCF with                                                                                       
...     column_metadata =
...     [
...     {column_name: MyColumn, validation_class: UTF8Type}
...     ];
fd98427f-3fa6-11e0-8f42-e734f669bcfc

[default@MyKeySpace] get MyCF['MyKey'];
=> (column=MyColumn, value=MyValue, timestamp=1299904789386000)
Returned 1 results.

[default@MyKeySpace] quit;

====================================================

由于说明很详细,这里仅指出几个比较容易犯的错误。

1.任何命令(?除外)都是以;结束,可以将一个多层嵌套的命令分多行写,这个和MySQL命令行是一致的,但新手确实很容易犯这个错误。

2.创建Column Family(简称cf)时,需要添加"with comparator = 任何你想要的类型"
如:
create column family [cf name] with comparator = UTF8Type;

如果不这样写,缺省为BytesType,则在get命令获得出来的column name(即column=*的结果)为16进制数值;

3.创建Column后,需要执行update column family更新metadata

如:

[default@KeySpace] update column family [cf name] with                                                                                       
...     column_metadata =
...     [
...     {column_name: [col name], validation_class: 你想要的任何类型},
...     ];

如果不这样写,缺省为BytesType,则在get命令获得出来的value(即value=*的结果)为16进制数值;

 

目前支持的类型有:AsciiType, BytesType, LexicalUUIDType,LongType, TimeUUIDType, 和 UTF8Type

 

如果想远程查看Cassandra的状态,则可以通过Jconsole远程查看,如果你本机为Windows,则在运行中执行:jconsole

当JConsole界面出现后,选择远程进程,在下方URL栏填写:service:jmx:rmi:///jndi/rmi://远程IP地址:远程端口号/jmxrmi

如:service:jmx:rmi:///jndi/rmi://127.0.0.1:8080/jmxrmi

点击”连接“即可。正常显示结果如下图所示:

 

参考文档:

官方wiki http://wiki.apache.org/general/

Cassandra 分布式数据库详解,第 1 部分:配置、启动与集群 http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandraxu1/index.html

Cassandra 分布式数据库详解,第 2 部分:数据结构与数据读写 http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandraxu2/index.html

分布式 Key-Value 存储系统:Cassandra 入门 http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandra/