sgykfjsm.github.com

ec2にcouchbaseをインストールする。ついでにPython SDKとtd-agentも。

目的

ec2にCouchbaseを入れるついでに、fluentdで集めたログをcouchbaseに貯めこむ。

couchbaseについて

  • 元々はLutus Notesを起源に持つCouchDBの開発者のひとりであるDamien Katz氏が商業展開している製品。
  • Memcachedもベースとなっているので、MemcachedをCouchbaseクラスタにリプレースした事例もある。
  • Enterprise Edition(EE)とCommunity Edition(CE)の2つがあり、前者は2nodeまで無料、後者は無制限に無料で使える。
  • EEとCEの違いは、EEではサポートが購入でき、CEに比べ先進的な機能が付属している。対してCEはEEの型落ちのような位置づけである。
  • MongoDBと同じドキュメント型NoSQLに位置づけられる。
  • 自動シャーディング、分散クエリ、独立したキャッシュ郡などの機能や特徴を持つ。

導入

今回はEC2のm1.smallにインストールするが、AWSのホワイトペーパーでは最小でもlargeインスタンスが推奨されている。今回はお遊びなので、smallとするが本番利用時にはインスタンスのスケールは高めにしたほうが良さそう。

AWSのmarket placeにはAMIが用意されており、一方ではRightScaleによるテンプレートもある。(4.6. Using Couchbase in the Cloud)

このように手軽にインストールできる方法はいくつかの方法があるが、今回は学習のためRPMからインストールを行う。

ダウンロードページは以下のURLである。
http://www.couchbase.com/jp/download

これ以降の作業は用意したEC2にログインして行う。

事前準備

これはとても重要なのだけど、立ち上げたインスタンスにはElasticIPを振っておくこと。でないと、SDKからのアクセスが出来ない。 なぜそうなのかはまだ理由がつかめていない。 また、もしCouchbase Serverのnode名がPrivate IPsになっていたら、以下の手順にしたがってnode名を変更しておく必要がある。

この設定をしてないととても大変なことになる。

OpenSSLを入れる

1
2
3
4
5
6
7
8
[ec2-user@ip-xx-xxx-xx-xxx tmp]$ sudo yum install -y openssl098e
Loaded plugins: priorities, security, update-motd, upgrade-helper
amzn-main                                                                                                        | 2.1 kB     00:00
# 省略
Installed:
  openssl098e.x86_64 0:0.9.8e-17.8.amzn1

Complete!

couchbase server 2.0.1を入れる

