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様が大活躍してくれました。便利ですね。