CouchbaseServerを触ってみよう　-Couchbase とは-

CouchbaseServerを触ってみよう
1章 Couchbase とは
======================================

この記事は、SoftwareDesign 2016年12月号のKVS特集中のCouchbaseServer紹介記事に関する補足記事となります。
CouchbaseServerの簡単な紹介から、実際に手を動かして利用してみるところまでを対象としています。

Couchbaseサーバに関する公式のドキュメントは大量にあるのですが、バージョンが古いものも大量に残っていたり、リンク切れなどがあるため、まずざっくり触ってみたいというときに参考にして頂きたいと思います。
この記事はCouchbase4.5を元に記載しています。

[Indexはこちら](http://qiita.com/taruhachi/items/0f96a2f7da81383866df)


# はじめに
みなさんはCouchbaseServer(以下、Couchbase)というKVSを耳にしたことがありますでしょうか。
日本ではあまりメジャーになりきれておりませんが、パフォーマンスの高さと可用性の高さを買われて特に海外において様々な企業に既に導入されている製品です。
このCouchbaseは非常に高機能なEnterprise向けの製品でありながら、非商用利用に関しては無償での利用が可能です。
また、一部の機能が制限されたCommunityEditionであれば無償での商用利用も可能なライセンス体系となっているため、比較的カジュアルに導入を検討する事が可能です。
特にカジュアルな導入事例で言いますと、もともとmemcachedから進化した製品でもあり、memcachedの置き換えを行うことでより安定したキャッシュ利用を行うことが出来る製品です。
この記事ではCouchbaseの紹介および実際に簡単にサーバにインストールして利用するところまでを紹介したいと思います。

# Couchbase とは
## 概要
CouchbaseはいわゆるKeyValueStore(KVS)製品の一つなのですが、Value部分をJSONで保存するドキュメント指向データベースです。
ドキュメントのスキーマはJSON形式であるということ以外はCouchbase自体は管理しませんので、任意のデータが可能可能です。

まず、Couchbaseの特徴を簡単に列挙します。
詳細に関しては追って説明します。

- 高スループット、低レイテンシでの応答が可能
- 複数のCouchbaseサーバのノードを一つのクラスタとして管理することが出来る
- ドキュメントの永続化が可能
- ドキュメントの生存期間(expiry)を設定した自動削除が可能
- 冗長度を指定してデータの冗長化が可能
- 単一障害点を持たない構成を取ることが可能
- ドキュメントに対する強い一貫性をもつ（結果整合性ではない）
- KeyやValueに関する横断的操作が可能(後述するViewやN1QLを利用)
- CASやロック機構を利用したドキュメントのアトミック操作が可能
- アトミックなIncrement操作が可能
- 地理的に離れた別の場所に構築されたクラスタとの間でデータの双方向レプリケーションが可能(XDCR:Cross Data Center Replication機能)


Couchbase理解するためには、クラスタとバケット、ドキュメントおよびサービスの概念から理解することが近道です。

### クラスタとは
Couchbaseは1台から導入も可能ですが、複数台のノードを利用してクラスタを組み、クラスタ全体を1つのCouchbaseリソースとして利用することが出来ます。

![クラスタ説明](https://qiita-image-store.s3.amazonaws.com/0/38018/4c54f1d2-dab2-e9ea-7b26-e347253497fb.png)



### バケットとは
Couchbaseクラスタ内には複数のバケットを作成することが可能です。
このバケットはRDBにおける論理DBに相当するものと考えて下さい。
※後述するN1QL利用時においてはテーブルに近い概念となります。

- バケット毎に予め利用メモリを割り当てますが、このメモリは管理画面から動的に変更可能です。
- バケット毎に冗長度の設定や接続パスワードの設定が可能です。
- この機能により、一つのクラスタを複数のアプリケーションで安全に共有することが出来ます。

![バケット](https://qiita-image-store.s3.amazonaws.com/0/38018/54520dc8-50c1-e824-49c2-93b5017a9225.png)


### ドキュメントとは
Couchbaseはバケット内に複数のドキュメントを保存することが出来ます。
このドキュメントは他のKVS製品と同じく、keyとValueの組みあわせにより構成されますが、Value部分をJSONデータとして保持します。

ドキュメント間のトランザクション等はサポートされていませんが、単一のドキュメントに対するアトミックなデータ操作はドキュメントのget時にメタ情報として同時に通知されるCASを次回保存時に指定する事で行う事が可能です。
ドキュメントのValueに対するユニーク制約などは設定することが出来ませんので、その必要がある場合は別途該当の値を主キーとしたドキュメントを作成する必要があります。

ドキュメントは複数のサーバにコピーされますが、フェイルオーバー機能（障害発生時などに特定のノードを切り離す機能）が行われるまで、同一のドキュメントに対する更新操作は常に同一のノードに対して行われます。
そのため、Couchbaseではドキュメントは強い一貫性を保有しています。

### サービスとは
Couchbaseは以下の4つのサービスにより構成されます。
サービスごとにリソースの使用状況に偏りが生じたり、分散困難な内容などが含まれるため、サービスを起動するノードを個別で設定可能です。

#### Dataサービス
いわゆるKVSの本体となり、ドキュメントそのものの格納及び利用一式を担います。後述するView機能の利用もこのDataサービスに含まれます。

#### Indexサービス
後述するN1QLのインデックスの作成、保存、利用を行うサービスになります。

### Queryサービス
後述するN1QLのクエリを実行するサービスになります。

### FullTextサービス
4.5.0ではベータ機能として提供されているドキュメントの検索サービスです。
※この記事では触れません。

![サービス](https://qiita-image-store.s3.amazonaws.com/0/38018/570a11db-6ceb-8968-725c-de4a6df1b732.png)



## Couchbaseのを選ぶ理由
Couchbaseは一般的なRDBのようなトランザクション機構を持たない一方で、KVSとしては以下のように優れた特徴を持ちます。

### 高性能であり、スケーラビリティーがある
 - ノード1台あたり100,000 read/write級のスループットが可能
 - クラスタへのノードの追加によりread/writeのスケールアウトが可能
 - 1-2ms単位での非常に低レイテンシでの応答が可能
 - クラスタへのノードの追加により逼迫したリソースのスケールアウトが可能

![cluster_02.png](https://qiita-image-store.s3.amazonaws.com/0/38018/e5cd8d15-b1a9-38c4-bcc5-7e0059b4be01.png)


###  可用性が高い
 - データの冗長化がされかつ、ドキュメントに強い一貫性を持つため、クラスタ内の単体のノードが破損したケースにおいてもデータの欠損無しに速やかに縮退運転に移行することが可能
 - クラスタへのノードの追加、削除が無停止で可能
 - ノードの入れ替えが無停止で可能であることにより、ソフトウエア更新が無停止で可能となる
 - XDCR機能を利用することで広域なインフラ障害に対しても対応可能である

![cluster_03.png](https://qiita-image-store.s3.amazonaws.com/0/38018/9e1c20be-3531-82e0-0741-755469adf4be.png)
![xdcr_01.png](https://qiita-image-store.s3.amazonaws.com/0/38018/18726230-6597-eab6-e897-cde701632010.png)


### 横断的ドキュメント操作を提供するメソッドが準備されている
 - View(※1)を利用してドキュメント内の値を利用した検索を行うことが出来る
 - ElasticSearchにリアルタイムでデータ連携を行うことが可能(XDCR機能を利用)
 - N1QL(※2)と言われるSQLでのデータ検索が可能
 - Full Text Serachが可能に

### メンテナンス性が高い
 - Webベースの管理コンソールが付属しており、各ノードの詳細なモニタリングおよび管理が可能
 - Couchbaseのシステムに対するコマンドはREST APIとして提供してあり、運用の自動化も可能

(※1) Viewとは
ドキュメント中の特定のフィールドの値や、ドキュメントのKeyを利用したIndex作成ルールをJavascrptで記載、IndexおよびIndexに対応するデータの作成することが出来ます。
このIndexを利用した検索により、ドキュメントの抽出やドキュメントの集計結果を取得することなどが可能です。

簡単な例ですと、ドキュメントに更新時間を記載しておき、この更新時間を元にViewのIndexを作成することで更新時間順にドキュメントを整列して特定の範囲のものだけを取得するなどといった操作が可能になります。
ViewのIndexの更新は非同期ですが、検索時に必ずIndexを更新して最新の状態にした上で検索を行うオプションなども存在します。

(※2) N1QLとは
Couchbase4.x以降、N1QL(ニッケルと発音します)というSQLによるデータ問い合わせ、更新機能が正式にサポートされました。
N1QL上では複数のドキュメントのJOINなどもサポートされ、RDBのようなデータ操作が可能ですし、View機能では出来ないドキュメントの更新操作が可能ですのでかなり強力な機能のサポートとなります。