取得元のURLはダウンロードページから。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[ec2-user@ip-xx-xxx-xx-xxx tmp]$ wget http://packages.couchbase.com/releases/2.0.1/couchbase-server-community_x86_64_2.0.1.rpm
--2013-08-11 08:47:37--  http://packages.couchbase.com/releases/2.0.1/couchbase-server-community_x86_64_2.0.1.rpm
# 省略
2013-08-11 08:49:00 (1.47 MB/s) - `couchbase-server-community_x86_64_2.0.1.rpm' へ保存完了 [126631806/126631806]
[ec2-user@ip-xx-xxx-xx-xxx tmp]$ sudo rpm -ivh couchbase-server-community_x86_64_2.0.1.rpm
準備中...                ########################################### [100%]
Minimum RAM required  : 4 GB
System RAM configured : 1696704 kB

Minimum number of processors required : 4 cores
Number of processors on the system    : 1 cores

   1:couchbase-server       ########################################### [100%]
Starting couchbase-server[  OK  ]

You have successfully installed Couchbase Server.
Please browse to http://ip-xx-xxx-xx-xxx:8091/ to configure your server.
Please refer to http://couchbase.com for additional resources.

Please note that you have to update your firewall configuration to
allow connections to the following ports: 11211, 11210, 11209, 4369,
8091, 8092 and from 21100 to 21299.

By using this software you agree to the End User License Agreement.
See /opt/couchbase/LICENSE.txt.

ログに以下のように出ているけど、全く足りてない…、が、今回は学習のためなので気にしない。なお、コレを満たすインスタンスはlargeまたはxlargeからなので、NoSQL系はやはりなんだかんだ言ってお金が無いとダメなのである。

1
2
3
4
5
Minimum RAM required  : 4 GB
System RAM configured : 1696704 kB

Minimum number of processors required : 4 cores
Number of processors on the system    : 1 cores

あとは指定されたURL:http://ip-xx-xxx-xx-xxx:8091/%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6GUI%E3%81%AE%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC%E3%83%89%E3%81%AB%E5%BE%93%E3%81%A3%E3%81%A6%E3%81%84%E3%81%91%E3%81%B0%E5%B0%8E%E5%85%A5%E3%81%AF%E7%B5%82%E4%BA%86%E3%80%82%E7%B0%A1%E5%8D%98%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82

CRUD

CouchbaseはREST APIを備えているが、用途としてはノードやクラスタの管理に利用するのが正しいっぽい。
公式ドキュメントでは以下のように有る。

REST APIはサーバへのデータ読み書きに利用するべきではありません。 たとえば、setやgetなどのデータ操作はCouchbase SDKによって処理します。 Couchbase SDKを参照してください。

というわけで、CRUDを試すためにはSDKが必要である。

Python SDK

今回はサクッとやりたいのでPython SDKを使う。Python SDKはCouchbaseのC SDKを使って作られているので、まず C SDKをインストールする。
ちなみに公式のGetting Startに従った。

1
2
3
4
5
6
7
[sgyk@fujishima]
$ brew install libcouchbase
==> Downloading http://packages.couchbase.com/clients/c/libcouchbase-2.0.7.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/libcouchbase/2.0.7 --disable-examples --disable-tests --disable-couchbasemock
==> make install
🍺  /usr/local/Cellar/libcouchbase/2.0.7: 106 files, 964K, built in 28 seconds

Pythonのバージョンは2.6以上であることが必要。

1
2
3
[sgyk@fujishima]
$ python -V
Python 2.7.3

次にpipでSDKをインストールするが、XcodeのCLI Toolsをインストールしていないと以下のエラーが出て悲しい気持ちになるので、インストールしていなければ予めインストールしておくこと。

1
unable to execute /usr/bin/clang: No such file or directory

Python SDKをインストールする。

1
2
3
4
5
6
7
[sgyk@fujishima]
$ pip install couchbase
Downloading/unpacking couchbase
  Running setup.py egg_info for package couchbase
# 省略
Successfully installed couchbase
Cleaning up...

ちゃんとインストールできたかを確認する。

1
2
3
4
5
6
7
[sgyk@fujishima]
$ python
Python 2.7.3 (default, Nov  9 2012, 22:02:35)
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.60))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from couchbase import Couchbase
>>>

エラーが発生しなければOK

なんか気の利いたやつを書こうかと思ったけど、githubのサンプルコードをとりあえず試してみるのが良さそう。
サンプルコードを見たらわかるように、非常に少ないステップでデータ操作ができることがわかると思う。
あとはAPIドキュメントをさらっと見ておけばとりあえずのことはできそうではある。

Fluentdとの連携

正直、あんまり書くべきことはなかったりする。というのも、すでにプラグインが用意されているため、それを使えばあっという間にできる。少しハマったところは、書き込みの箇所が

1
2
# https://github.com/obieq/fluent-plugin-couchbase/blob/master/lib/fluent/plugin/out_couchbase.rb#L52
connection[record.delete('key'),  :ttl => self.ttl] = record

となっているため、ログレコードの中にkeyという要素(rubyでいうところのエントリ?)が必要になる。これが無いと、couchbaseに書き込む際にログレコードがnilとなってしまい、エラーが発生する。
それ以外はtd-agentとプラグイン、couchbaseがよろしくやってくれるため非常に楽に格納できる。

また、couchbaseはバケットごとに認証を設けることができるが、上で紹介したプラグインはバケット認証に対応していない。
これに対応しているのはatware/fluent-plugin-couchbaseのリポジトリにある。ちなみに株式会社 アットウェアという会社は多分、今のところ、日本で一番Couchbaseに精通している会社かもしれない。

今後

Couchbaseの導入からtd-agentの連携までの作業は慣れたら多分1時間かからない。
問題はむしろこの後にあって、CouchbaseではRDBでいうところのSQLのようなDMLはViewと呼ばれるJavascriptのMapReduceで記述する必要がある。なので、ログの運用をCouchbaseに切り替える場合は、如何にしてこれまでRDBで動かしてきたSQLを移行するかが大きな問題となる。SQLバリバリのエンジニアがJavascriptを同じ程度書けるかと言われると多くはそうでないと思うので。まぁこれはNoSQL系DBを運用するときの宿命なので今更いうことでも無いか。

CouchbaseのViewについてはまた色々調べて、ブログにまとめようかな。

参考