Pythonの便利ライブラリLazyboyを入れてCassandraを使う方法

単一障害点がないと言われるCassandraデータベースをPythonから使う場合、
いくつか選択肢があります。

Lasyboyは慣れるまで癖がありますが、使いこんでみると結構素直です。

ダウンロードはここから出来ます。


digg / lazyboy


CassandraをPythonから利用できる便利なライブラリ「Lazyboy」をインストールすると、
他のプログラムもいくつか入ってきます。


ログを見てみましょう。

# python setup.py install
running install
running bdist_egg
running egg_info
writing requirements to Lazyboy.egg-info/requires.txt
writing Lazyboy.egg-info/PKG-INFO
writing top-level names to Lazyboy.egg-info/top_level.txt
writing dependency_links to Lazyboy.egg-info/dependency_links.txt
reading manifest file 'Lazyboy.egg-info/SOURCES.txt'
writing manifest file 'Lazyboy.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
creating build
creating build/lib
creating build/lib/lazyboy
copying lazyboy/exceptions.py -> build/lib/lazyboy
copying lazyboy/base.py -> build/lib/lazyboy
copying lazyboy/column_crud.py -> build/lib/lazyboy
copying lazyboy/iterators.py -> build/lib/lazyboy
copying lazyboy/__init__.py -> build/lib/lazyboy
copying lazyboy/key.py -> build/lib/lazyboy
copying lazyboy/view.py -> build/lib/lazyboy
copying lazyboy/recordset.py -> build/lib/lazyboy
copying lazyboy/record.py -> build/lib/lazyboy
copying lazyboy/connection.py -> build/lib/lazyboy
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/exceptions.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/base.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/column_crud.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/iterators.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/__init__.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/key.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/view.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/recordset.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/record.py -> build/bdist.linux-x86_64/egg/lazyboy
copying build/lib/lazyboy/connection.py -> build/bdist.linux-x86_64/egg/lazyboy
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/exceptions.py to exceptions.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/base.py to base.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/column_crud.py to column_crud.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/iterators.py to iterators.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/key.py to key.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/view.py to view.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/recordset.py to recordset.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/record.py to record.pyc
byte-compiling build/bdist.linux-x86_64/egg/lazyboy/connection.py to connection.pyc
creating build/bdist.linux-x86_64/egg/EGG-INFO
copying Lazyboy.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying Lazyboy.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying Lazyboy.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying Lazyboy.egg-info/not-zip-safe -> build/bdist.linux-x86_64/egg/EGG-INFO
copying Lazyboy.egg-info/requires.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying Lazyboy.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
creating dist
creating 'dist/Lazyboy-0.7.4-py2.6.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing Lazyboy-0.7.4-py2.6.egg
creating /usr/local/lib/python2.6/site-packages/Lazyboy-0.7.4-py2.6.egg
Extracting Lazyboy-0.7.4-py2.6.egg to /usr/local/lib/python2.6/site-packages
Adding Lazyboy 0.7.4 to easy-install.pth file

Installed /usr/local/lib/python2.6/site-packages/Lazyboy-0.7.4-py2.6.egg
Processing dependencies for Lazyboy==0.7.4
Searching for Cassandra>=0.4.0
Reading http://github.com/ieure/python-cassandra/downloads
Best match: Cassandra 0.5.0
Downloading https://github.com/downloads/ieure/python-cassandra/Cassandra-0.5.0.tar.gz
Processing Cassandra-0.5.0.tar.gz
Running Cassandra-0.5.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-nbsKef/Cassandra-0.5.0/egg-dist-tmp-PGvY6p
zip_safe flag not set; analyzing archive contents...
Adding Cassandra 0.5.0 to easy-install.pth file
Installing Cassandra-remote script to /usr/local/bin

Installed /usr/local/lib/python2.6/site-packages/Cassandra-0.5.0-py2.6.egg
Searching for Thrift
Reading http://pypi.python.org/simple/Thrift/
Reading http://incubator.apache.org/thrift/
Reading http://incubator.apache.org/thrift/download/
Best match: Thrift 0.5.0
Downloading http://pypi.python.org/packages/source/t/thrift/Thrift-0.5.0.tar.gz#md5=b1515e0814e7a557b50490206991dbc9
Processing Thrift-0.5.0.tar.gz
Running Thrift-0.5.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-alTBvK/Thrift-0.5.0/egg-dist-tmp-1NCxLf
zip_safe flag not set; analyzing archive contents...
Adding Thrift 0.5.0 to easy-install.pth file

Installed /usr/local/lib/python2.6/site-packages/Thrift-0.5.0-py2.6-linux-x86_64.egg
Finished processing dependencies for Lazyboy==0.7.4


とあります。


以下のプログラムが設置されたことになります。

  • Installed /usr/local/lib/python2.6/site-packages/Lazyboy-0.7.4-py2.6.egg
  • Installing Cassandra-remote script to /usr/local/bin
  • Installed /usr/local/lib/python2.6/site-packages/Cassandra-0.5.0-py2.6.egg
  • Installed /usr/local/lib/python2.6/site-packages/Thrift-0.5.0-py2.6-linux-x86_64.egg


Thriftが入ります。wikiにはこうあります。

Thrift(スリフト)は、「スケーラブルな言語間サービス開発」のためにFacebookにて開発されたRPCフレームワークである。

これはソフトウェアスタックとコード生成エンジンを組み合わせることで、C++C#JavaPerlPythonPHPおよびErlang and Rubyの言語間にて効率的かつシームレスに動作するサービスを開発することを可能とする。

これでCassandraをPythonから扱いやすくなります。


実際の使い方はここのブログが詳しいです。
分散データベース管理システムCassandraにPython + Lazyboyでデータ登録


Lazyboyのモジュールは堅固なんですが、肝心のCassandraの運用操作が初心者には少しハードルが高いです。
VPSで運用する場合のメモリ管理、複数サーバ間のレプリケーション設定、死活監視等)


実際の使い方:MySQLとの併用

自分の場合は、MySQL等のRDBMでインデックスを管理して、実際のデータをストレージ用にCassandraに入れておくような使い方です。


完全なACIDを求めないようなサービスにCassandraは向いています。


Twitterが導入を挫折したように、ACIDを多少でも求める場合は、単独での使用は向いていいないように思います。


Twitterが、Cassandraの本採用を断念。「いまは切り替えの時期ではない」


クチコミサイトや掲示板などの運用で、負荷分散としてはかなりいいと思われますが、書き込み順を管理するような、マスターインデックスはどこかにないと不安です。

このあたりは単一障害点との運用にらめっこです。


CassandoraとACID

Cassandraでのある程度のACID実現は、開発側で作り込みが必要です。


すべてインデックス化すればいいじゃん、トリガーバッチでOKという、富豪的考えもありますが、いくつか作ってみて、それでも個々のインデックス間をサービスに合わせて監視、修復する別プログラムが必要に思われました。