Monday, July 26, 2010

如何在 windows 中创建一个 Cassandra 集群

最近在测试 Cassandra 这种分布式的 NoSql 数据库,配置还是有点麻烦。今天总结下具体的配置过程和注意事项,以下是如何在一台PC上运行一个两个节点的 Cassandra 集群。

配置之前,请确保以下必要条件,

  • JDK/JRE, Cassandra 服务端是个 java 程序,你首先要装一个JDK 
    • 32/64 bit jvm
  • 选择好三四个TCP 端口。
    • Cassandra 存储端口 
      • 7000 是默认端口
    • Thrift 侦听端口
      • 用于跟客户端通讯
      • 9160 默认
    • 两个 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...


启动好之后,你可以看到这个结点侦听的端口
image

这里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通过存储端口建立会话
image 
时候就可以看到群集有两个成员了。

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 来查看更细节的信息。如下图

image

 

Now, everything is set. enjoy you exploring.

Saturday, July 24, 2010

windows 7 /ssd 无法启动,停留在CLASSPNP.SYS

有天机器死机后, 我的windows 7 再也无法启动了。我的配置 [ macbook, OCZ 固态硬盘] , 启动的时候按住 F8 ,选择安全模式,也不行。始终是下面的画面,卡死在classpnp.sys  .在硬件没有变化的前提下,这个驱动无法加载,通常是因为这个文件坏掉了。你需要从其他机器上copy一份过来。

接下来是我的修复步骤。

  1. 从一台跟你版本一样的电脑上copy一份Classpnp.sys到优盘或者移动硬盘, 这个文件放在\windows\system32\drivers\classpnp.sys 下面。注意copy一份同样windows版本的,  32位的和64位的是不兼容的。
  2. 找一个启动盘,比如windows的安装盘,用安装盘启动,不需要重新安装电脑。这里只是希望有个机会,我们能够覆盖坏掉的文件
    1. 如果是苹果电脑,记住按住 C 来选择光盘启动。
  3. 当安装画面出来后,
    1. 按住 “shift +F10”, 就会弹出一个命令行窗口。这时候你就可以把优盘上好的classpnp.sys 替换 windows 下面坏掉的。
    2. 去掉硬盘盘,重启
    3. 提示有什么修复的,取消它没有用的。这时候电脑已经好了

 

Shift-F10

Friday, July 23, 2010

如何在 Linux/苹果系统MAC下面,设定多个 IP 地址用于测试 CASSANDRA

当你测试有些NonSQL的数据库比如Cassendra的时候,你需要在一个电脑上设置多个IP地址。Windows 最简单,接下来将一些 在Linux 跟 Mac 上面的设置。加下划线的是需要输入的部分。

  • Linux.
      setup 127.0.0.5 and 127.0.0.100 to Loopback interface


      androiddemo:/home/demouser# ifconfig lo:5 127.0.0.5 netmask 255.0.0.0 up
      androiddemo:/home/demouser# ping 127.0.0.5
      PING 127.0.0.5 (127.0.0.5) 56(84) bytes of data.
      64 bytes from 127.0.0.5: icmp_seq=1 ttl=64 time=0.040 ms
      64 bytes from 127.0.0.5: icmp_seq=2 ttl=64 time=0.025 ms
      ^C
      --- 127.0.0.5 ping statistics ---
      2 packets transmitted, 2 received, 0% packet loss, time 999ms
      rtt min/avg/max/mdev = 0.025/0.032/0.040/0.009 ms
      androiddemo:/home/demouser# ifconfig lo:100 127.0.0.100 netmask 255.0.0.0 up
      androiddemo:/home/demouser# ping 127.0.0.100
      PING 127.0.0.100 (127.0.0.100) 56(84) bytes of data.
      64 bytes from 127.0.0.100: icmp_seq=1 ttl=64 time=0.031 ms
      ^C

  • Macbook
      setup 127.0.0.2 and 127.0.0.3 to loopback interface

      DemoMacbook-MacBook:~ androidyou$ sudo ifconfig lo0
      lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
          inet 127.0.0.1 netmask 0xff000000
          inet6 ::1 prefixlen 128
          inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
      DemoMacbook-MacBook:~ androidyou$ sudo ifconfig lo0 alias 127.0.0.2
      DemoMacbook-MacBook:~ androidyou$ sudo ifconfig lo0 alias 127.0.0.3
      DemoMacbook-MacBook:~ androidyou$ sudo ifconfig lo0
      lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
          inet 127.0.0.1 netmask 0xff000000
          inet6 ::1 prefixlen 128
          inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
          inet 127.0.0.2 netmask 0xff000000
          inet 127.0.0.3 netmask 0xff000000
      DemoMacbook-MacBook:~ androidyou$ ping 127.0.0.3
      PING 127.0.0.3 (127.0.0.3): 56 data bytes
      64 bytes from 127.0.0.3: icmp_seq=0 ttl=64 time=0.040 ms
      64 bytes from 127.0.0.3: icmp_seq=1 ttl=64 time=0.047 ms

 

希望有所帮助:)