Apache Cassandra 的集群配置
Apache Cassandra 是 NoSQL 阵营产品中重要的成员之一,因为 Cassandra 使用了去中心化的模式(类似 memcached), 因此使用它搭建集群非常简单。下面简述使用 Cassandra 0.7 搭建集群的过程。
1、基本配置
首先需要准备3台或以上的计算机。下面假定有3台运行 Linux 操作系统的计算机,IP地址分别为 192.168.0.100, 192.168.0.101 和 192.168.0.102。 系统需要安装好 Java 运行时环境,然后到这里下载 0.7 版本的 Cassandra 二进制发行包。
挑选其中的一台机开始配置,先展开 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 监听一台机器所有的网络接口。
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.