かぴぶろぐ

またかぴったかと思った・・・(´A`;)

TokyoTyrantを使ってmemcached永続化+レプリケーション

カテゴリ[ Linux Unix ]

過去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

この記事のコメント

この記事にコメントする