カスタム検索
ラベル kvs の投稿を表示しています。 すべての投稿を表示
ラベル kvs の投稿を表示しています。 すべての投稿を表示

2010年2月3日水曜日

kumofs その5・スケールアウトしてみた

kumo-serverを2台のマシンへセットアップし、色々試してみました。

スケールアウト時のチェックポイントはserverのIPや名称等は必ず一意となるようにつける事です。
例えばmanagerを起動するサーバで
kumo-manager -v -l localhost
kumo-manager -v -l 127.0.0.1
とかやってしまうと失敗します。必ず自分のIPか一意のサーバ名としましょう。

前回接続が不安定だったのはSpymemcachedが原因でした。
memcached client for javaで接続したらエラーにならずにすみました。
んが、こちらの方が速度が遅いようです。

1台から2台にした結果、速度は遅くなりました。
まぁ2台ではボトルネックの方が大きくなってしまうのでしょうがないですね・・・

memcached client+2台状態での速度は以下のような感じでした。
Set
128,187ms

Get
112,314ms

どちらも大体同じくらいの速度で安定して動きました。
SetはHSQLDBより遅くなりましたね・・・
GetをチューニングしたらHSQLDBが最速になるかな??と思って試してみました

Indexあり HSQLDB Get
637,811ms
622,084ms

Indexなしより4倍ぐらい早くなりましたが、kumofsと比べるとだいぶ遅いですね。
CouchDBより微妙に遅い程度なので、Grailsの中だけで使うDBという割当にCouchDBは向いていません。

続いて障害時の検証

memcached clientには複数のmemcachedをPoolして使う機能があります。
なのでkumo-gatewayを二つたてて二つをPoolして使ってみました。

マシン構成
server1 - kumo-manager , kumo-server , kumo-gateway
server2 - kumo-server , kumo-gateway

・すべてが稼働している状態からserver1or2のkumo-gatewayを落とす
正しく取得出来たり、Exceptionが出たり。
memcached clientでは接続先が落ちているかどうかまで判断はしてくれないようです。
A,Bどちらを落とした場合でも結果は同じです。

・すべてが稼働している状態からserver1or2のkumo-serverを落とす
何事もなかったかのように動作しました。

・片方のkumo-serverしか動いていない状態で、データを追加or変更し、落ちているkumo-serverを復旧させる
復旧した時点では not attached になっていますので、Aのマシンからattachします

kumoctl server1 attach

attach時にReplicationが行われ、アプリケーションからは常に変更後のデータが取得されます。
もちろんノンストップでいけます。

という事で、memcached clientのPoolは使わずに、公式のオススメどおりwebアプリとkumo-gatewayを1:1にし、kumofs側で障害対策をするのが良いようです。

2010年2月1日月曜日

kumofs その4・速度比較してみた

Grailsから kumofs と couchDB で速度比較してみました。(ついでにRDBMSも)
対象データは全国の郵便番号(12万件)をキーに住所を入力しています。

kumofs+spymemcachedでは、大量のデータをいっぺんに投げると接続が不安定になります。
一応接続方法を DefaultConnectionFactory から、KetamaConnectionFactory (蹴球?)に変えたら多少良くなったような気がしました。(が、たまにエラーでます)

やり方は前回のサービスの一部を変更↓


def void afterPropertiesSet() {
memcachedClient = new MemcachedClient(new KetamaConnectionFactory(60000,60000), AddrUtil.getAddresses("localhost:11211"))
// memcachedClient = new MemcachedClient(AddrUtil.getAddresses("localhost:11211"))
}


コメントアウトしたところが元のソースです。
念のためバッファ等もあげてあります。


CouchDBはRESTですべて行えるので、Grailsからはサクサク使えるのですが、Java用のライブラリがあったので試してみました。
勢いのあるjcouchdbを使っています。

インポートはこんな感じで書きました

Database db = new Database("localhost", "postal");
def doc=new BaseDocument()
doc.setId(key)
doc.setProperty("val",val)
db.createDocument(doc);


・結果はこんな感じ
データインポート





kumofsCouchDBHSQLDB
21,917ms980,457ms41,883ms
18,785ms1,008,333ms33,800ms
18,205ms955,118ms35,256ms
17,387ms3回で心が折れました31,735ms
18,062ms32,539ms


取得した結果はこちら





kumofsCouchDBHSQLDB
51,357ms564,257ms 2,803,802ms
45,988ms 590,907ms 2,764,875ms
50,615ms 539,712ms 2回で心が折れました
46,966ms 3回で心が折れました
48,286ms



・ちなみにDBの容量はこんな感じになりました。
元のテキスト 12mb
kumofs 22mb
couchDB 600mb

couchDBは差分もてたりする分情報が多いのは理解出来ますが、ちょっとありえないサイズになってますね・・・


・まとめるとこんな感じ
(そもそも単純なKVSであるkumofsとMapReduce出来るCouchDBを比べるのも変かも知れませんが・・・あえてTokyoTryrantとかとは比べないのがうちっぽいという事で)

速度だけでみたらkumofsが最速(安定性に不安があるけど・・・)
CouchDBは想像以上に遅かったですね、、、特に書き込み。
ってそういう見方もあるけど、CouchDB良い所はKVSやSQL文になじみのない人がチームにいても理解しやすいって所だと思います。

