Cassandraの勉強のため、ローカルに Cassandra をインストールして、Twitter like なデモアプリケーション 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 が正常起動しない問題があるので下記のようにします。
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.
ブラウザからアクセスし、下記のように表示されればデプロイ完了です。
動作確認
右上の Login をクリックして、新規アカウントを作成します。

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 | *****
試しに投稿してみます。

投稿できました。

同様に 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