Pythonの便利ライブラリLazyboyを入れてCassandraを使う方法
単一障害点がないと言われるCassandraデータベースをPythonから使う場合、
いくつか選択肢があります。
Lasyboyは慣れるまで癖がありますが、使いこんでみると結構素直です。
ダウンロードはここから出来ます。
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#、Java、Perl、Python、PHPおよび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という、富豪的考えもありますが、いくつか作ってみて、それでも個々のインデックス間をサービスに合わせて監視、修復する別プログラムが必要に思われました。