はじめに
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