最近在测试 Cassandra 这种分布式的 NoSql 数据库,配置还是有点麻烦。今天总结下具体的配置过程和注意事项,以下是如何在一台PC上运行一个两个节点的 Cassandra 集群。
配置之前,请确保以下必要条件,
- JDK/JRE, Cassandra 服务端是个 java 程序,你首先要装一个JDK
- 选择好三四个TCP 端口。
- Cassandra 存储端口
- Thrift 侦听端口
- 两个 JMX 监控的端口, 8080/ 9080
- JWDP 调试端口(可选)
- 需要两个 IP 地址
接下来,我们创建一个两个节点名字为 HelloCassendra 的群集。
- 下载cassandra的压缩文件 http://cassandra.apache.org/ , 我用的是 版本 0.6.3.
- 解压缩到 本地文件夹,比如 C:\apache-cassandra-0.6.3
- 复制 Conf 文件夹,两份Copy,分别为Conf1,conf2. 每个文件夹对应一个节点。
- C:\apache-cassandra-0.6.3\conf1
- C:\apache-cassandra-0.6.3\conf2
- 到文件夹 conf1 下面, 修改节点1的配置(Cassandra 使用一种gossip 集群协议,需要有一些种子节点,我们配置节点1为种子节点)
- C:\apache-cassandra-0.6.3\conf1\log4j.properties
- # Edit the next line to point to your logs directory
log4j.appender.R.File=/var/log/cassandra/system.log - 改为 =/var/log/cassandra/c1/system.log
- 这样会把log写道C1的目录 c:/var/log/cassandra/c1/system.log
- C:\apache-cassandra-0.6.3\conf1\storage-conf.xml
- 把群集名字改为 HelloCassandra
- <ClusterName>
Test Cluster</ClusterName> - <ClusterName>HelloCassandra</ClusterName>
- 改一下放置Log和数据的文件夹
- <CommitLogDirectory>/var/lib/cassandra/C1/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>/var/lib/cassandra/C1/data</DataFileDirectory>
</DataFileDirectories>
- 把Localhost 替换为 127.0.0.1.
- <ListenAddress>127.0.0.1</ListenAddress>
- <ThriftAddress>127.0.0.1</ThriftAddress>
- 到文件夹 conf2 下面, 修改节点2的配置(Cassandra 使用一种gossip 集群协议,需要有一些种子节点,我们配置节点2为普通节点,通过给节点1通讯来建立群集)
- C:\apache-cassandra-0.6.3\conf2\log4j.properties
- # Edit the next line to point to your logs directory
log4j.appender.R.File=/var/log/cassandra/system.log - =/var/log/cassandra/c2/system.log
- 这样节点log写到C2目录 c:/var/log/cassandra/c2/system.log
- C:\apache-cassandra-0.6.3\conf2\storage-conf.xml
- 群集名字修改为HelloCassandra
- <ClusterName>
Test Cluster</ClusterName> - <ClusterName>HelloCassandra</ClusterName>
- 修改 commitlogdirectory and DataFileDirectory 文件夹
- <CommitLogDirectory>/var/lib/cassandra/C2/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>/var/lib/cassandra/C3/data</DataFileDirectory>
</DataFileDirectories>
- 把localhost 替换为 127.0.0.2 ,每个节点需要不同的IP地址。节点2 使用127.0.0.2.
- <ListenAddress>127.0.0.2</ListenAddress>
- <ThriftAddress>127.0.0.2</ThriftAddress>
- 启动AutoBootTrap模式,自动从其他节点分配数据
- <AutoBootstrap>false</AutoBootstrap>
- 到文件 C:\apache-cassandra-0.6.3\bin 下面, 复制 cassandra.bat ,另存为 c1.bat, c2.bat.每一个批处理文件对应一个实例的启动脚本。
- C:\apache-cassandra-0.6.3\bin\c1.bat
- C:\apache-cassandra-0.6.3\bin\c2.bat
- 编辑 c1.bat,指向Conf1目录下面的配置,修改JMX 端口以及调试端口。这里我们禁用调试
- if NOT DEFINED CASSANDRA_CONF set CASSANDRA_CONF=%CASSANDRA_HOME%\conf
- if NOT DEFINED CASSANDRA_CONF set CASSANDRA_CONF=%CASSANDRA_HOME%\conf1
- 删除调试这一行
-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n^ - 对于实例1,保持默认端口8080
- -Dcom.sun.management.jmxremote.port=8080^
- 编辑 c2.bat,指向Conf2目录下面的配置,修改JMX 端口以及调试端口。这里我们禁用调试
- if NOT DEFINED CASSANDRA_CONF set CASSANDRA_CONF=%CASSANDRA_HOME%\conf
- if NOT DEFINED CASSANDRA_CONF set CASSANDRA_CONF=%CASSANDRA_HOME%\conf2
- 删除调试这一行
-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n^
- 对于实例2,替换默认端口为9080
- -Dcom.sun.management.jmxremote.port=9080^
- 准备启动两个批处理。
启动C1.bat,你可以看到他是个Seed 节点。
Starting Cassandra Server INFO 16:04:31,597 Auto DiskAccessMode determined to be mmap INFO 16:04:31,909 Saved Token not found. Using 22656600690150525193669162742751150004 INFO 16:04:31,909 Saved ClusterName not found. Using HelloCassandra INFO 16:04:31,909 Creating new commitlog segment /var/lib/cassandra/c1/commitlog\CommitLog-1280185471909.log INFO 16:04:31,987 LocationInfo has reached its threshold; switching in a fresh Memtable at CommitLogContext(file='/var/lib/cassandra/c1/commitlog\C INFO 16:04:31,987 Enqueuing flush of Memtable-LocationInfo@1351579886(171 bytes, 4 operations) INFO 16:04:31,987 Writing Memtable-LocationInfo@1351579886(171 bytes, 4 operations) INFO 16:04:32,236 Completed flushing C:\var\lib\cassandra\c1\data\system\LocationInfo-1-Data.db INFO 16:04:32,283 Starting up server gossip INFO 16:04:32,299 This node will not auto bootstrap because it is configured to be a seed node. INFO 16:04:32,346 Binding thrift service to /127.0.0.1:9160 INFO 16:04:32,346 Cassandra starting up... |
启动好之后,你可以看到这个结点侦听的端口
这里7000是存储端口,8080是jmx端口,9160 是Thrift 端口。
这时候cluster中只有一个节点
C:\apache-cassandra-0.6.3>bin\nodetool --host 127.0.0.1 --port 8080 ring Starting NodeTool Address Status Load Range Ring 127.0.0.1 Up 497 bytes 22656600690150525193669162742751150004 |<--| |
然后启动c2.bat,这里可能要等120秒。90秒load配置,30秒来分配数据
Starting Cassandra Server INFO 16:11:58,940 Auto DiskAccessMode determined to be mmap INFO 16:11:59,237 Saved Token not found. Using 168810650452358861593947197964955051846 INFO 16:11:59,252 Saved ClusterName not found. Using HelloCassandra INFO 16:11:59,252 Creating new commitlog segment /var/lib/cassandra/c2/commitlog\CommitLog-1280185919252.log INFO 16:11:59,315 LocationInfo has reached its threshold; switching in a fresh Memtable at CommitLogContext(file='/var/lib/cassandra/c2/commitlog\Com INFO 16:11:59,315 Enqueuing flush of Memtable-LocationInfo@625647261(171 bytes, 4 operations) INFO 16:11:59,315 Writing Memtable-LocationInfo@625647261(171 bytes, 4 operations) INFO 16:11:59,564 Completed flushing C:\var\lib\cassandra\c2\data\system\LocationInfo-1-Data.db INFO 16:11:59,596 Starting up server gossip INFO 16:11:59,627 Joining: getting load information INFO 16:11:59,627 Sleeping 90000 ms to wait for load information... INFO 16:12:01,577 Node /127.0.0.1 is now part of the cluster INFO 16:12:02,592 InetAddress /127.0.0.1 is now UP INFO 16:12:02,592 Started hinted handoff for endPoint /127.0.0.1 INFO 16:12:02,607 Finished hinted handoff of 0 rows to endpoint /127.0.0.1 INFO 16:13:29,657 Joining: getting bootstrap token INFO 16:16:44,916 New token will be 107727192420385141059512814600693202868 to assume load from /127.0.0.1 INFO 16:16:44,931 Joining: sleeping 30000 ms for pending range setup INFO 16:17:14,952 Bootstrapping INFO 16:17:15,030 Bootstrap/move completed! Now serving reads. INFO 16:17:15,108 Binding thrift service to /127.0.0.2:9160 INFO 16:17:15,108 Cassandra starting up... |
在看tcpview,你可以看到两个ip通过存储端口建立会话
时候就可以看到群集有两个成员了。
C:\apache-cassandra-0.6.3>bin\nodetool --host 127.0.0.1 --port 8080 ring Starting NodeTool Address Status Load Range Ring 107727192420385141059512814600693202868 127.0.0.1 Up 497 bytes 22656600690150525193669162742751150004 |<--| 127.0.0.2 Up 497 bytes 107727192420385141059512814600693202868 |-->| |
你也可以用jconsole,端口8080/9080 来查看更细节的信息。如下图
Now, everything is set. enjoy you exploring.