CentOS 6.4 に Cassandra 2.0.0-beta1 を構築する


## はじめに

CentOS 6.4 環境に Cassandra 2.0.0-beta1 を tarball からインストールする手順メモを残しておく。とりあえず動作することを確認するところまで。今回は 5 台の物理サーバ  (cassandra[01-05].domain.local) を使用し、それぞれ CentOS 6.4 がクリーンインストールされている。

```
★ Kernel を確認する
[cassandra[01-05]]# uname -a
Linux localhost 2.6.32-358.11.1.el6.x86_64 #1 SMP Wed Jun 12 03:34:52 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

★ ディストリビューションを確認する
[cassandra[01-05]]# cat /etc/redhat-release
CentOS release 6.4 (Final)
```

## インストール

Cassandra の動作に必要な Java をインストールする。今回インストールを行なう Cassandra 2.0.0-beta1 では、JDK-1.7 が必須となっているため、Oracle が提供している SunJDK 1.7.0_25 を使用する。もし JDK-1.6 で動かそうとしたら /var/log/cassandra/cassandra.log に "Unsupported major.minor version 51.0" と出力されます。

```
★ SunJDK をインストールする
[cassandra[01-05]]# rpm -e $(rpm -qa | grep java) jdk
[cassandra[01-05]]# rpm -ihv ~/jdk-7u25-linux-x64.rpm

★ バージョンを確認する
[cassandra[01-05]]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
```

Cassandra をインストールする。今回は tarball から /opt/cassandra 以下にインストールする。

```
★ 展開後に /opt/cassandra 以下に移動する
[cassandra[01-05]]# tar xvzf ~/apache-cassandra-2.0.0-beta1-bin.tar.gz
[cassandra[01-05]]# mv apache-cassandra-2.0.0-beta1 /opt/
[cassandra[01-05]]# rm -f /opt/cassandra
[cassandra[01-05]]# ln -s /opt/apache-cassandra-2.0.0-beta1 /opt/cassandra

★ ログとデータディレクトリを作成する
[cassandra[01-05]]# sudo mkdir -p /var/log/cassandra 
[cassandra[01-05]]# mkdir -p /var/lib/cassandra
```

## 設定

Cassandra を設定する。設定項目 "seeds", "listen_address", "rpc_address" の 3 カ所は必ず変更する必要があり、追加で virtualnode に関する設定と、IPv6 環境で動かす設定を行なう。今回は 5 台の物理サーバのうち、3 台を seed とする。また "listen_address" は、互いに接続できる IP アドレスまたは名前解決できるドメインを指定する必要がある。今回は IPv6 環境かつ DNS がある環境で構築する。

```
★ 設定を変更する
[cassandra[01-05]]# sed -i 's/- seeds: "127.0.0.1"/- seeds: "cassandra01.domain.local, cassandra02.domain.local, cassandra03.domain.local"/g' /opt/cassandra/conf/cassandra.yaml
[cassandra[01-05]]# sed -i "s/listen_address: localhost/listen_address: `hostname`.domain.local/g" /opt/cassandra/conf/cassandra.yaml
[cassandra[01-05]]# sed -i "s/rpc_address: localhost/rpc_address: `hostname`.domain.local/g" /opt/cassandra/conf/cassandra.yaml
[cassandra[01-05]]# sed -i 's/# num_tokens: 256/num_tokens: 4/g' /opt/cassandra/conf/cassandra.yaml
[cassandra[01-05]]# sed -i 's/JVM_OPTS="$JVM_OPTS -Djava.net.preferIPv4Stack=true"/JVM_OPTS="$JVM_OPTS -Djava.net.preferIPv4Stack=false"/g' /opt/cassandra/conf/cassandra-env.sh
[cassandra[01-05]]# echo "::1 localhost localhost.localdomain localhost6 localhost6.localdomain6" > /etc/hosts
```

Cassandra の起動スクリプトを作成する。結局は /opt/cassandra/bin/cassandra シェルを呼び出すだけだが、いろいろと面倒なので簡易的に作成しておく。Cassandra の PID をファイルで管理し、標準出力および標準エラー出力はログファイルにリダイレクトする。

