跳至主要内容

Apache Cassandra 0.7 的集群配置

Hadoop/HBase 一样,Apache Cassandra 也是 NoSQL 产品中最为重要的成员之一,跟 HBase 相比,因为 Cassandra 使用了一种去中心化的模式(类似memcached集群), 使用 Cassandra 搭建 NoSQL 集群更为简单容易,特别是在 0.7 版本之后,下面简述使用 Cassandra 0.7 搭建一个集群。@ivarptr

前提条件
a、准备3台或以上的计算机。下面假设有3台运行Linux操作系统的计算机,局域网的IP地址分别为 192.168.0.100, 192.168.0.101 和 192.168.0.102。
b、Java 1.6。
c、到这里下载 0.7.x 版本的Cassandra 二进制发行包。

1、基本配置

挑选其中的一台机开始配置,先展开 cassandra 发行包:
$ tar -zxvf apache-cassandra-$VERSION.tar.gz
$ cd apache-cassandra-$VERSION

其中的 conf/cassandra.yaml 文件为主要配置文件,由于 0.7 版不再采用XML格式配置文件,如果对 YAML 格式不熟悉的话最好先到这里了解一下。

Cassandra 在配置文件里默认设定了几个目录:

data_file_directories: /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches


data_file_directories 可以一次同时设置几个不同目录,cassandra 会自动同步所有目录。另外在日志配置文件 log4j-server.properties 也有一个默认设定日志文件的目录:
log4j.appender.R.File=/var/log/cassandra/system.log

一般情况下采用默认的配置即可,除非你有特殊的数据储存要求,所以现在有两种方案:一是按照默认配置创建相关的目录,二是修改配置文件采用自己指定的目录。
下面为了简单起见采用第一种方案:

$ sudo mkdir -p /var/log/cassandra
$ sudo chown -R `whoami` /var/log/cassandra
$ sudo mkdir -p /var/lib/cassandra
$ sudo chown -R `whoami` /var/lib/cassandra


上面的 `whoami` 是 Linux 指令用于获取当前登录的用户名,如果你不准备用当前登录用户运行 Cassandra,那么需要把 `whoami` 替换成具体的用户名。

2、有关集群的配置

由于 Cassandra 采用去中心化结构,所以当集群里的一台机器(节点)启动之后需要一个途径通知当前集群,Cassandra 的配置文件里有一个 seeds 的设置项,所谓的 seeds 就是能够联系集群中所有节点的一台机器,假如集群中所有的节点位于同一个机房同一个子网,那么只要随意挑选几台运行比较稳定的机器即可。在当前的例子中因为只有3台机器,所以我挑选第一台作为种子节点,配置如下:

seeds:
    - 192.168.0.100

然后配置节点之前通信的IP地址:
listen_address: 192.168.0.100

需要注意的是这里必须使用具体的IP地址,而不能使用 0.0.0.0 这样的地址。

配置 Cassandra Thrift 客户端(应用程序)访问的IP地址:
rpc_address: 192.168.0.100

这项可以使用 0.0.0.0 监听一台机器所有的网络接口,不过为了明确起见,这里仍然指定具体的IP地址。Cassandra 的 Keyspaces 和 ColumnFamilies 不再需要配置了,他们需要在运行时创建和维护。
把配置好的 Cassandra 复制到第2和第3台机器,同时创建相关的目录,还需要修改 listen_address 和 rpc_address 为实际机器的IP地址。至此所有的配置完成了。

3、启动 Cassandra 各个节点以及集群管理

启动顺序没什么所谓,只要保证最终种子节点启动就可以了:
$ bin/cassandra -f

参数 -f 的作用是让 Cassandra 以前端程序方式运行,这样有利于调试和观察日志信息,而在实际生产环境中这个参数是不需要的(即 Cassandra 会以 daemon 方式运行)。

所有节点启动后可以通过 bin/nodetool 工具管理集群,比如查看所有节点运行情况:


$ bin/nodetool -host 192.168.0.101 ring
Address         Status State   Load            Owns    Token                                    
                                                       159559...  
192.168.0.100   Up     Normal  49.27 KB        39.32%  563215...    
192.168.0.101   Up     Normal  54.42 KB        16.81%  849292...    
192.168.0.102   Up     Normal  73.14 KB        43.86%  159559...


命令中 -host 参数用于指定 nodetool 跟哪一个节点通信,对于 nodetool ring 命令来说,跟哪个节点通信都没有区别,所以可以随意指定其中一个节点。
从上表可以看到运行中的节点是否在线、State、数据负载量以及节点Token(可以理解为节点名称,这个是节点第一次启动时自动产生的)。我们可以使用 nodetool 组合 token 对具体节点进行管理,比如查看指定节点的详细信息:


$ bin/nodetool -host 192.168.0.101 info
84929280487220726989221251643883950871
Load             : 54.42 KB
Generation No    : 1302057702
Uptime (seconds) : 591
Heap Memory (MB) : 212.14 / 1877.63

