Amazon EC2でCassandra 0.7.4をインストールし、実行する



Cassandraを複数のノードで試そうと思ったが、VPSサービスをいくつか契約する必要があり
性能的にどれがよいのか分からなかったのでとりあえず、Amazon EC2で試してみることにしました。
ここでいろいろストレステストや癖を試してみて、さくらVPSで運用できそうだったらさくらVPSの1.5 G版
か4 G版を検討してみたいとおもいます。*1
 

前提

    参考:「AWSの概要と登録手順〜Amazon EC2/S3環境構築のすべて〜

    参考:「Amazon EC2を操作するコマンドラインツール*2
    実行環境では、3月24日時点でダウンロードできる「ec2-api-tools-1.4.1.2」を利用しました。
    Amazon EC2 API Toolsからダウンロードできます。

  • private keyがコマンド作業環境に保存されていること

    参考:「インスタンス起動に必要となる設定

 

利用できるAMIイメージ(Amazon Machine Image)がないかどうか探してみる

「ec2-describe-images -x all」を利用すると、「公開イメージの一覧を表示」を取得することができます。
ただ、利用したいイメージがあるか分からないので、「ec2-describe-images --region ap-northeast-1 -x all | grep CentOS
」とコマンドを実行してみます。

$ec2-describe-images --region ap-northeast-1 -x all | grep CentOS
 IMAGE   ami-96e84297    411009282317/RightImage_CentOS_5.4_x64_v5.6.28_EBS      411009282317    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            ebs     paravirtual     xen
 IMAGE   ami-a8eb41a9    644846711624/CentOS_5_4_i386_v5_6_8_1_EBS       644846711624    available       public          i386    machine aki-a209a2a3    ari-9e09a29f            ebs     paravirtual     xen
 IMAGE   ami-beeb41bf    644846711624/CentOS_5_4_x64_v5_6_8_1_EBS        644846711624    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            ebs     paravirtual     xen
 IMAGE   ami-7605ae77    aoi-ami-jp/CentOS_5.2_x64_V1.manifest.xml       367998583407    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            instance-store  paravirtual     xen
 IMAGE   ami-2a0ea52b    411009282317/RightImage CentOS5_2_X86_64_V4_1_10        411009282317    available       public          x86_64  machine aki-da09a2db                    instance-store  paravirtual     xen
 IMAGE   ami-300ea531    411009282317/RightImage CentOS_5.2_i386_v4.2.4  411009282317    available       public          i386    machine aki-a209a2a3    ari-9e09a29f            instance-store  paravirtual     xen
 IMAGE   ami-360ea537    411009282317/RightImage CentOS_5.2_x64_v4.2.4   411009282317    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            instance-store  paravirtual     xen
 IMAGE   ami-3c0ea53d    411009282317/RightImage CentOS_5.4_i386_v4.4.10 411009282317    available       public          i386    machine aki-a209a2a3    ari-9e09a29f            instance-store  paravirtual     xen
 IMAGE   ami-480ea549    411009282317/RightImage CentOS_5.4_x64_v4.4.10  411009282317    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            instance-store  paravirtual     xen
 IMAGE   ami-ce0ea5cf    411009282317/RightImage_CentOS_5.4_i386_v5.5.9  411009282317    available       public          i386    machine aki-a209a2a3    ari-9e09a29f            instance-store  paravirtual     xen
 IMAGE   ami-aee842af    411009282317/RightImage_CentOS_5.4_i386_v5.6.28 411009282317    available       public          i386    machine aki-a209a2a3    ari-9e09a29f            instance-store  paravirtual     xen
 IMAGE   ami-760ea577    411009282317/RightImage_CentOS_5.4_x64_v5.5.9   411009282317    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            instance-store  paravirtual     xen
 IMAGE   ami-98e84299    411009282317/RightImage_CentOS_5.4_x64_v5.6.28  411009282317    available       public          x86_64  machine aki-a409a2a5    ari-a009a2a1            instance-store  paravirtual     xen

 
リージョン(--region)もオプションで指定してますが、「ec2-describe-regions」というコマンドで利用できるリージョン一覧を確認することができます。

REGION  eu-west-1       ec2.eu-west-1.amazonaws.com
REGION  us-east-1       ec2.us-east-1.amazonaws.com
REGION  ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
REGION  us-west-1       ec2.us-west-1.amazonaws.com
REGION  ap-southeast-1  ec2.ap-southeast-1.amazonaws.com

 
結果一覧の「ap-northeast-1」が日本を表しているので、今回は日本リージョンを利用することとします。*3

立ち上げる仮想マシーンのタイプも検討する必要があります。「利用可能なインスタンスタイプ
をみるといろいろあることがわかります。

No インスタンス CPU Mem Disk arch
1 スモール インスタンス(デフォルト) 1 EC2 Compute Unit 1.7 GB 160 GB インスタンスストレージ (150 GB + 10 GB ルートパーティション) 32bit
2 ラージ インスタンス 4 EC2 Compute Unit(2仮想コア) 7.5 GB 850 GB インスタンスストレージ (2×420 GB + 10 GB ルートパーティション) 64bit
3 エクストララージ インスタンス 8 EC2 Compute Unit(4仮想コア) 15 GB 1,690 GB インスタンスストレージ (4×420 GB + 10 GB ルートパーティション) 64bit
4 マイクロ インスタンス 最大 2 EC2 Compute Unit 613 MB EBS ストレージのみ 32bit or 64bit

 
他にも「ハイCPU インスタンス」や「クラスターコンピュート インスタンス」、「クラスタGPU インスタンス」なども
あるみたいです。詳しくは、Amazon EC2 インスタンスタイプをご覧ください。