```
★ 起動スクリプトを作成する
[cassandra[01-05]]# cat << 'EOS' > /etc/init.d/cassandra && sudo chmod +x /etc/init.d/cassandra
#!/bin/sh
CASSANDRA_ROOT_DIR=/opt/cassandra
CASSANDRA_BIN_DIR=${CASSANDRA_ROOT_DIR}/bin
CASSANDRA_LOG_DIR=/var/log/cassandra
CASSANDRA_RUN_DIR=/var/run/cassandra
case "$1" in
  start)
    if [ ! -d ${CASSANDRA_LOG_DIR} ]; then
      mkdir ${CASSANDRA_LOG_DIR}
    fi
    if [ ! -d ${CASSANDRA_RUN_DIR} ]; then
      mkdir ${CASSANDRA_RUN_DIR}
    fi
    if [ -e ${CASSANDRA_RUN_DIR}/cassandra.pid ]; then
      if [ 1 -ne $(ps $(cat ${CASSANDRA_RUN_DIR}/cassandra.pid) | wc -l) ]; then
        echo "NG: already running (pid=$(cat ${CASSANDRA_RUN_DIR}/cassandra.pid))"
        exit 1
      fi
    fi
    ${CASSANDRA_BIN_DIR}/cassandra -p ${CASSANDRA_RUN_DIR}/cassandra.pid >> ${CASSANDRA_LOG_DIR}/cassandra.log 2>&1
    echo "OK: running cassandra (pid=$(cat ${CASSANDRA_RUN_DIR}/cassandra.pid))"
    ;;
  stop)
    kill $(cat ${CASSANDRA_RUN_DIR}/cassandra.pid)
    echo "OK: stopped cassandra"
    ;;
  restart)
    $0 stop
    sleep 2
    $0 start
    ;;
  *)
    echo "Usage: `basename $0` start|stop|restart"
esac
exit 0
EOS
```

## 動作確認

Cassandra ノードを起動する。一番最初に起動するノードは seeds で設定したどれかである必要がある。Cluster 内に seeds に設定した ノードが 1 台でもあれば良いため、次に起動するノードはどれでもかまわない。最後に付属の nodetool コマンドで Cluster の情報が取得する。

```
★ ノードを起動する (同様に他のサーバでも行なう)
[cassandra[01-05]]# /etc/init.d/cassandra start
OK: running cassandra (pid=24225)

★ 接続されているノードのステータスを表示する
[cassandra[01-05]]# /opt/cassandra/bin/nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address                             Load       Tokens  Owns (effective)  Host ID                               Rack
UN  2402:4200:1:52:5054:40ff:fe1a:d412  55.16 KB   4       10.5%             40be2f96-9871-45b9-81e8-03364816bd39  rack1
UN  2402:4200:1:52:5054:5eff:fee1:1174  58.55 KB   4       32.9%             36afe480-8b7d-4a42-9dae-979858f9395a  rack1
UN  2402:4200:1:52:5054:60ff:fedb:ae9c  49.23 KB   4       16.1%             3824c783-6282-4615-99d9-58a8fc88bc4b  rack1
UN  2402:4200:1:52:5054:7cff:fe4c:10cf  55.19 KB   4       21.3%             bc53b062-4258-4c03-ad6f-f9d482728c4e  rack1
UN  2402:4200:1:52:5054:6cff:fefc:7aa   49.28 KB   4       19.2%             1a917447-b882-4f39-9b4d-cc87db860d36  rack1
```

## 参考にした文献など

* [Datastax Apache Cassandra 1.2](http://www.datastax.com/documentation/cassandra/1.2/index.html)
* [Apache Cassandra 1.1.0のインストールと動作確認](http://seijimomoto.blogspot.jp/2012/05/apache-cassandra-110.html)
* [Cassandraセットアップ](http://metasearch.sourceforge.jp/wiki/index.php?Cassandraセットアップ#z895a637)
* [Apache CassandraでNoSQLに挑戦 前編](http://blog.gmocloud.com/?p=560)
* [Cassandraメモその1(インストール、データモデル、データ操作について)](https://hiroakis.com/blog/2012/10/17/cassandraメモその1インストール、データモデル、データ/)
* [Cassandra の自動起動 Shellscript](http://d.hatena.ne.jp/proxy0721/20100717/1279368987)