Apache Cassandraをインストールしてみた。

事前準備

Java >= 1.6 である必要があるので、インストールしておく。

$ chmod 755 sudo ./jdk-6u20-linux-i586-rpm.bin 
$ sudo ./jdk-6u20-linux-i586-rpm.bin 
$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)

インストール

公式サイトからApache-Cassandraをダウンロードする。(今回選んだのはBinaryの方)

現時点でのバージョンは、0.6.1 なので、以降はそのバージョンで話を進めます。

$ tar zxvf apache-cassandra-0.6.1-bin.tar.gz
$ cd apache-cassandra-0.6.1
$ 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

/usr/local/以下に配置する。

$ sudo mv apache-cassandra-0.6.1 /usr/local/
$ cd /usr/local/
$ sudo ln -s apache-cassandra-0.6.1 cassandra

環境変数をセットする。

CASSANDRA_HOME=/usr/local/cassandra
PATH=$PATH:$CASSANDRA_HOME/bin

ストレージの設定は、$CASSANDRA_HOME/conf/storage-conf.xml になるっぽいので、ざっと目を通す。コメントアウト部分を外すとこんな感じ。

<Storage>
  <!--======================================================================-->
  <!-- Basic Configuration                                                  -->
  <!--======================================================================-->

  <ClusterName>Test Cluster</ClusterName>
  <AutoBootstrap>false</AutoBootstrap>

  <Keyspaces>
    <Keyspace Name="Keyspace1">
      <ColumnFamily Name="Standard1" CompareWith="BytesType"/>
      <ColumnFamily Name="Standard2" 
                    CompareWith="UTF8Type"
                    KeysCached="100%"/>
      <ColumnFamily Name="StandardByUUID1" CompareWith="TimeUUIDType" />
      <ColumnFamily Name="Super1"
                    ColumnType="Super"
                    CompareWith="BytesType"
                    CompareSubcolumnsWith="BytesType" />
      <ColumnFamily Name="Super2"
                    ColumnType="Super"
                    CompareWith="UTF8Type"
                    CompareSubcolumnsWith="UTF8Type"
                    RowsCached="10000"
                    KeysCached="50%"
                    Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>
      <ReplicaPlacementStrategy>org.apache.cassandra.locator.RackUnawareStrategy</ReplicaPlacementStrategy>
      <ReplicationFactor>1</ReplicationFactor>
      <EndPointSnitch>org.apache.cassandra.locator.EndPointSnitch</EndPointSnitch>
    </Keyspace>
  </Keyspaces>

  <Authenticator>org.apache.cassandra.auth.AllowAllAuthenticator</Authenticator>
  <Partitioner>org.apache.cassandra.dht.RandomPartitioner</Partitioner>
  <InitialToken></InitialToken>
  <CommitLogDirectory>/var/lib/cassandra/commitlog</CommitLogDirectory>
  <DataFileDirectories>
      <DataFileDirectory>/var/lib/cassandra/data</DataFileDirectory>
  </DataFileDirectories>
  <Seeds>
      <Seed>127.0.0.1</Seed>
  </Seeds>
  <RpcTimeoutInMillis>10000</RpcTimeoutInMillis>
  <CommitLogRotationThresholdInMB>128</CommitLogRotationThresholdInMB>
  <ListenAddress>localhost</ListenAddress>
  <StoragePort>7000</StoragePort>
  <ThriftAddress>localhost</ThriftAddress>
  <ThriftPort>9160</ThriftPort>
  <ThriftFramedTransport>false</ThriftFramedTransport>

  <!--======================================================================-->
  <!-- Memory, Disk, and Performance                                        -->
  <!--======================================================================-->

  <DiskAccessMode>auto</DiskAccessMode>
  <RowWarningThresholdInMB>512</RowWarningThresholdInMB>
  <SlicedBufferSizeInKB>64</SlicedBufferSizeInKB>
  <FlushDataBufferSizeInMB>32</FlushDataBufferSizeInMB>
  <FlushIndexBufferSizeInMB>8</FlushIndexBufferSizeInMB>
  <ColumnIndexSizeInKB>64</ColumnIndexSizeInKB>
  <MemtableThroughputInMB>64</MemtableThroughputInMB>
  <BinaryMemtableThroughputInMB>256</BinaryMemtableThroughputInMB>
  <MemtableOperationsInMillions>0.3</MemtableOperationsInMillions>
  <MemtableFlushAfterMinutes>60</MemtableFlushAfterMinutes>
  <ConcurrentReads>8</ConcurrentReads>
  <ConcurrentWrites>32</ConcurrentWrites>
  <CommitLogSync>periodic</CommitLogSync>
  <CommitLogSyncPeriodInMS>10000</CommitLogSyncPeriodInMS>
  <GCGraceSeconds>864000</GCGraceSeconds>