查看指定节点的数据结构信息:

$ bin/nodetool -host 192.168.0.101 cfstats
Keyspace: Keyspace1
Read Count: 0
Write Count: 0
Pending Tasks: 0
Column Family: CF1
SSTable count: 1
…………

移除一个已经下线的节点(比如第2台机器关机了或者坏掉了)

$ bin/nodetool -host 192.168.0.101 removetoken 84929280487220726989221251643883950871

下了线的节点如何重新上线呢?什么都不用做,再次运行 Cassandra 程序它就会自动加入集群了。

在实际运作中我们可能会需要隔一段时间备份一次数据(创建一个快照),这个操作在 Cassandra 里非常简单:
$ bin/nodetool -host 192.168.0.101 snapshot

4、测试数据的读写

使用客户端组件加单元测试是首选的,如果仅想知道集群是否正常读写数据,可以用cassandra-cli 作一个简单测试:

$ bin/cassandra-cli -host 192.168.0.101
create keyspace Keyspace1;
use Keyspace1;
create column family Users with comparator=UTF8Type and default_validation_class=UTF8Type;
set Users[jsmith][first] = 'John';
set Users[jsmith][last] = 'Smith';
get Users[jsmith];

上面我们创建了一个名为“Keyspace1”的 keyspace,还创建了一个名为“Users”的 Column Family,最后向 Users 添加了一个 item。正常的话应该看到类似下面的结果:
=> (column=first, value=John, timestamp=1302059332540000)
=> (column=last, value=Smith, timestamp=1300874233834000)
Returned 2 results.

评论

此博客中的热门博文

日志工具 SLF4J 的来龙去脉

J ava 界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j ,许多应用程序的日志部分都交给了 log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很多其他很多日志工具,假如一个应用程序用到了两个组件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了。 为了解决这个问题, Apache Commons Logging  (之前叫 Jakarta Commons Logging,JCL)粉墨登场,JCL 只提供 log 接口,具体的实现则在运行时动态寻找。这样一来组件开发者只需要针对 JCL 接口开发,而调用组件的应用程序则可以在运行时搭配自己喜好的日志实践工具。 所以即使到现在你仍会看到很多程序应用 JCL + log4j 这种搭配,不过当程序规模越来越庞大时,JCL的动态绑定并不是总能成功,具体原因大家可以 Google 一下,这里就不再赘述了。解决方法之一就是在程序部署时静态绑定指定的日志工具,这就是  SLF4J  产生的原因。 跟 JCL 一样,SLF4J 也是只提供 log 接口,具体的实现是在打包应用程序时所放入的 绑定器 (名字为 slf4j-XXX-version.jar)来决定,XXX 可以是 log4j12, jdk14, jcl, nop 等,他们实现了跟具体日志工具(比如 log4j)的绑定及代理工作。举个例子:如果一个程序希望用 log4j 日志工具,那么程序只需针对 slf4j-api 接口编程,然后在打包时再放入 slf4j-log4j12-version.jar 和 log4j.jar 就可以了。 现在还有一个问题,假如你正在开发应用程序所调用的组件当中已经使用了 JCL 的,还有一些组建可能直接调用了 java.util.logging,这时你需要一个 桥接器 (名字为 XXX-over-slf4j.jar)把他们的日志输出重定向到 SLF4J,所谓的桥接器就是一个假的日志实现工具,比如当你把 jcl-over-slf4j.jar 放到 CLASS_PATH 时,即使某个组件原本是通过 JCL 输出日志的,现在却会被 jcl-over-slf4j “骗到”SLF4J 里,然后 SLF4J 又会根据绑定器把日志交给具体的...

如何在应用程序里使用 Hadoop HDFS ——分布式计算Hadoop配置及实践(二)

上一篇 讲到 Hadoop 的配置,我们在搭建分布式计算系统的同时也已经搭建好分布式储存系统了。下面简述如何在应用程序(可以是 Console Application,也可以是 Web Application)调用 Hadoop HDFS。 我们除了可以使用 Hadoop 命令行 管理里面的文件和目录之外,也可以通过 Hadoop API 管理。 1、先创建一个Java Application (Console) 程序,然后引用 hadoop-core-0.20.2.jar ,因为这个包同时引用非常多其他包,所以最好使用 Maven 引用这个包。 2、在项目根目录创建 core-site.xml : <?xml version="1.0"?> <configuration> <property>   <name>fs.default.name</name>   <value>hdfs://192.168.0.10:9000</value> </property> </configuration> 程序会自动寻找 CLASS_PATH 里面的 core-site.xml 文件,假如缺少这个文件的话,程序会使用本地文件系统。 3、创建 Helloworld.java: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HelloWorld { public static void main(String[] args) { try { HelloWorld helloWorld = new He...