TokyoTyrantのレプリケーションとRailsでの利用
レプリケーションの設定
movedにある Replication の例をやってみる
マスター側
% mkdir ulog-1 % ttserver -port 1978 -ulog ulog-1 -sid 1 casket-1.tch
こちらは通常の設定ですが,1つ更新ログ(ulog)の部分が追加されています.前回は更新ログはファイルだと思って設定したんですが,実はディレクトリを指定するべきでした.これは MySQL でいうバイナリログ(binlog)に相当するものでしょうかね,中身見ると.
スレーブ側
% mkdir ulog-2 % ttserver -port 1979 -ulog ulog-2 -sid 2 -mhost localhost -mport 1978 -rts 2.rts casket-2.tch
スレーブ側ではマスターを指定します.mhost がマスターのホスト名,mport がマスターのポート番号,rts がレプリケーションタイムスタンプファイルの指定です.
動作テスト
% tcrmgr put -port 1978 localhost one first % tcrmgr put -port 1978 localhost two second % tcrmgr put -port 1978 localhost three third % tcrmgr mget -port 1978 localhost one two three one first two second three third % tcrmgr mget -port 1979 localhost one two three one first two second three third
確かにレプリケーションしています.
Railsから使う
サーバを立ち上げる
ここで問題発生.同一ホスト上で master/slave 共に daemon(-dmn)にすると,ログに
do_repl: tculrdnew failed
と出て,レプリケーションされません.なんでだろ.とりあえず,master を foreground で実行することで対処.
master 側 % ttserver -log "$PWD/ttserver.log" -port 1978 -pid "$PWD/ttserver.pid" -ulog ulog-1 -ulim "256m" -sid 1 "$PWD/casket.tch#bnum=1000000" slave 側 % ttserver -dmn -log "$PWD/ttserver2.log" -port 1979 -pid "$PWD/ttserver2.pid" -ulog ulog-2 -sid 2 -mhost localhost -mport 1978 -rts "$PWD/ttserver2.rts" "$PWD/casket2.tch#bnum=1000000"
ogawa@:[~/work/tokyocabinet/tt-test]% ruby script/console Loading development environment (Rails 2.2.2) >> u = User.find(1) => #<User id: 1, name: "hogehoge", created_at: "2009-01-09 04:11:26", updated_at: "2009-01-09 04:11:26"> >> u.access_time => nil >> u.access_time = Time.now => Fri Jan 09 15:15:46 0900 2009 >> u.access_time => Fri Jan 09 15:15:46 0900 2009 >> exit % ruby script/console Loading development environment (Rails 2.2.2) >> u = User.find(1) => #<User id: 1, name: "hogehoge", created_at: "2009-01-09 04:11:26", updated_at: "2009-01-09 04:11:26"> >> u.access_time => Fri Jan 09 15:15:46 0900 2009
とまあ意外(でもないか)に簡単にできました.さて,これを実サービスにどう組み込むかな・・・・