</Storage>

とりあえず起動してみる。

$ cassandra -f
 INFO 16:35:42,332 Auto DiskAccessMode determined to be standard
 INFO 16:35:43,246 Sampling index for /var/lib/cassandra/data/system/LocationInfo-1-Data.db
 INFO 16:35:43,285 Replaying /var/lib/cassandra/commitlog/CommitLog-1274767896157.log
 INFO 16:35:43,290 Log replay complete
 INFO 16:35:43,473 Saved Token found: 159732309793964689006434948302307938157
 INFO 16:35:43,477 Saved ClusterName found: Test Cluster
 INFO 16:35:43,487 Creating new commitlog segment /var/lib/cassandra/commitlog/CommitLog-1274772943487.log
 INFO 16:35:43,536 Starting up server gossip
 INFO 16:35:43,717 Binding thrift service to localhost/127.0.0.1:9160
 INFO 16:35:43,856 Cassandra starting up...

無事に起動したっぽい。ログが /var/log/cassandra/system.log に出力されていることを確認する。

$ cat /var/log/cassandra/system.log 
 INFO [main] 2010-05-25 16:35:42,332 DatabaseDescriptor.java (line 229) Auto DiskAccessMode determined to be standard
 INFO [main] 2010-05-25 16:35:43,246 SSTableReader.java (line 124) Sampling index for /var/lib/cassandra/data/system/LocationInfo-1-Data.db
 INFO [main] 2010-05-25 16:35:43,285 CommitLog.java (line 166) Replaying /var/lib/cassandra/commitlog/CommitLog-1274767896157.log
 INFO [main] 2010-05-25 16:35:43,290 CommitLog.java (line 169) Log replay complete
 INFO [main] 2010-05-25 16:35:43,473 SystemTable.java (line 164) Saved Token found: 159732309793964689006434948302307938157
 INFO [main] 2010-05-25 16:35:43,477 SystemTable.java (line 179) Saved ClusterName found: Test Cluster
 INFO [main] 2010-05-25 16:35:43,487 CommitLogSegment.java (line 50) Creating new commitlog segment /var/lib/cassandra/commitlog/CommitLog-1274772943487.log
 INFO [main] 2010-05-25 16:35:43,536 StorageService.java (line 317) Starting up server gossip
 INFO [main] 2010-05-25 16:35:43,717 CassandraDaemon.java (line 108) Binding thrift service to localhost/127.0.0.1:9160
 INFO [main] 2010-05-25 16:35:43,856 CassandraDaemon.java (line 148) Cassandra starting up...

起動した状態だと、commitlogとdataという2つのディレクトリが作成される。(storage-conf.xml の設定通り)

$ tree /var/lib/cassandra/
/var/lib/cassandra/
|-- commitlog
|   `-- CommitLog-1274767896157.log
`-- data
    |-- Keyspace1
    `-- system

4 directories, 1 file

ターミナル上から接続してみる。

$ cassandra-cli --host localhost --port 9160
Connected to: "Test Cluster" on localhost/9160
Welcome to cassandra CLI.

Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
cassandra> 

データを投入し、データ内容を確認してみる。

cassandra> set Keyspace1.Standard2['miyazakiaoi']['first'] = 'Aoi'
Value inserted.
cassandra> set Keyspace1.Standard2['miyazakiaoi']['last'] = 'Miyazaki'
Value inserted.
cassandra> set Keyspace1.Standard2['miyazakiaoi']['age'] = '24'
Value inserted.
cassandra> get Keyspace1.Standard2['miyazakiaoi']
=> (column=last, value=Miyazaki, timestamp=1274774842755000)
=> (column=first, value=Aoi, timestamp=1274774820478000)
=> (column=age, value=24, timestamp=1274774879282000)
Returned 3 results.

README.txtで書かれている内容そのままだけど、データの登録、確認は、こんな感じらしい。