Plesk Obsidianリリース記念!Plesk最大7カ月無料キャンペーン

2012/2/21

【実証】Apache CassandraでNoSQLに挑戦 前編

GMOクラウド株式会社の芦田です。本日のテーマは、NoSQLの一種である「Apache Cassandra」です。 クラウドを利用してスケーラビリティーの高いシステムを構築する上でネックになりやすいのがデータベースの存在です。
従来型のリレーショナルデータベース(RDB)は、その構造から柔軟なスケーリングを実現することが難しく、クラウドのメリットを生かせないケースが多いからです。そこで注目されているのがリレーショナルでないデータベース、いわゆる「NoSQL」です。今回はGMOクラウドPublicの仮想サーバー(Xen)上に、NoSQLの一種である「Apache Cassandra」をインストールしてみます。

1 Apache Cassandraとは

Apache Cassandra(以下、Cassandra)は、オープンソースで開発されている分散データベース管理システムです。リレーショナルデータベースのような関係モデルを持たない構造でデータを保持するのでNoSQLの一種とされています。
Cassandraでは複数のノードで分散してデータを保持します。このノードの集まりのことを「クラスタ」と呼び、外部からはこれが1つのデータベースに見えるわけです。1つのデータは複製されて複数のノードで保持されます。そのため、一部のノードに障害が発生してもデータが完全に失われるわけではなく、運用を継続することができます。一方で、データに変更が加えられた場合、それがクラスタ全体に同期されるまでの間、一時的にデータの一貫性が損なわれるという問題があります。一貫性の保持を犠牲にして可用性や柔軟性を確保しているというわけです。

2 Cassandraのインストール

それでは、実際に仮想サーバーにCassandraをインストールしてみましょう。今回は「CentOS 5.5 x86」テンプレートで新規作成した仮想サーバーを使うことにします。ホスト名は「kumolabo-cassandra」として、これ自体は外部には公開せず、外部公開されている「kumorabo-test」からローカルネットワーク経由でアクセスできる構成にします。したがって、作業はすべてkumorabo-test経由でsshログインして行います。

2.1 JDKのインストール

まず、Cassandraを使うにはJavaの開発・実行環境であるJDK(Java Development Kit)が必要です。JDKはオープンソース版が公開されており、yumを使ってインストールできます。パッケージ名は「java-1.6.0-openjdk.i386」(x64版のOSを使っている場合にはjava-1.6.0-openjdk.x86_64)です。
[root@kumolabo-cassandra~]#yum -y install java-1.6.0-openjdk.i386 プロンプト2.1.1

2.2 Cassandraのダウンロードと配置

Cassandraのバイナリは公式サイトのダウンロードページより入手できます。wgetコマンドでtar.gzアーカイブをダウンロードして、解凍してインストールしたい場所にフォルダごと移動しましょう。今回は本体を「/usr/local/apache-cassandra-1.0.6/」に配置し、シンボリックリンクを使って「/usr/local/cassandra/」でアクセスできるようにしました。
[root@kumolabo-cassandra ~]# wget ftp://ftp.riken.jp/net/apache//cassandra/1.0.6/apache-cassandra-1.0.6-bin.tar.gz
[root@kumolabo-cassandra ~]# tar xzvf apache-cassandra-1.0.6-bin.tar.gz
[root@kumolabo-cassandra ~]# mv apache-cassandra-1.0.6 /usr/local/
[root@kumolabo-cassandra ~]# ln -s /usr/local/apache-cassandra-1.0.6/ /usr/local/cassandra
プロンプト2.2.1

2.3 IPアドレスの設定

