CEDEC 2014 - モバイル初のNoSQLを使ってみよう！ Couchbase Lite


CEDEC 2014 開催から半年ほど経過してしまいましたが
せっかくなので当時のレポートを公開しておこうと思います

# 概要

http://cedec.cesa.or.jp/2014/session/ENG/16447.html

> 今年の５月にリリースされたばかりの最新技術かつモバイル初のNoSQLデータベースについて紹介します。
モバイル端末にデータを格納して、非同期でサーバとデータをやり取りするので、オフライン／オフラインに関わらず、
またネット回線が不安定な場合でもアプリユーザにストレスを感じさせることなくサービスを提供し続けることが可能です。
また、バックエンドで稼動するCouchbase Serverはダウンタイムやアプリケーションを変更することなく
クラスタの拡張／縮小が簡単に行え、Redis/TokyoTyrant/Flare等の
永続化KVSやmemcachedの代替としても利用することができます。
このセッションではモバイルとサーバを１つのソリューションとして紹介します。

# アジェンダ

1. モバイルNoSQL Couchbase Liteとは？
2. Couchbase Liteの使い方
3. Couchbase Liteを導入するにあたって

# 1.モバイルNoSQL Couchbase Liteとは？

* ドキュメントベースのデータサーバ

* CouchDBを商用化したような物
* JSONでデータ管理が可能

* ドキュメントベースのモバイルデータベース
* CouchbaseとのSyncなどが簡単に行える

## SQLiteとの違い

* JSON形式でのデータ取り扱い(KVS)
* スキーマレス
* SDKによりネイティブAPIで操作可能、SQLを使う必要がない
* 非同期で動作する、SQLiteは同期なので保存時になどに止まってしまう
* サーバとSyncすることがあらかじめ考慮されている、
* SyncGatewayを利用してユーザ同士のデータやり取りも可能、  
モバイルサイドのエンジニアだけで実装可能

## Syncについて

Couchbase ServerとSyncGatewayを利用すれば簡単にデータをSyncできる
「チャンネル」を利用し、ユーザ同士でデータのやり取りを行う事ができる

* JSON Anywhere
* JSON on the deceive
* JSON on the wire
* JSON in the cloud

## 動作プラットフォーム

* iOS
* Android
* PhoneGap
* Xamarin(beta)
* Microsoft.net(beta)
* Unityは開発予定？→別端末でセーブとかが楽になる

# 2.Couchbase Liteの使い方

## iOS版のGet Startedをやってみよう(ToDo Liteを動かす)

### ToDo Lite Code Tour

Developerサイトにコード解説しているパートがある

http://developer.couchbase.com/mobile/get-started/get-started-mobile/todo-lite/index.html

# 3.Couchbase Liteを導入するにあたって

## データの管理方法の再認識

* 通常のテーブル型のDBと違って管理方法が変わってくる
	* テーブルが存在しない
	* リレーションを組まない

これがSQLiteでいうあれか？みたいな考えをしていると頭が固まって使いにくくなる

## Viewの使い方を覚える必要がある

* MapReduceでデータを集めてきてそれを利用してQueryを作成する
* それを利用するための学習コストが発生する

## モデル構成を考えておく

* モデルをどのように構成するかが効率化の鍵
* モデルの中にも出るクラスを指定して2重構造にすることも可能

## Syncの活用

* サーバAPIを呼ぶことなくSyncできるのは大きなメリット
* 使い分けを考慮しつつ構成を考える

## LiveQuery

* 特定のクエリを監視し変更が行われたときに通知を出す機能
* DBに変更があったら即反映が可能になる
* Syncと組み合わせると協力

# Couchbase Server

* 単一障害点が存在しないマルチマスタ KVS

## 利用シーン

* モデル、セッション、レンダリングなどのキャッシュストレージとして(memchacheのかわり)
* ユーザーデータの永続か保存領域として
* Sync Gatewayを使ってスマートフォンDBのバッグエンドとして

## Couchbaseの二つのストレージ

* Memcached:オンメモリKVS
* Couchbase:ディスクに保存する永続化KVS

## サーバークラスタに複数のvBucketsを保持

## Couchbaseを採用している企業

* 全世界で400社以上の企業で、10,000台以上の稼働実績

# HA

* クラスタへの多重レプリケーション

## Replication

* クラスタ内に指定した数のレプリカデータを保持し、
* ノード障害時のデーター損失を回避
* マルチマスタという

## Rebalance

* クラスタに新規サーバの追加する際など、
* クラスタの構成変更にあわせ「リバランス」を行い
* 既存のデータの分散再配置を行う
* 新しく増えた1台のサーバにデータを分散してくれる

## Failover

* Nodeが死亡した場合レプリカ数をKeep
* マニュアルでのNodeの新規追加、もしくは復帰により戻ってきた場合には
* 再リバランスにより、縮退運転からリカバリ

# Administration

* web管理画面が存在するから楽です
* コマンドラインで管理する事もできる
* DATA BUCKETSの性能監視が可能

# Sync gateway

* スマートフォンとクラスタを同期するゲートウェイ
	* Sync Funtion APIsを使って動的なデータの同期を行う
	* 容易な管理
	* スケーラビリティ
	* 開発速度を高める
	* スケールによって大規模ユーザを扱うサービスをサポート

# 質疑応答

* クライアント側でSyncした際にサーバ側でもSyncされるデータの形式は？
	* 送られるデータも保存するデータもJSONです
	* 通信時はSSLなどを使って暗号化する

* ソーシャルゲームだとSSLで暗号化しても解析されてしまうがチート対策はある？
	* あるがKVS的な使い方になる

* 保存したドキュメントのリビジョンを持っている
	* バージョン管理されているので
	* セーブデータが壊れたり改ざんされたりしたときに一個前のデータを取り出す事も可能

* クライアントとの同期中にネットワークが切れたりしたらどうなる？SDKでサポート？
	* ネットーワークが切れると同期されないが  
送ってしまったデータがどうなるかは、サーバー側でマージが可能
	* 失敗はわかる、マージはプログラマ側でコントロールする
	* SDKを使っていれば意識しなくていい
	* 例えば地下鉄に入ったときなど
	* 同期中に切れた場合は問題ない
	* 同期前に切れた場合はローカルに保存しておいて電波を発見したときに送信する事になる
	* SDKでラップされているので大丈夫