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のクラスタには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なり、ご自由にどうぞ!
脚注
- 実は偉そうに解説出来るほど知らない、ってのはナイショ。 ↩