Cassandra のインストールとデモアプリケーション twissandra の実行


Cassandraの勉強のため、ローカルに Cassandra をインストールして、Twitter like なデモアプリケーション [twissandra](https://github.com/twissandra/twissandra/) をインストール&実行しました。

## 環境
* Vagrant 1.7.4
* Ubuntu 14.04.3 LTS

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.hostname = "cassandra"
  config.vm.network "private_network", ip: "192.168.10.10"
end
```

## OpenJDK 1.8 のインストール
Cassandra の実行にはJavaが必要なので OpenJDKをインストールします。

```
$ vagrant up
$ vagrant ssh
vagrant@cassandra:~$ sudo add-apt-repository -y ppa:openjdk-r/ppa
vagrant@cassandra:~$ sudo apt-get update
vagrant@cassandra:~$ sudo apt-get install -y openjdk-8-jdk
vagrant@cassandra:~$ echo 'JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"' | sudo tee -a /etc/environment
vagrant@cassandra:~$ source /etc/environment
```

## Cassandra のインストールと実行
Cassandra をインストールします。

```
vagrant@cassandra:~$ echo 'deb http://www.apache.org/dist/cassandra/debian 21x main' | sudo tee -a /etc/apt/sources.list.d/cassandra.list
vagrant@cassandra:~$ echo 'deb-src http://www.apache.org/dist/cassandra/debian 21x main' | sudo tee -a /etc/apt/sources.list.d/cassandra.list
vagrant@cassandra:~$ sudo apt-get update
vagrant@cassandra:~$ gpg --keyserver pgp.mit.edu --recv-keys 749D6EEC0353B12C
vagrant@cassandra:~$ gpg --export --armor 749D6EEC0353B12C | sudo apt-key add -
vagrant@cassandra:~$ sudo apt-get update
vagrant@cassandra:~$ sudo apt-get install -y cassandra
```

Ubuntu において Cassandra 2.x が[正常起動しない問題](http://askubuntu.com/questions/435749/cant-start-an-application-as-service-but-running-as-standalone-process-simply)があるので下記のようにします。

```
vagrant@cassandra:~$ sudo chmod 750 /var/run/cassandra
vagrant@cassandra:~$ sudo sed -i 's/CMD_PATT=.*/CMD_PATT="cassandra"/' /etc/init.d/cassandra
```

また、デフォルト設定では `Out of memory: Kill process` が発生したため、以下のように小さなメモリ使用量を割り当てます。

```
vagrant@cassandra:~$ sudo sed -i 's/^#HEAP_NEWSIZE=.*/HEAP_NEWSIZE="40M"/' /etc/cassandra/cassandra-env.sh  | grep HEAP_NEWSIZE
vagrant@cassandra:~$ sudo sed -i 's/^#MAX_HEAP_SIZE=.*/MAX_HEAP_SIZE="100M"/' /etc/cassandra/cassandra-env.sh  | grep MAX_HEAP_SIZE
```

Cassandra を起動して、動作確認をします。

```
vagrant@cassandra:~$ sudo service cassandra start
vagrant@cassandra:~$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.12 | CQL spec 3.2.1 | Native protocol v3]
Use HELP for help.
cqlsh> DESCRIBE KEYSPACES;

system_traces  system
```

## Python(virtualenv) のインストール

twissandra はPythonで書かれているため、Python(virtualenv)をインストールします。

```
vagrant@cassandra:~$ sudo apt-get install -y git python-setuptools
vagrant@cassandra:~$ sudo apt-get install -y cython
vagrant@cassandra:~$ sudo easy_install -U virtualenv
vagrant@cassandra:~$ virtualenv twiss
vagrant@cassandra:~$ source twiss/bin/activate
(twiss) vagrant@cassandra:~$ easy_install -U pip
```

## twissandra のデプロイ

ソースコードをGithubから取得し、デプロイします。

```
(twiss) vagrant@cassandra:~$ git clone git://github.com/twissandra/twissandra.git
(twiss) vagrant@cassandra:~$ sed -i "s/cassandra-driver/cassandra-driver==2.7.2/" twissandra/requirements.txt
(twiss) vagrant@cassandra:~$ pip install -U -r twissandra/requirements.txt
```

最後にキースペースとテーブル、初期データを作成して、アプリケーションを起動します。

```
(twiss) vagrant@cassandra:~$ cd twissandra/
(twiss) vagrant@cassandra:~/twissandra$ python manage.py sync_cassandra
All done!
(twiss) vagrant@cassandra:~/twissandra$ python manage.py fake_data 10 100
created user
...
(twiss) vagrant@cassandra:~/twissandra$ python manage.py runserver 0.0.0.0:8080
Validating models...

0 errors found
January 24, 2016 - 07:49:03
Django version 1.5.5, using settings 'twissandra.settings'
Development server is running at http://0.0.0.0:8080/
Quit the server with CONTROL-C.
```

ブラウザからアクセスし、下記のように表示されればデプロイ完了です。

![Screen Shot 2016-01-24 at 22.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/27509/a9889f35-abf2-00fa-51a6-3aff60673925.png "Screen Shot 2016-01-24 at 22.49.43.png")

## 動作確認

右上の Login をクリックして、新規アカウントを作成します。

<img width="1024" alt="Screen Shot 2016-01-24 at 23.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/27509/c4ba8db5-65fb-620b-91a5-10bd1e179c90.png">

`cqlsh` でユーザが Cassandra に保存されていることを確認します。

```
vagrant@cassandra:~$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.12 | CQL spec 3.2.1 | Native protocol v3]
Use HELP for help.
cqlsh> use twissandra;
cqlsh:twissandra> select * from users where username='noralife';

 username | password
----------+----------
 noralife |   *****
```

試しに投稿してみます。

<img width="1054" alt="Screen Shot 2016-01-24 at 23.02.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/27509/248dad01-0992-1f74-2432-4a6e1051a965.png">

投稿できました。

<img width="1028" alt="Screen_Shot_2016-01-24_at_23_04_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/27509/9c91e66f-0a74-65c3-daa3-dec7aadd3774.png">

同様に `cqlsh` で Cassandra に保存されていることを確認します。

```
cqlsh:twissandra> select * from userline where username='noralife';

 username | time                                 | tweet_id
----------+--------------------------------------+--------------------------------------
 noralife | 2a23ed90-c2a3-11e5-ae0c-080027f7e0ef | 49481cf4-25cd-4ab4-9b8f-7ea07fc40bc1

cqlsh:twissandra> select * from tweets where tweet_id=49481cf4-25cd-4ab4-9b8f-7ea07fc40bc1;

 tweet_id                             | body             | username
--------------------------------------+------------------+----------
 49481cf4-25cd-4ab4-9b8f-7ea07fc40bc1 | Hello Twissandra | noralife
```