過去2回に渡ってmemcachedの記事を書いたが、行き着く先は、TokyoTyrantとなった。
TokyoTyrantはMemcachedで受けたデータをTokyoCabinetという独自DBに保存してくれる。
さらにレプリケーションにも対応しているので、障害耐性もある。きたこれ。
TokyoCabinetのインストール
bzip2が必要になるので入れておく。
# yum install bzip2-devel.i386
ソースの用意
#wget http://sourceforge.net/projects/tokyocabinet/files/tokyocabinet/1.4.31/tokyocabinet-1.4.31.tar.gz/download
#wget http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.33.tar.gz
TokyoCabinetインストール
# ./configure --prefix=/opt/softwares/tokyocabinet-1.4.31
# make
# make install
TokyoTyrantのインストール
http://1978th.net/tokyotyrant/
からとってくるか、
http://sourceforge.net/projects/tokyocabinet/files/tokyotyrant
から。
# ./configure --prefix=/opt/softwares/tokyotyrant-1.1.33 --with-tc=/opt/softwares/tokyocabinet-1.4.31
# make
# make install
上記のようにprefixを指定(/usr/localじゃない場合)は、後でTokyoTyrantを入れ終わり、起動したときshardライブラリが無いって言われる。
export LD_LIBRARY_PATH=/opt/softwares/tokyocabinet/lib
をやれば起動できるんだが面倒なので、色々configureオプションとか探したが、見つからなかった。
--with-tc=/opt/softwares/tokyocabinet-1.4.31をつけてるのでいけそうなもんだが。。
結局起動スクリプトでカバーした。
起動前の設定
以下のように設定。
例のごとくnode1 node2で同じ構成にしておく。
11211というmemcachedポートで起動する。
ローカルPCとかのpythonからmemcacheモジュールを使って実行する。
で、テスト用起動スクリプト。
{prefix}/bin/ttserver
がフォアグラウンドで実行するそれだが、とりあえず、これに環境変数を与えてスクリプト化しておく。
node1のスクリプト
vi start.master-server.sh
#!/bin/sh
export LD_LIBRARY_PATH=/opt/softwares/tokyocabinet/lib
./ttserver -port 11211 -ulog /opt/databases/tt -sid 1 -mhost node2 -mport 11211 casket-1.tch
node2のスクリプト
vi start.slave-server.sh
#!/bin/sh
export LD_LIBRARY_PATH=/opt/softwares/tokyocabinet/lib
./ttserver -port 11211 -ulog /opt/databases/tt -sid 2 -mhost node1 -mport 11211 casket-1.tch
sidとmhostで相手を識別してそうなので、レプる相手を指定する。
ulogはDBディレクトリ。
勿論、daemon化で動かすなら、{prefix}/sbin/ttservctlを使って起動する。
調べた記事では、どちらかがmasterになるように書かれてたので、正しくはマスターを決めてマスター側を
ttserver -port 11211 -ulog /opt/databases/tt -sid 1 casket-1.tch
とするっぽい。
だた、今回の場合、マルチマスターで使いたかったので、node1にも相手を指定。
この場合、先に起動したほうはレプリケーションのタイミングでfaildになるが、もう一台が起動した
タイミングで拾ってくれるので、問題ない・・と思われる。(多分)
pythonでのmemcacheの取り方は前回までの記事の通り。
因みに、pytyrantていうTokyoTyrant用のモジュールもあるみたい。
(多分localDB用?)
そもそもマルチマスタに対応してるのか?
例えば2台のTTで両方とも更新を受け付けるマルチマスタ構成にした場合、実は大丈夫かというと・・・、「保障されている」という情報は見つからなかった。
開発メモ: Tokyo Tyrantによる耐高負荷DBの構築
上記記事でマルチマスタを言及している所があるので、やれない事は無いと思う。(自分もマルチマスタでテストした)
しかし、必ずデータ同期のタイムラグがあるわけで、その間に、2重に同じkeyが挿入された場合等、データの整合性が保障できない事は考えておかないといかんですね。
参考URL
http://kapi.jp/kapi_blog/269
2010年04月16日
関連カテゴリ Linux Unix