はじめに
EC2
インスタンス上にCassandra
クラスタを構成したのは前回- 今回は
VPC
内の異なるAZ
をまたいでクラスタを構成して可用性を高める*1 cqlsh
を使って構成したクラスタに対してクエリを投げてみる
参考
構成
ざっくりとした構成は下記の通り。3
台の Cassandra
ノードのうち一台が seed
ノードとなり OpsCenter
も合わせて稼働する。
後述の cqlsh
も seed
ノードでクエリを流すので seed
ノード自体が SPOF
になるのでは?というのが Cassandra
初心者、私川原ヨウヘイの疑問。
設定のポイント
実際に試してみて上記のようなシンプルな構成であれば、注意するべきなのはセキュリティゾーンの設定。もちろんポートの制限をかけなければ何も考えずに通信が出来てしまうが、それではセキュリティリスクは高いと思われるので、最低限は以下のように設定するべきかと思われる。
開放ポート | ソース IP | 用途 |
---|---|---|
22 | クラスタを管理する為に必要なホストの IP アドレス(SSH 用) | ノードにログインして管理する為 |
7000 | AZ 間で Cassandra クラスタが通信出来る IP アドレス帯 | Cassandra ノード間のコミュニケーション |
7199 | AZ 間で Cassandra クラスタが通信出来る IP アドレス帯 | JMX monitoring port |
8888 | OpsCenter でノード管理サイトを利用する為に必要な IP アドレス | Opscenter |
9160 | AZ 間で Cassandra クラスタが通信出来る IP アドレス帯 | Cassandra client port (Thrift) |
61620 | Opscenter と datastax agent の通信に必要な IP アドレス帯 | OpsCenter monitoring port |
61621 | Opscenter と datastax agent の通信に必要な IP アドレス帯 | OpsCenter agent port |
個人的には上記のセキュリティゾーンの設定以外にはハマることなくクラスタ構成は構築出来た。また、実際にサービスでの運用に関してはパラメータ等を適切に設定するべきだと思う。
cqlsh を試してみる
クラスタの構成が出来たところで 1000 件位のデータを一気に突っ込でみてクラスタを虐めてみたい。
1000 件のレコードを作る秘伝のタレ
1000
件の INSERT
クエリを作る為に以下のようなシェルスクリプトを作った。
#!/bin/bash echo "BEGIN BATCH" >> /tmp/masha.cql for ((i=1;i<=1000;i++)) do value=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c 40` echo "INSERT INTO hukuyama (id,name) VALUES('${i}','${value}')" >> /tmp/masha.cql done echo "APPLY BATCH;" >> /tmp/masha.cql
BATCH
コマンドでクエリを投げる場合には BEGIN BATCH
と APPLY BATCH;
の間にクエリを並べる必要がある。
キースペースとカラムファミリはあらかじめ作っておく
以下のようにしてキースペースを作成する。
CREATE KEYSPACE masaharu WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
また、カラムファミリもあらかじめ作成。尚、レプリケーションに関しては SimpleStrategy'
でレプリカは 3
つのノードに作成する。さらにキースペースの設定変更は下記のように ALTER
を利用する。
ALTER KEYSPACE masaharu WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};
ALTER
構文を利用して replication_factor
の値を 4
に変更している。
CREATE TABLE hukuyama ( id text PRIMARY KEY, name text);
cqlsh の BATCH コマンド
以下のようにして cqlsh
を使ってレコードを 1000
件挿入するクエリを投げる。
${CASSANDRA_HOME}/bim/cqlsh ${host} --key-space=${KEYSPACE_NAME} --file=/tmp/masha.sql
しばらく(約 10
分位)*2するとレコードの挿入が終了する。
最後に
AZ
をまたいだクラスタ構成は意外に簡単に設定は行うことが出来たcqlsh
がSQL
ライクなのは非常に嬉しい