この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
よく訓練されたアップル信者、都元です。アドベントカレンダー2013「AWS CloudFormationビッグバンテンプレート」、本日は18日目です。
昨日は渡辺さんのMongoDB編でした。
Cassandra
Cassandraはオープンソースの分散データベース管理システム、いわゆるNOSQLの実装の一つです。昨日もNOSQLの実装の一つ、MongoDBだったのでその流れです。CAP定理で考えると、CassandraはAP型、MongoDBはCP型と言われるようです。
と、いう理屈の細かいところをは置いといて *1、とりあえずいつものようにCassandraのクラスタを立ててゆきます。
今回の構成
CassandraのクラスタにはSPOFとなる「マスターノード」は無いのですが、「シードノード」という主導的な役割を持つノードがあります。これをMultiAZで配置し、非シードノードをAutoScalingによって拡張できるようになっています。 デモでは、非シードノードを2台としてありますので、計4台によるCassandraクラスタが出来上がります。
その後のデモの流れとしては、BastionにSSHでログインし、各ノードにクライアントとして接続しながら、同じデータが参照できることを確認していきます。
デモ
パラメータは以下のとおりです。
- 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
本番用テンプレート
パラメータは以下のとおりです。
- 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なり、ご自由にどうぞ!
脚注
- 実は偉そうに解説出来るほど知らない、ってのはナイショ。 ↩