RDBMS(今回はHSQL使ってます)の読み込みの遅さは正直壊れたのかと思うぐらい遅かったです・・・
まあINDEXもチューニングも何もしていない状態だとこんなものでしょうか。
そこらへんはプログラマならやって当然の事なんですが、そういう事考えなくても早いDBってのも良い物ですよね。

次回はkumofsをスケールアウトしてみます、果たして更なる速度向上はあるのか!?

2010年1月29日金曜日

kumofs その3・Grailsと連携してみた

Grailsからkumofsを使ってみます

・適当な Grails アプリケーションを作成します
grails create-app kvstest

・memcachedクライアントのライブラリをインストールします
kumofs は memcached プロトコルを使用します。
今回は memcached の Java クライアントである Spymemcached
を使用します

上記サイトからJARファイルをダウンロードして lib フォルダへコピーします


・やりとりをするサービスを作成します
IBMのサイトにとても良いサンプルがあるのでこれを参考にします
上記サイトにあるサービスがほぼそのまま使えます
setのタイムアウトが600と指定されているのですが、kumofsでは0しか受け付けないため、0に変更します

*デフォルトの接続方式だと大量データでエラーが起きたので変更しました、そこらへんは次回に。

->Spymemcachedの問題でした、解決方法はこちらのエントリーで

memcachedClient.set(key, 0, value)


・適当なコントローラーを作成してget,setをテストします
本当に適当なので割愛、SSだけ





サクっと動きました!
次回はCouchDBとの速度比較なんかをやってみます

2010年1月28日木曜日

kumofs その2・Macで起動させてみた

とりあえずインストール出来ましたので、早速起動してみましょう
まずはkumofsの構成から

・kumo-server
データノード
実データが保存される場所、最低1つ

・kumo-manager
管理ノード
kumo-serverの管理を行う、1or2台

・kumo-gateway
アプリケーション <-> kumo-serverのプロキシ
アプリケーションからは常にここを参照するため、裏のmanager,serverの構成がどんな風に変わっても問題ない
アプリケーションサーバに対して 1:1 で起動する


とりあえずオールインワンで動かしてみます
・管理ノードを起動
kumo-manager -v -l localhost

・データノードを起動
kumo-server -v -l localhost -m localhost -s /opt/kumo/kumodb.tch

・起動したノードを確認
kumoctl localhost status

hash space timestamp:
Thu Jan 01 09:00:00 +0900 1970 clock 0
attached node:
not attached node:
127.0.0.1:19800

not attached node に登録されていますね。

・起動したデータノードを実際に参加させます
kumoctl localhost attach

・もっかい確認します
kumoctl localhost status
hash space timestamp:
Thu Jan 28 14:42:43 +0900 2010 clock 152
attached node:
127.0.0.1:19800 (active)
not attached node:

・プロキシを起動します
kumo-gateway -v -m localhost -t 11211

・telnet で接続確認します
telnet localhost 11211
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying fe80::1...
telnet: connect to address fe80::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

・データを入れてみます
set hoge 0 0 3
foo
STORED

・データを取得してみます
get hoge
VALUE hoge 0 3
foo
END

hoge=foo というデータが入りました!

次回はGrailsと連携してみます

kumofs その1・Macにkumofsを入れてみた

この記事は書きかけでMacがクラッシュしたため、当社比-120%の説明不足でお送りさせていただきます。

kumofsとは
・内側=KVS用のライブラリであるTokyoCabinet(mixi等で使用されている)を使用
・外側=グローバルスタンダードなmemcachedプロトコルでのやり取りが可能
・簡単にスケールアウトが可能なスケーラビリティを持ったKVS
という認識!

なんだかワクワクする構成なのでとりあえず試してみた

Macでのインストールをベースに書いていきます。


・gccのバージョンをあげる
kumofsのインストールにはgccの4.1以上が必要です
MacではXcodeをインストールする事によってgccがインストールされますが、デフォルトのバージョンは4.0.1です
4.2も一緒に入っているので、これを切り替えます

cd /usr/bin
sudo rm -rf cc gcc c++ g++
sudo ln -s gcc-4.2 cc
sudo ln -s gcc-4.2 gcc
sudo ln -s c++-4.2 c++
sudo ln -s g++-4.2 g++


・TokyoCabinetのインストール
最新のソースパッケージをダウンロードして

./configure
make
sudo make install


・MessagePack(C++API)
MessagePackはバイナリでシリアライズ可能な形式
JSONのバイナリ版みたいな感じ、JSONよりもシリアライズ/デシリアライズが高速で、容量も小さい

C/C++向けのソースパッケージをダウンロードして

./confifure
make
sudo make install


・MessagePack(RubyAPI)

gem install msgpack
でさくっと入るはずなんだけど何故かうまくいかなかったので、ソースからインストールする
Gitは http://code.google.com/p/git-osx-installer/ からダウンロード

git clone git://git.sourceforge.jp/gitroot/msgpack/msgpack.git
cd msgpack
cd ruby
ruby extconf.rb
make
sudo make install


・kumofsのインストール
最新のパッケージをダウンロードして

./configure
make
sudo make install

上記のインストールが終わっていれば正常にインストールされると思います

/usr/local/bin/kumo*
のファイルがあればOKです

次回は実際に起動をしてデータを入れてみます