FAT47の底辺インフラ議事録

学んだことのメモ帳です

KyotoTycoonのインストール、バックアップ、レプリケーションまで

KyotoTycoonとは
データベースライブラリであるKyoto Cabinetをネットワーク越しに利用出来るようにしたKVS。memcached違いファイルに書き込むことができるのでデータを永続化して利用できます。
DBのホットバックアップやレプリケーションも出来るため高可用DBとして利用できます。

kyoto cabinetインストール

wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.74.tar.gz
tar zxvf kyotocabinet-1.2.74.tar.gz
./configure
make
make install

kyoto tycoonインストール

tar zxvf kyototycoon-0.9.54.tar.gz
wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.54.tar.gz
./configure
make
make install

試しに起動

拡張子によって形式が異なる。
.kch ファイルハッシュDB
.kct ファイルツリーDB
.kcd ディレクトリハッシュDB
.kcf ディレクトリツリーDB

ktserver test.kch 

もう一つ端末を開いてレコードセット

ktremotemgr set aaa uwaaa
ktremotemgr set bbb guaaa

レコード取得

ktremotemgr get aaa
uwaaa

とれたらOK。

デーモンとしてサーバを起動する際は以下のように。

mkdir /var/kt
ktserver -dmn -pid /var/kt/kt.pid test.kch

ホットバックアップ
DBが稼動状態のままバックアップを取れます。
バックアップ中の更新処理はできないが、参照可能。
メモリ上のデータとファイルが同期されてからコピーが行われるようにできます。
コピー用のコマンドは以下のようにスクリプトを作成します。
サーバ起動時にこのスクリプトがあるディレクトリを指定する必要があります。

ホットバックアップを利用するときのサーバ起動方法はこんなかんじに。

mkdir /hoge/ktbin
ktserver -cmd /hoge/ktbin -dmn -pid /var/kt/kt.pid test.kch

バックアップスクリプト作成

vim dbbackup
#! /bin/sh
srcfile="$1"
destfile="$1.$2"
cp -f "$srcfile" "$destfile"
chmod +x dbbackup

データが今入っているか確認

ktremotemgr list -pv
aaa     uwaaa
bbb     gwaaa

ホットバックアップ実行

ktremotemgr sync -cmd dbbackup

test.kch.01234567891011のようなファイルができる
(数字はタイムスタンプ)

バックアップ取れているか確認

kttimedmgr list -pv 'test.kch.01234567891011#type=kch'
aaa     uwaaa
bbb     gwaaa

#typeはファイル名が.kchではないためDB型を教える必要があるため。
ファイル名リネームでも可。


更新ログ
すべての更新を記録できる。
ホットバックアップと組み合わせて、迅速にリストアが可能になる。
更新ログの記録により処理がブロックすることはないが、それなりにオーバーヘッドはある。
サイズが大きくなるので一定のサイズ毎に分けて作られる。
利用方法は以下のように、サーバ起動時に更新ログのディレクトリとサーバIDを指定する。

mkdir /0001-ktlog
ktserver -ulog 0001-ktlog -sid 1 test.kch

先ほどのデーモン化と組み合わせてこんなかんじ。

ktserver -ulog /0001-ktlog -sid 1 -cmd /hoge/ktbin -dmn -pid /var/kt/kt.pid test.kch

setしてみる。

ktremotemgr set ccc owaaaa
ktremotemgr set ddd nuaaaa

更新ログの閲覧

ktutilmgr ulog /0001-ktlog
1333697229040000000     00 01 00 00 A1 03 0B 63 63 63 FF FF FF FF FF 6F 77 61 61 61 61
1333697242271000000     00 01 00 00 A1 03 0B 64 64 64 FF FF FF FF FF 6E 75 61 61 61 61

第一フィールドがタイムスタンプで第2フィールドはバイナリデータ

更新ログをバックアップに適用。

mv test.kch.01234567891011 test.kch
kttimedmgr recover -ts 01234567891011 test.kch /0001-ktlog
  • tsオプションでタイムスタンプ指定。

バックアップとったときのファイル名がタイムスタンプなので、それと同じものを指定すると、バックアップ以降の更新ログが適用されるので素敵なかんじになる。

更新ログはどんどん肥大化していくのでpurgeさせていきたい。

ktremotemgr slave -ur -ts xxxxxxxxxxxxxxxxxxx

1日以上前のログを削除する場合は以下のようなかんじ。

time=`date -d '1 days ago' +%s`0000000; ktremotemgr slave -ur -ts $time


マスタースレーブ構成で非同期レプリケーション
スレーブがマスタから更新ろぐをpullしてきます。

マスタ設定
更新ログをとって起動。sidはユニークにする。

ktserver -port 1978 -ulog masterlog -sid 1

スレーブ設定

ktserver -port 1979 -ulog slavelog -sid 2 -mhost ***.***.***.*** -mport 1978 -rts 0002.rts 

マスターでデータ挿入してみる

ktremotemgr set -host localhost -port 1978 aaa uwoooo

マスターでデータ確認

ktremotemgr list -host localhost -port 1978 -pv
aaa uwoooo

スレーブでデータ確認

ktremotemgr list -host localhost -port 1979 -pv
aaa uwoooo


古い更新ログが全部ないと簡単に行かないようなので、
古い更新ログがない場合のレプリケーション開始方法調査中。

参考リンク
http://fallabs.com/blog-ja/promenade.cgi?id=108
http://www.coalice.info/blog/linux/623.html
http://d.hatena.ne.jp/clmind/20110826/1314347692
http://www.slideshare.net/estraier/kyoto-tycoon-guide-in-japanese
http://cequiestaime.blogspot.jp/2011_04_01_archive.html