ようへいの日々精進XP

よかろうもん

EC2 インスタンス上に Cassandra クラスタを構成する(2)〜 AZ をまたいだり cqlsh を試したり 〜

はじめに


参考


構成

ざっくりとした構成は下記の通り。3 台の Cassandra ノードのうち一台が seed ノードとなり OpsCenter も合わせて稼働する。

f:id:inokara:20140121012631p:plain

後述の cqlshseed ノードでクエリを流すので 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 BATCHAPPLY 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 をまたいだクラスタ構成は意外に簡単に設定は行うことが出来た
  • cqlshSQL ライクなのは非常に嬉しい

*1:完全に可用性が担保されるものではない

*2:これが t1.micro の実力か...