AP型NOSQLクラスターをAWSで 〜 Cassandra編|アドカレ2013 : CFn #18

よく訓練されたアップル信者、都元です。アドベントカレンダー2013「AWS CloudFormationビッグバンテンプレート」、本日は18日目です。

昨日は渡辺さんのMongoDB編でした。

Cassandra

Cassandraはオープンソースの分散データベース管理システム、いわゆるNOSQLの実装の一つです。昨日もNOSQLの実装の一つ、MongoDBだったのでその流れです。CAP定理で考えると、CassandraはAP型、MongoDBはCP型と言われるようです。

と、いう理屈の細かいところをは置いといて *1、とりあえずいつものようにCassandraのクラスタを立ててゆきます。

今回の構成

cassandra

CassandraのクラスタにはSPOFとなる「マスターノード」は無いのですが、「シードノード」という主導的な役割を持つノードがあります。これをMultiAZで配置し、非シードノードをAutoScalingによって拡張できるようになっています。 デモでは、非シードノードを2台としてありますので、計4台によるCassandraクラスタが出来上がります。

その後のデモの流れとしては、BastionにSSHでログインし、各ノードにクライアントとして接続しながら、同じデータが参照できることを確認していきます。

デモ

Cassandraのデモを起動

パラメータは以下のとおりです。

  • KeyName: ECのキーペア名。EC2へのSSH接続用。
  • Sub-Stackを利用するため「I acknowledge that this template may create IAM resources」にチェックを入れてください。

スタックの生成が終わったら、Outputsを確認してください。SSHの接続コマンド(例)がありますので、それを使ってBastion(踏み台)にログインします。続いて、cqlshコマンドで、シードノード(10.0.4.10 or 10.0.5.10)に接続してみます。

$ cqlsh 10.0.4.10 9160
Connected to Demo Cluster at 10.0.4.10:9160.
[cqlsh 4.1.0 | Cassandra 2.0.3 | CQL spec 3.1.1 | Thrift protocol 19.38.0]
Use HELP for help.
cqlsh>

あとはこのドキュメントに従って、チュートリアルのコマンドを入力していきます。最後のステップ10で、DROP TABLE users;は省略しておいてください。

cqlsh> CREATE KEYSPACE mykeyspace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };
cqlsh> USE mykeyspace;
cqlsh:mykeyspace> CREATE TABLE users (
              ...   user_id int PRIMARY KEY,
              ...   fname text,
              ...   lname text
              ... );
cqlsh:mykeyspace> DESCRIBE TABLES;

users

cqlsh:mykeyspace> INSERT INTO users (user_id,  fname, lname)
              ...   VALUES (1745, 'john', 'smith');
cqlsh:mykeyspace> INSERT INTO users (user_id,  fname, lname)
              ...   VALUES (1744, 'john', 'doe');
cqlsh:mykeyspace> INSERT INTO users (user_id,  fname, lname)
              ...   VALUES (1746, 'john', 'smith');
cqlsh:mykeyspace> SELECT * FROM users;

 user_id | fname | lname
---------+-------+-------
    1745 |  john | smith
    1744 |  john |   doe
    1746 |  john | smith

(3 rows)

cqlsh:mykeyspace> exit

続いて、もう一つのシードノードに接続し、様子を見てみます。mykeyspaceというキースペースがあり、usersテーブルに同じデータが入っていますね。

$ cqlsh 10.0.5.10 9160
Connected to Demo Cluster at 10.0.5.10:9160.
[cqlsh 4.1.0 | Cassandra 2.0.3 | CQL spec 3.1.1 | Thrift protocol 19.38.0]
Use HELP for help.
cqlsh> DESCRIBE keyspaces;

system  mykeyspace  system_traces

cqlsh> USE mykeyspace;
cqlsh:mykeyspace> SELECT * FROM users;

 user_id | fname | lname
---------+-------+-------
    1745 |  john | smith
    1744 |  john |   doe
    1746 |  john | smith

(3 rows)

cqlsh:mykeyspace> exit

本番用テンプレート

Cassandraを起動

パラメータは以下のとおりです。

  • VpcId: 構築対象のVPC IDを指定
  • VpcCidrBlock: 上記VPC全体のCIDRブロックを指定
  • PrimarySubnetId: Cassandra-Seed1を配置するサブネットIDを指定
  • SecondarySubnetId: Cassandra-Seed2を配置するサブネットIDを指定
  • PrimarySeedNodeIpAddress: Cassandra-Seed1のprivate IPアドレス
  • SecondarySeedNodeIpAddress: Cassandra-Seed2のprivate IPアドレス
  • PrimaryAvailabilityZone: Cassandra-Seed1側ののAZ
  • SecondaryAvailabilityZone: Cassandra-Seed2側ののAZ
  • KeyName: ECのキーペア名。EC2へのSSH接続用。
  • InstanceType: 各EC2のインスタンスタイプ
  • FleetSize: 非シードノードの数
  • ClusterName: cassandra.yamlに書き込むクラスタ名

例によってGitHubに公開済みです

このテンプレートは例によってGitHubに公開済みです。要望・改善案等ございましたら、issue発行なりpull requestなり、ご自由にどうぞ!

脚注

  1. 実は偉そうに解説出来るほど知らない、ってのはナイショ。