Cassandra実践入門―Twitter,Facebookが採用するNoSQLシステム

この記事を読むのに必要な時間:およそ 10.5 分

クラスタ環境の構築と運用

ここまで開発環境として単体構成のCassandraを扱ってきました。以降では,複数ノードで構成するクラスタ環境の構築と運用について簡単に説明します。

クラスタの構築

cas1,cas2,cas3という3台のLinuxマシンを使い,3ノード,レプリカ数1のクラスタを構築します。Apache.orgにdebパッケージが用意されているため,Debian GNU/Linux系のディストリビューションではAPTコマンドでインストールできます。公式Wikiの記述を参考にインストールしてください。インストールが完了するとCassandraが自動的に起動します。

続いて,/etc/cassandra/storage-conf.xmlを編集して次の項目を変更します。

  • ReplicationFactorを2に
  • Seedの項目を3つに増やしてそれぞれの値をcas1,cas2,cas3に
  • ListenAddressを各サーバのホスト名に
  • ThriftAddressを0.0.0.0に

次に,/etc/default/cassandraというDebian GNU/Linux独自の設定ファイルを編集して,JVMの最大ヒープサイズを変更します。JVM_MAX_MEM="1G"を,メモリ搭載量に合わせて4G~16G程度のサイズにしてください。

パーティショナの設定

行キーからそのデータを格納する担当ノードを決定するためのアルゴリズムはパーティショナPartitionerと呼ばれます。Cassandraにはパーティショナとして表8のクラスが用意されています。

表8 Cassandraで用意されているパーティショナ

クラス名説明
RandomPartitioner行キーのMD5値をもとに対応するノードを決める
OrderPreservingPartitioner行キーの値をそのまま使って対応するノードを決める
CollatingOrderPreservingPartitioner上記と同じだが並び順をバイトではなくアルファベット辞書順として扱う

ユーザが独自に実装したクラスも指定可能

RandomPartitionerは各ノードにデータがランダムに分配されます。残り2つのパーティショナでは行キーの範囲を指定して複数の行データをまとめて取得する,レンジスキャンと呼ばれる便利な操作を行うことができますが,データを偏りなく各ノードに分配するためには,各ノードのトークンを適切に設定する必要があります。レンジスキャンを必要とする要件が特にない場合,RandomPartitionerをお勧めします。

パーティショナはstorage-conf.xmlに設定します。Partitioner項目にクラス名を記述してください。

レプリカ配置戦略の設定

担当ノードからデータの複製先ノードを決定するレプリカ配置戦略Replica Placement Strategyのアルゴリズムも設定できます。Cassandra 0.6系列で用意されているクラスは表9のとおりです。

表9 Cassandraで用意されているレプリカ配置戦略

ター内の異なるラックで稼働するノードの順にレプリカを配置する
クラス名説明
RackUnawareStrategyトークン値に基づいてリング上の後続するノードにレプリカを配置する
RackAwareStrategyリング上の後続するノード,異なるデータセンターで稼働するノード,同一データセン

ユーザが独自に実装したクラスも指定可能

レプリカ配置戦略もstorage-conf.xmlに設定します。ReplicaPlacementStrategy 項目にクラス名を記述してください。

以上の設定が終わったら,次のコマンドでCassandraを再起動します。

$ sudo /etc/init.d/cassandra restart

運用ツール

Cassandraには,nodetoolというコマンドラインベースの管理ツールが付属しています。各種ステータスの確認やリング上のデータの再配置,ノードの削除など,クラスタの管理に関するさまざまな操作が行えます表10⁠。また,JMXJava Management Extensionsの標準的なGUIツールであるJConsoleからも同等のオペレーションが行えます。JConsoleはJDKJava Development Kitに付属しています。

表10 nodetoolの主な管理用コマンド

コマンド機能
ringクラスタのリング構成と各ノードのトークン値を表示
tpstatsノード内の各スレッドの統計情報を表示
cfstats各カラムファミリの統計情報を表示
infoノードの稼働情報を表示

まだ筆者のプロジェクトでは検証していませんが,監視ツールMuninプラグインもあるようです。

おわりに

駆け足になりましたが,NoSQLとその一実装であるCassandraについて,概要から実践までを解説しました。CassandraはRDBMSとはまったく異なる概念で動いていることもあり,実際に触って動かしてみないと実感できない部分も多いでしょう。公式Wikiの日本語への翻訳や勉強会の開催など,国内でのコミュニティ活動も立ち上がりつつある今,みなさんも積極的に取り組んでみてはいかがでしょうか。

最後に,本記事の執筆にあたっては,大谷晋平さん,冨田和孝さん,桑野章弘さん,terurouさんにレビューして頂きました。お忙しい中ご協力くださった皆様に御礼申し上げます。

著者プロフィール

島田慶樹(しまだけいき)

株式会社ケイビーエムジェイ コマースソリューション事業部 シニアエンジニア。

主にRuby on RailsによるWebシステム開発に従事。大規模ASPサービスの開発・保守を通じてシステムのスケーラビリティやパフォーマンスの問題に取り組み,NoSQLを始めとしたさまざまな技術と格闘する日々。好きなプログラミング言語はSmalltalkとLisp。いつかはPrologをマスターしたいと思いつつ,今はScalaをかじっている。

Twitter:@_shimada