今回は、「instance-type」として、t1.micro(マイクロ インスタンス)を利用したいと思います。
マイクロ インスタンスは、「EBS ストレージのみ」のサポートなので、「ec2-describe-images」コマンドで参照した
AMIの内、「instance-store」ではなく、「ebs」を利用しなければいけません。*4

 

セキュリティグループの作成

立ち上がったインスタンスへのアクセス制限をする為に、ポートの設定をします。インスタンス立ち上げ時に何も
指定しないとdefaultというグループが設定されます。新しいグループを作成し、SSH(22番ポート)HTTP(80番ポート)
の設定をします。

 ec2-add-group grp-cent-test --description cent_security_group --region ap-northeast-1
 
 ec2-authorize grp-cent-test -p 22 --region ap-northeast-1
 ec2-authorize grp-cent-test -p 80 --region ap-northeast-1

 
設定したセキュリティグループを確認します。

 ec2-describe-group --region ap-northeast-1
 
 GROUP   sg-963a8d97     43**********    grp-centos-test centos_security_group
 PERMISSION      43**********    grp-centos-test ALLOWS  tcp     22      22      FROM    CIDR    0.0.0.0/0       ingress
 PERMISSION      43**********    grp-centos-test ALLOWS  tcp     80      80      FROM    CIDR    0.0.0.0/0       ingress

 

インスタンスの起動

今まで設定した内容を元にインスタンスを実行します。

No インスタンス リージョン インスタンスタイプ セキュリティグループ
1 CentOS_5_4_x64_v5_6_8_1_EBS ap-northeast-1 t1.micro grp-centos-test

 

 ec2-run-instances ami-beeb41bf --region ap-northeast-1 --instance-type t1.micro --group grp-fedora-test --monitor -k fedora_test_jp

 
インスタンスの実行後、若干、立ち上がりに時間がかかりますが、数分後、以下のコマンドで実行されていることを確認します。

 ec2-describe-instances --region ap-northeast-1

 
ステータスが「running」となっていれば、インスタンス構築の完了です。
  

インスタンスにログインしてみる

ec2-describe-instancesで確認した時に表示されていたドメインネームを利用して、ssh経由でインスタンスにログインします。

ssh -i fedora_test_jp.id root@ec2-1**-4*-2**-43.ap-northeast-1.compute.amazonaws.com

 

CentOS上に、Cassandraを構築する。

念のため、OSのバージョンを確認します。

 cat /etc/redhat-release
  CentOS release 5.4 (Final)

 
Javaをインストールし、Cassandraをインストールして、立ち上げます。
一瞬、はまった箇所といえば、conf/cassandra.yamlのlisten_address:にグローバルIPを設定したら下記のような
エラーログが出力されました。

ERROR [main] 2011-03-23 04:31:36,356 AbstractCassandraDaemon.java (line 196) Fatal configuration error
org.apache.cassandra.config.ConfigurationException: Unable to bind to address /1**.4**.2**.4**:7000. Set listen_address in cassandra.yaml to an interface you can bind to, e.g., your private IP address on EC2
        at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:176)
        at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:424)
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:404)
        at org.apache.cassandra.service.AbstractCassandraDaemon.setup(AbstractCassandraDaemon.java:192)
        at org.apache.cassandra.service.AbstractCassandraDaemon.activate(AbstractCassandraDaemon.java:314)
        at org.apache.cassandra.thrift.CassandraDaemon.main(CassandraDaemon.java:79)

 
どこで、確認しているか分かりませんが、「on EC2」と実行環境を判別することができるようです。
 

stressテスト用のJavaを実行してみる

apache-cassandra-0.7.4-src内に「contrib/stress/bin/stress」というスクリプトがあります。
このスクリプトを利用して、さくらVPSとstressの結果を比較してみたいと思います。

EC2上で実施すると下記のようなエラーがでました。

 contrib/stress/bin/stress: line 49:  6196 強制終了            $JAVA -server -cp $CLASSPATH org.apache.cassandra.contrib.stress.Stress $@

 
OOM killerっぽい挙動かな?と思いメモリを確認してみるとSwapが0なのでした。

free -m
             total       used       free     shared    buffers     cached
Mem:           622         81        540          0          0          8
-/+ buffers/cache:         72        549
Swap:            0          0          0

 
このまま実行できないのもアレなので、memory overcommitを少しいじってみました。

 $cat /proc/sys/vm/overcommit_memory
  0
 $vi /etc/sysctl.conf
   vm.overcommit_memory = 1
   vm.overcommit_ratio = 99
  $/sbin/sysctl -p
  $cat /proc/sys/vm/overcommit_memory
   1

 
再度、実行してみると、若干うごきました。

 # contrib/stress/bin/stress -d 10.146.89.114
  Keyspace already exists.
  total,interval_op_rate,interval_key_rate,avg_latency,elapsed_time
  20319,2031,2031,0.002240710664894926,45
  56004,3568,3568,0.002166932884965672,96
  contrib/stress/bin/stress: line 49:  6196 強制終了            $JAVA -server -cp $CLASSPATH org.apache.cassandra.contrib.stress.Stress $@

 
結局、実行することができなかったので、次は、「Small Instance」あたりで試してみようと思います。
 


*1:ただ、ランニングコストとしては安くはないのですが・・。

*2:ファイアーウォール環境だとうまく動作しないかもしれません

*3:課金量がよく分かってないのでご利用は計画的に…

*4:正確には違うかもしれませんが、今はその認識ですすめてます。