のた犬のうまい猫めし

どら猫が作る、のた犬のための飯、略称、どら飯について語りつつ、各種技術、経済系セミナーに参加した報告、OSSいじってみた等のネタを入れていきます。更新情報はtwitterの@nota_inuにて。

db tech showcase 2014 Tokyo「Couchbase Server 3.0で広がるNoSQL採用事例」アットウェア 河村氏

  • Couchbase-JPコミュニティ運営、Couchbase普及活動、コンサル、導入支援などを実施。@ijokarumawak
  • Couchbase:カウチベース、と読む。1.8が2012年1月。2014/5にはモバイルソリューション。メジャーのは2014/10にVer3。機能が増えて適用範囲が広がった。OSSでありながらエンタープライズモデルである。

  • Couchbaseの性能:非常に高いスループット。Mongodb、Cassandraに比べ10倍以上。3でさらに性能向上。1ノード100K。1ms未満のレイテンシ。リニアスケール。

  • CouchbaseServerの特徴:JSONベースの柔軟なスキーマ、一貫した高性能。伸縮自在のスケーラビリティ。サーバの追加削除が簡単。高可用性を実現する機能がたくさん。

  • 4大利用動機:Webアプリ、Webサイトをより高速に。何が起きても稼働し続ける。フォーマットの異なるデータの収集、蓄積。オフラインでも動いてオンラインになったら都合よく同期するサーバ。

  • 高速化:Readバッファ、高性能ストレージ。キャッシュ用途での導入が多い。DBを使ったWebアプリに接続するユーザが増えたら、Webアプリを分散するが、DBがネックになる。メインの手前にオンメモリのDBを配置し、メインのをCouchbaseに乗せてキャッシュ代わりに。Couchbseはオンメモリだけではなくディスクにも書けるのでこれだけでもつかえ、ノードを追加するだけで増加するトラフィックに対応。よく参照するドキュメントがメモリ上に乗るように構成されている。IOが発生する処理をWebサービスに組み込むと、レンダリングが。。。で、非同期でリクエストを投げ、帰ってきたら表示するが、。。。(Reactive Programing)

  • 可用性:HAウルトラ。

  • オフラインでも:MOBILEソリューション。モバイル上で動く製品、CouchbaseLite。データの同期がCouchbaseとできる。ネットワークにつながらなくてもローカルデータで動き、つながったら同期する仕組み。SyncGateway機能で同期。カンファレンスのアジェンダを事前に決めてダウンロードされる、とかで利用。

 

Couchbaseのアーキテクチャ

 

  • Consistent Hash、レプリカ、リバランス、フェイルオーバ
  • NoSQLデータベースで一つのクラスタとして扱える。一つの入れ物、Bucket。1024の細かいブロック。3台で1つのブロックを持つなら341個ずつ分散配置。Couchbaseが提供しているSDKライブラリを使ってクラスタに接続する。db=Couchbase.connect("db1")。ClusterMapをSDKがダウンロードし、SDKがhashを計算し、vBucketのノードを計算。SDKはそのノードに直接問い合わせを投げる。そのためネットワークアクセスも最低限になる。

user=db.get("user07")
vBID=hash("user07")
node=clusterMap.get(vBID)
return node.get("user07")

  • レプリカは1-3個まで選べる。サーバを追加するときには、追加して「リバランス」ボタンを押すと、vBucketを再配置する。4台で均一のvBを持つように。これまでクライアントが持っていたClusterMapは、またダウンロードされる。Webアプリを停止せずにサーバの追加ができる。
  • フェイルオーバ:レプリカ部分から自動的にアクティブになる。(オートフェイルオーバも設定可。)ClusterMapがまたUpdateされる。
  • 同一のAvailabilityZoneに属する場合にはクラスタ内レプリカでは対応できない。そのためRack Zone Awarenessが提供されており、別のラックに入れたりして分けることができる。(片方でアクティブになっているvBが必ず別のほうにある。)AvailabilityZoneが一つすべて死んでも復旧可。加えて、本当にデータを大事にしたい場合、世界の別のところにクラスタを配置。XDCRを使うと1つのクラスタからもう一つにリアルタイムに同期できる。単一方向でも双方向でも。複数の同期もできる。
  • Writeバッファとして分液用データストレージへ:(書き込みリクエストメイン)とにかく収集、解析したい場合。単純にログをCouchbaseに入れる、ではなく。3.0ではTunable Memoryで、キー、メタデータを必ずメモリに置かなくてよくなりより大量のデータを保存可能に。ストリーミングをリアルタイムに集計し、保存したものをXDCRを使ってElasticsearch、Kibana、HadoopConnectorを使ってHadoopへ。今N1QL(ニッケルと読む)+xDBCを開発中。SQLで検索可能になり、Excelやtableauへ。フォーマットが定まらないデータを入れる第一のストレージになれる。
  • Couchbaseが提供するViewはMapReduceJSONの任意の項目で二次インデックスを生成し、Mapで生成したものをキー単位で集計する。柔軟に集計ができるが、ビューインデックスに反映されるまで少し時間がかかり、CPU利用率が上がるのが問題。二次インデックスがやりたくてリアルタイム性がクリティカルな場合は、JSONドキュメントの中に配列を入れてKey-Valueのようにするのがおすすめ。集計用とだとview。より柔軟な検索がしたい場合にはElasticsearchとの連携。ElasticsearchはJSONドキュメントをやり取りできる。(Elasticsearchはデータベースではなく検索エンジン。DBとしての性能は微妙。CouchbaseConnectセッションでデモがあったが、Elasticsearchはqueryが5.1ms、getが3.4.オーバヘッドがある。Couchbaseは0.45ms。
  • N1QL(にっける):JSONドキュメントをSQL文っぽく検索。(配列は平べったくする処置が入る) 取得した結果はJSONで。JSON固有の命令もある。(現在開発中。来年上半期? Webから実行できるチュートリアルがある。)クエリをパースして実行計画をねってJSONドキュメントをスキャンしてフィルタリングしてソートして結果を返す。Parse、Plan、Scan、Fetch、Join、Filter、Pre-Aggregate、Aggregate、Sort……。かなりちゃんと理解した人が作っているので安心できそう。
  • xDBCドライバも現在開発中。Simba Technologies。JSONドキュメントに対してJDBC経由でアクセスできる。ETL、BIツール、Visualizationと連携して分析できるように。
  • 直近のイベントはDoorkeeperにあり。

利用事例

  • VIBER(メッセージングアプリケーション)で、内製インメモリDB→MongoDB+Redis Cluster+Sharder(redis単体ではシャーディングを持っていない)。デプロイ、管理が大変。→CouchbaseServerへ。(MongoDBが150、Redisが100台使っていたのをCouchbaseでは120台に減らせた。)
  • ebay:適材適所でいろいろなDBを使っている。決済部分はRDBeBay Marketplaceで利用されている。マルチチャネルプロダクトカタログを管理。複数のデータセンターにXDCRで。ユーザ認証のAuthトークンにも。今後適用範囲を拡大予定。
  • LINKED IN(SNS):データベースのすべてのデータを乗せて参照性能を高める。元データからいったんHadoopをかませて集計し、それからCouchbaseへ。専任チームもある。SALT、Ingraphsといったオーケストレションツールで管理。
  • HIPPO(OSSCMS提供):花屋のジレンマを解決(花屋に来る人は95%花を買うがWebでは買わない)。表示するデータをパーソナライズし動的に生成。数ミリ秒で大量の計算してからWebページをレンダリング
  • 国内では、KDDI、TESCO、PayPalなど。