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