跳至主要内容

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.

评论

此博客中的热门博文

在家用PC里体验 FreeBSD 8.1(上)

F reeBSD ( http://www.freebsd.org/ ) 是一个开源免费的操作系统,最早接触FreeBSD是约7年前在 @hplcsz 挂bbs的服务器,后来很少关注了,最近接触到 Apple 的 MacOS 和 iOS (基于FreeBSD衍生出来的操作系统)联想起FreeBSD项目,才发现它已经更新到8.1版了。 恰好家里多出一台电脑暂时没有用,于是尝试用FreeBSD 8.1配置一台适合家用的电脑(用来看看新闻灌灌水的那种),于是有了如下一篇文章。 (注:这里假设读者已经有一定的Linux/BSD基础) 首先访问 FreeBSD 项目的官方网站,下载 FreeBSD 8.1的安装镜像文件( ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.1/ ),这里提供CD版、DVD版和U盘版,考虑到我有DVD刻录机,所以下载了DVD版。 下载过程是一个漫长的等待,期间强烈推荐阅读一下官方的《FreeBSD使用手册》(中文版,以下简称《使用手册》)( http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/index.html ),如果对Linux/BSD不是很熟悉,前3章是很有必要阅读的,否则会被折腾到2012年。等待DVD镜像下载完,大概已经看到第10章了。 1、安装 FreeBSD 8.1 刻录下载回来的DVD镜像文件,从光驱启动然后选择“Quick模式”即开始安装过程。结合《使用手册》一般没有多大问题,因为这篇文章重点是如何搭建家用PC的环境,所以具体的安装过程这里就省略了。小技巧: A、 FreeBSD 必须安装在主分区,在安装之前你必须腾出一个至少10来GB的主分区。 B、 当安装问你是否安装“Ports(相当于软件商店、软件中心)”时,要选择“YES”。 C、 当安装接近完成时,程序会问你 “Would you like to browse the collection now?“,这一步是问你是否安装DVD上附带的软件,选择Yes,然后把下面这两个大块头选中,这样能避免从网络下载桌面环境的安装文件,节省时间和网络流量,减低碳排放: + X11/xorg-7.5 + gnome/gnom

使用 Sendmail 在 CentOS 5.5 架设邮件服务器

假如你要架设一个有会员管理的网站,可能会遇到诸如“我忘记密码了”、“你有一年没来过了,有空过来瞧瞧吧”这类的问题,一般这类问题都是使用邮件解决的,比如发送一个重置密码的链接或者发送一封提醒邮件。 发送邮件的方法有很多,比如使用外面专业SMTP中继服务(一般收费惊人)、使用类似 Google Apps (Free) 的免费邮件发送服务(限制比较多,比如一天不能超过500封等),而比较廉价且彻底的解决方法应该是在自己的服务器上搭建邮件服务器(SMTP服务器)。假如你使用的是 Linux 系统,那么一般邮件服务器早已安装好了,比如 CentOS(RedHat、Fedora等)内置的  Sendmail 服务程序,你只需设置几下即可使用。 1、域名的设置 首先你要设置域名DNS的MX记录和SPF记录,一般我们只要有如下几条DNS记录就可以了: 记录类型    主机名   目标 ------------------------------------ A                  @           123.123.123.123 (这里应该是你的服务器IP) CNAME      www       your-domain.com CNAME      SMTP      your-domain.com MX              @            smtp.your-domain.com TXT              @            v=spf1 a mx ~all MX记录是邮件服务器必须依赖的,而TXT(SPF)是用来防止自己的邮件服务器发送的邮件不被当成垃圾邮件(spam email),假如不增加这条记录的话对方邮箱服务要么把你的邮件直接丢弃、要么塞到垃圾邮件文件夹里,所以这条记录也是必不可少的,更多的SPF设置方法参阅这里: http://www.openspf.org/ 2、设置 Sendmail 我现在使用的 Sendmail 版本是 8.14,设置方法已经变得非常简单了,首先确保你系统已经有 sendmail 及其相关服务了: #yum install sendmail  (这个必须的) #yum install sendmail-cf #yum install send

日志工具 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 又会根据绑定器把日志交给具体的日志实现工具。过程如下