Cassandra クラスターの構築


3台の仮想マシンで Cassandra クラスターを構築する手順です。
仮想マシンの作成にはVagrantを用いています。

## 環境

* Vagrant 1.7.4
* Ubuntu 14.04.3 LTS x 3
* Cassandra 2.1.12

Ubuntuは下記のVagrantfileを使って作っています。

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.define "node1" do |node1|
    node1.vm.hostname = "node1"
    node1.vm.network "private_network", ip: "192.168.10.10"
  end
  config.vm.define "node2" do |node2|
    node2.vm.hostname = "node2"
    node2.vm.network "private_network", ip: "192.168.10.11"
  end
  config.vm.define "node3" do |node3|
    node3.vm.hostname = "node3"
    node3.vm.network "private_network", ip: "192.168.10.12"
  end
end
```

```
$ vagrant up
```

## Cassandra のインストール (node1/node2/node3共通)

[記事](http://qiita.com/noralife/items/47b5e6da6befbd8e0d10)と同様にUbuntuサーバにCassandraにインストールしていきます。コマンドの詳しい意味は、[記事](http://qiita.com/noralife/items/47b5e6da6befbd8e0d10)を参考にしてください。ここでは、node1について書きますが、node2、node3も同様にCassandraをインストールしてください。

```
$ vagrant ssh node1
vagrant@node1:~$ sudo add-apt-repository -y ppa:openjdk-r/ppa
vagrant@node1:~$ sudo apt-get update
vagrant@node1:~$ sudo apt-get install -y openjdk-8-jdk
vagrant@node1:~$ echo 'JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"' | sudo tee -a /etc/environment
vagrant@node1:~$ source /etc/environment
vagrant@node1:~$ echo 'deb http://www.apache.org/dist/cassandra/debian 21x main' | sudo tee -a /etc/apt/sources.list.d/cassandra.list
vagrant@node1:~$ echo 'deb-src http://www.apache.org/dist/cassandra/debian 21x main' | sudo tee -a /etc/apt/sources.list.d/cassandra.list
vagrant@node1:~$ sudo apt-get update
vagrant@node1:~$ gpg --keyserver pgp.mit.edu --recv-keys 749D6EEC0353B12C
vagrant@node1:~$ gpg --export --armor 749D6EEC0353B12C | sudo apt-key add -
vagrant@node1:~$ sudo apt-get update
vagrant@node1:~$ sudo apt-get install -y cassandra
vagrant@node1:~$ sudo chmod 750 /var/run/cassandra
vagrant@node1:~$ sudo sed -i 's/CMD_PATT=.*/CMD_PATT="cassandra"/' /etc/init.d/cassandra
vagrant@node1:~$ sudo sed -i 's/^#HEAP_NEWSIZE=.*/HEAP_NEWSIZE="40M"/' /etc/cassandra/cassandra-env.sh  | grep HEAP_NEWSIZE
vagrant@node1:~$ sudo sed -i 's/^#MAX_HEAP_SIZE=.*/MAX_HEAP_SIZE="100M"/' /etc/cassandra/cassandra-env.sh  | grep MAX_HEAP_SIZE
```

## Cassandra クラスターの設定

### node1
node1 をシードサーバとして用いるため、`auto_bootstrap` を無効化します。

```
vagrant@node1:~$ echo 'auto_bootstrap: false' | sudo tee -a /etc/cassandra/cassandra.yaml
```

その他、設定ファイル `/etc/cassandra/cassandra.yaml` の `seeds`, `listen_address`, `rpc_address`を下記のように設定します。

|      seeds     | listen_address |   rpc_address  |
|:--------------:|:--------------:|:--------------:|
|  192.168.10.10 |  192.168.10.10 |  192.168.10.10 | 

設定が完了したら、Cassandraを起動します。

```
vagrant@node1:~$ sudo service cassandra start
vagrant@node1:~$ sudo service cassandra status
 * Cassandra is running
# もし running ではない場合は、/var/log/cassandra/system.log を参照ください
```

### node2, node3
node1 にて Cassandra の起動が完了したら、node2, node3 をクラスターに参加させます。

設定ファイル `/etc/cassandra/cassandra.yaml` の `seeds`, `listen_address`, `rpc_address`を下記のように設定します。nodeごとに設定が異なるので注意してください。

|  node |      seeds     | listen_address |   rpc_address  |
|:-----:|:--------------:|:--------------:|:--------------:|
| node2 |  192.168.10.10 |  192.168.10.11 |  192.168.10.11 | 
| node3 |  192.168.10.10 |  192.168.10.12 |  192.168.10.12 | 

設定が完了したら、Cassandraを起動します。

```
vagrant@node*:~$ sudo service cassandra start
vagrant@node*:~$ sudo service cassandra status
 * Cassandra is running
# もし running ではない場合は、/var/log/cassandra/system.log を参照ください
```

node2, node3 同様にCassandraを起動させてください。

## Cassandra クラスターの状態確認

最後に `nodetool` でクラスターの状態を確認します。下記のように３台のノードが見えていれば、クラスターが構築できています。

```
vagrant@node1:~$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  192.168.10.10  51.66 KB   256     67.0%             428c5d05-09ce-460b-a864-1d554733ae38  rack1
UN  192.168.10.11  82.62 KB   256     66.1%             419775e2-f141-47a0-a6f2-4a3674ed1bfa  rack1
UN  192.168.10.12  66.79 KB   256     66.8%             85d5b171-c8ac-439e-b7a4-a3c18aee8bdd  rack1
```