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から使う

前回の 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

とまあ意外(でもないか)に簡単にできました.さて,これを実サービスにどう組み込むかな・・・・