couchbase server - ドキュメント型NoSQL DB 触ってみたメモ

db tech showcase で詳細聞いておもしろそうだった。
http://www.couchbase.com/jp/

  • コミュニティ版(無償)とエンタープライズ版の2種類
  • コミュニティ版はエンタープライズ版の1つ前のメジャーバージョンが提供される
  • エンタープライズ版でも2ノードまでは無償で利用可能
  • エンタープライズ版でもテストと開発用途であればノードに制限なく無料(webサイトに記載)
  • バージョンが古いものが提供されるだけで機能に制限はない
  • 複数台のクラスタ構成も可能
  • クラスタ時にはレプリカの数を設定して、データの冗長化が可能
  • WebGUIの機能がついていて、サーバの追加/削除やパフォーマンスの確認などができる
  • サーバ追加ができるのでスケールアウトできる
  • スケールアウト時のデータのリバランスも自動でできる

install

rpm package 用意されているのでそれを使うのが簡単そう。


http://host:8091/ が管理系のport? webのGUIはここにアクセスする。
perlのCouchbase::Client 見てると、client APIに設定する接続先もこれぽい。
このportに接続して、接続先のノード等が記載されているjsonを受け取って
キーを元にハッシュを計算して、実際にクエリを投げる先のサーバを決定している?
tcpdump見てると、一旦8091 portに接続して、その後データクエリの接続は11210 portだった。

client

perlのsample。perlにはCouchbase::Client があったのでcpanで入れておく。

my $client = Couchbase::Client->new({
  server => '172.17.0.14:8091',
  username => 'Administrator',
  password => 'hogehoge',
  bucket => 'test_bucket1'
});
my $opret = $client->set(Hello => "World", 3600);
$opret = $client->get("Hello");

tcpdumpでパケット見てると、
http://172.17.0.14:8091/pools/default/bucketsStreaming/test_bucket1
ここに接続して、JSONを受け取っているようだ。
その中にserverlist、vbucketmap というのがあって
このidの時はこのserverに繋ぐ、みたいなのがあった。

"serverList":["172.17.0.15:11210","172.17.0.14:11210","172.17.0.16:11210"],
"vBucketMap":[[2,1,0],[2,1,0],[2,1,0],[2,1,0],[2,1,0],[2,1,0],... 省略


実際に、serverで指定しているのは172.17.0.14:8091だったけど、set/getでHelloを投げていた先は172.17.0.16:11210 だった。
=> clientのCouchbaseライブラリ側のアルゴリズムで接続先サーバを分散している。

クラスタに障害が起きると、このJSONのvBucketMapの中身が変化して、
clientが特定のキーを検索する際に、接続しにいくサーバが変更するようになっている?
perlのCouchbase::Clientはnewする際にserversで複数のサーバを書けるようになってるけど、
これは初回に接続する場合は、そもそもJSONをまだ受け取っていない状態なので、
複数のサーバを指定できるようにしとかないと、8091 portに接続しにいったサーバが死んでると駄目なので
複数かけるようになっているのかな。

補足

複数台のcouchbase server 作るときにdocker様が大活躍してくれました。便利ですね。