要熟悉一个系统,个人认为最好的办法是先把这个系统run起来,对系统有个直观的了解。比如一个存储系统,就可以看看它创建了哪些目录、文件,看看系统的log等。
这篇文章介绍怎样部署一个Cassandra集群,包括从下载、配置到部署。并简单介绍了一些Cassandra附带的工具的使用方法。
下载和解压
从apache站点下载 Cassandra,地址是:http://cassandra.apache.org/download/
下载什么版本
现在Cassandra有两个版本,0.5.1和0.6.0-rc1,0.5.1是release版本,但是稳定性并没有想象中的那么好,比如配置备份数为2的时候就发生过异常。而且当前开发人员的大部分精力都已经集中在0.6和后续的版本上了,所以还是推荐直接下载0.6的版本,因为已经是rc了,所以没有太大的问题。在现在页面选择apache-cassandra-0.6.0-rc1-bin.tar.gz,会进入镜像选择页面,推荐选择renren网的镜像,这里表扬一下renren网,镜像的速度非常快,至少在我这里是这样。
下载后得到的文件是apache-cassandra-0.6.0-rc1- bin.tar.gz,用下面的命令解压
$ tar -zxf apache-cassandra-0.6.0-rc1-bin.tar.gz
Cassandra二进制包的目录结构
解压后目录下除了一些说明、license文件外,包含以下目录:
目录 | 说明 |
bin | 存放操作Cassandra脚本 |
conf | 存放配置文件的目录 |
interface | Cassandra的Thrift接口定义文件,可以用于生成各种语言的接口代码 |
javadoc | 源代码的javadoc,这个建议在部署集群的时候删除,比较大,运行时不需要 |
lib | Cassandra运行时依赖的包 |
部署
部署前的准备
Cassandra使用Java开发,所以部署的机器上需要安装JDK。推荐安装最新版本的JDK。除了JDK外,Cassandra没有其他依赖了。
配置文件修改
默认的日志和数据文件都存放在/var下,这需要超级用户权限才能创建,所以通常我把它修改到用户的主目录下,需要修改的地方包括:
- log4j日志文件路径,位于conf/log4j.properties中,将log4j.appender.R.File项修改为你希望的路径,比如:/home/ruohai/var/cassandra/system.log
- CommitLog路径,位于conf/storage-conf.xml的CommitLogDirectory
- 数据文件路径,位于conf/storage-conf.xml的DataFileDirectories中
除了文件的路径外,我们还需要修改服务监听的地址,包括ListenAddress和ThriftAddress,配置文件默认监听的都是localhost,这些配置也都位于conf/storage-conf.xml文件中。
如果你想修改jvm的参数,比如内存大小,可以在bin目录下的cassandra.in.sh中找到。
修改后conf/storage-conf.xml文件看上去应该像这样:
<CommitLogDirectory>/home/ruohai/var/cassandra/commitlog</CommitLogDirectory> <DataFileDirectories> <DataFileDirectory>/home/ruohai/var/cassandra/data</DataFileDirectory> </DataFileDirectories> <!-- Cassandra节点之间通信的监听地址,这里设置为空,让Cassandra自己使用InetAddress.getLocalHost()去获取地址 --> <ListenAddress></ListenAddress> <!-- 这个是Thrift监听的地址,建议设置为0.0.0.0 --> <ThriftAddress>0.0.0.0</ThriftAddress>
启动单节点
进入bin目录,执行下面命令启动单个节点:
$ ./cassandra
启动多节点集群
在启动多节点集群前,除了刚才修改的配置项外,还有一项需要修改,那就是为集群指定seeds。
Cassandra没有传统集群的中心节点,各个节点地位都是平等的,通过Gossip协议维持集群中的节点信息。为了使集群中的各节点在启动时能发现其他节点,需要指定种子节点(seeds),各节点都先和种子节点通信,通过种子节点获取其他节点列表,然后和其他节点通信。种子节点可以指定多个,通过在conf/storage-conf.xml中的seeds属性配置。
比如我要启动的集群包括192.168.1.1 – 192.168.1.8,那么我可以指定种子节点为:
<Seeds> <Seed>192.168.1.1</Seed> <Seed>192.168.1.5</Seed> </Seeds>
配置了seeds信息后,就可以启动各个节点了,启动方法和启动单个节点一样,也是执行bin目录下的cassandra脚本。
使用Cassandra附带的脚本和集群交互
Cassandra附带了一些脚本,可以用于和集群交互,常用的有nodetool和cassandra-cli两个。
nodetool
nodetool是一个很强大的工具,这里只简单介绍一些查看集群信息的命令,详细的命令可以参见工具的帮助信息。
运行nodetool需要指定host和port,port默认是8080,这个端口是Cassandra的jmx端口,nodetool通过jmx获取信息,端口可以在bin/cassandra.in.sh中修改。
ring命令
ring命令用于查看集群的节点信息,ring来源于consistent hash,在consistent hash中,各个节点组成一个环,通常称为ring。
ring命令的输出中包括当前集群的节点,各个节点的状态(Up还是Down),节点的load(数据量),节点在ring上的位置等信息。
$ ./nodetool -host 192.168.1.2 -port 8080 ring
Address Status Load Range Ring
168284559435902509512840950520136104633
192.168.1.6 Up 725 bytes 36700049424802292574986974699889333152 |<–|
192.168.1.4 Up 725 bytes 45197454859393203424758350502301999985 | ^
192.168.1.2 Up 1.06 KB 70289627796959232119663916763545648891 v |
192.168.1.3 Up 725 bytes 86978082336750239587912071897375514499 | ^
192.168.1.7 Up 1.09 KB 94473247289709371297029329870554724753 v |
192.168.1.5 Up 725 bytes 132989832607711424907752773015685901277 | ^
192.168.1.1 Up 725 bytes 137175077128468538539167579258866491451 v |
192.168.1.8 Up 1.08 KB 168284559435902509512840950520136104633 |–>|
info命令
info命令用于显示一个节点的信息,包括当前的load(数据量),运行时间,内存使用情况等。
$ ./nodetool -host 192.168.1.2 -port 8080 info 70289627796959232119663916763545648891 Load : 0 bytes Generation No : 1270871149 Uptime (seconds) : 323 Heap Memory (MB) : 34.39 / 3071.38
cfstats
cfstats — 查看各个column family的详细信息,包括读写次数、响应时间、memtable、sstable等。
cassandra-cli
cassandra-cli是一个很好用的客户端命令行,它使用thrift和服务器通信,能完成get/put/remove操作,并能查看配置信息,keyspace描述等。更为难得的是,这个使用java写的工具支持命令补全、历史命令等特性,这归功于开发人员使用了jline 这个包。
cassandra-cli需要提供两个参数,host和port,这里的port是thrift的监听端口,默认是9160。
下面显示一些基本的用法,进去cli后,输入? 获取详细的帮助信息。
$ ./cassandra-cli -host 192.168.1.2 -port 9160
Connected to: “Test Cluster” on 192.168.1.2/9160
Welcome to cassandra CLI.
Type ‘help’ or ‘?’ for help. Type ‘quit’ or ‘exit’ to quit.
cassandra> show cluster name
Test Cluster
cassandra> show keyspaces
Keyspace1
system
definitions
cassandra> set Keyspace1.Standard
set Keyspace1.Standard1 set Keyspace1.Standard2 set Keyspace1.StandardByUUID1
cassandra> set Keyspace1.Standard1['key_1']['column_1'] = ‘value_1′
Value inserted.
cassandra> set Keyspace1.Standard1['key_1']['column_2'] = ‘value_2′
Value inserted.
cassandra> set Keyspace1.Standard1['key_2']['column_1'] = ‘value_1′
Value inserted.
cassandra> get Keyspace1.Standard1['key_1']
=> (column=636f6c756d6e5f32, value=value_2, timestamp=1270873106569000)
=> (column=636f6c756d6e5f31, value=value_1, timestamp=1270873099998000)
Returned 2 results.
cassandra> count Keyspace1.Standard1['key_1']
2 columns
cassandra> del Keyspace1.Standard1['key_1']['column_1']
column removed.
cassandra> count Keyspace1.Standard1['key_1']
1 columns
cassandra> get Keyspace1.Standard1['key_1']
=> (column=636f6c756d6e5f32, value=value_2, timestamp=1270873106569000)
Returned 1 results.
cassandra> quit
{完}