Cassandraの設定ファイルは、conf/ディレクトリ以下にある「cassandra.yaml」です。ほとんどはデフォルトの設定のままで大丈夫ですが、IPアドレスに関する以下の3箇所については、自分の仮想サーバーのIPアドレスに修正してください。
リスト2.3.1
listen_address: xxx.xxx.xxx.xxx #<ー 自ホストのIPアドレスを記述
rpc_address: xxx.xxx.xxx.xxx #<ー 自ホストのIPアドレスを記述
seed_provider:
# Addresses of hosts that are deemed contact points.
# Cassandra nodes use this list of hosts to find each other and learn
# the topology of the ring. You must change this if you are running
# multiple nodes!
– class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
# seeds is actually a comma-delimited list of addresses.
# Ex: “,,
– seeds: “xxx.xxx.xxx.xxx” #<ー 自ホストのIPアドレスを記述
「listen_address」は他のノードから自ノードへのアクセスを受け付けるためのアドレスです。「rpc_address」はThriftインターフェースがクライアントからのアクセスを受け付けるためアドレスです。rpc_addressには「0.0.0.0」を設定することもできて、その場合は使用可能なすべてのインターフェースでアクセスを受け付けます。
Cassandraのノードがクラスタに参加するためには、すでに参加済みのノードのアドレスをあらかじめ1つ以上知っている必要があります。これを「seed」と呼びます。「seeds」にはseedのアドレスを記述します。コンマ区切りで列挙することで複数のseedを指定することもできます。最初の1台目のノードでは自分のアドレスを指定すればOKです。

2.4 ホスト名の解決

ドメイン名の設定がデフォルトのままだと起動時にエラーになることがあるので、/etc/hostsを修正して以下のようにドメイン名の部分を付け加えておきましょう(IPアドレスとドメイン名は各自のホストのものを記述してください)。特定のドメインを使用していない場合は「localdomain」を使います。
リスト2.4.1
127.0.0.1 localhost
xxx.xxx.xxx.xxx ホスト名.localdomain ホスト名

3 ファイアウォールの設定

Cassandraをインストールしたホストとクライアントホスト(本稿の例ではkumolabo-cassandraとkumolabo-host)との通信を許可し、それ以外の通信を遮断するように、それぞれファイアウォールの設定を変更します。
ポートを指定してアクセスを制限したい場合には、Cassandraが使うポートについて知っておく必要があります。Cassandraは、目的に応じて次の3つのポートを使います。
• クラスタ間の通信(デフォルト: 7000番)
• Thriftクライアントとの通信(デフォルト: 9160番)
• JMXによる通信(デフォルト: 7199番)
このうち、通常のクライアントとの通信に関連するのはThriftクライアントの9160番ポートです。その他に、複数ノードで運用する場合には7000番ポートを許可する必要があります。JMXはCassandraの内部状態を調べるためのプログラムが使うエージェントで、もしこれを利用する場合に7199番ポートへのアクセスを許可しなければいけません。

4 起動と終了

それではCassandraを起動してみましょう。/usr/local/bin/cassandraが起動スクリプトです。 これを使って次のように起動します。 [root@kumolabo-cassandra ~]# /usr/local/cassandra/bin/cassandra -f

プロンプト4.1 コンソールにはログメッセージがたくさんの出力されるはずです。「-f」をつけることで、Cassandraはフォアグウランドのプロセスとして実行されます。したがって通常のプログラムと同様に[Ctrl]+[x]を入力すれば終了できます。 Cassandraをデーモンとして実行したい場合には、次のように「-p」オプションを使って任意のファイル名を指定しておきます。このファイルには実行されたCassandraプロセスのプロセスIDが記録されます。 [root@kumolabo-cassandra ~]# /usr/local/cassandra/bin/cassandra -p 任意のファイル名

プロンプト4.2 デーモンとして起動したCassandraを終了するにはkillコマンドを使います。その際に、次のように起動時に指定したファイルに記録されているプロセスIDを利用すれば安全に終了させることができます。 [root@kumolabo-cassandra ~]# kill `cat 起動時に指定したファイル名`

プロンプト4.3 次回は、Cassandraに対してデータの書き込みや読み出しを行ってみます。また、複数のノードによるクラスタの構成の仕方も紹介します。


コラム一覧へ