AWS Marketplace GridDB Standard Edition AMIのデプロイ

2017年4月、東芝はAWSマーケットプレイスでGridDB SE Amazon Machine Imagesの提供を開始しました。 システム管理者や開発者は、このAMIを使ってクラウド内でGridDBをこれまでより迅速にセットアップすることができます。 このブログでは、小規模クラスタを効果的にデプロイする方法をご紹介します。例として5つのアプリケーションサーバーと3つのGridDBノードを持つ8ノードクラスタを作成し、YCSBを実行して動作検証をしたいと思います。

インスタンスの起動

AWSを初めてお使いの場合は、アカウントを作成した後、SSH公開鍵をアップロードするか、EC2コンソールから作成する必要があります。 VMを起動する予定の地域(region)で鍵のペアをアップロードもしくは作成してください。

アップロードもしくは作成が完了したら、マーケットプレイスでアプリケーションサーバに使用するGridDB SEとCentOS 7の両方のAMIを探しましょう。今回はRedHatまたはAmazon Linux AMIの代わりにCentOS 7 AMIを使用します。これは、GridDB AMIがCentOS 7ベースで作られており、同じベースプラットフォームの方がソリューションをより簡単にデプロイできるためです。
GridDB: https://aws.amazon.com/marketplace/pp/B01N9QMCMF
CentOS 7: https://aws.amazon.com/marketplace/pp/B00O7WM7QW

どのインスタンスタイプを使用すべきかは、アプリケーションによって異なります。これまでの経験によると、YCSBはCPUを大量に消費しますが、メモリを大量に消費することはありません。そのため、C3/C4インスタンスはアプリケーションサーバーに最適です。 C4はC3と同じコストでより新しいプロセッサとより高速なネットワークを持つため、今回はC4を選択しました。

GridDBは多くのデータベースをメモリ内に保持することができ、R3/R4インスタンスはより多くのメモリを含むので、より理想的であると言えます。 R3にはSSDストレージが含まれていますが、ハードウェア要件の見積もりのブログのとおり、メモリ内のデータベース用に約3倍のディスクストレージと、データベースがメモリ境界を超えて拡大する場合はさらに多くのディスクストレージを必要とするため、R4インスタンスを作成し、後から追加のSSD EBSボリュームを作成することにします。

マーケットプレイスのページから、「ワンクリック」を使用して、選択したインスタンスタイプを使用して、3つのGridDBインスタンスと5つのCentOS 7インスタンスを作成します。

ここで、GridDBサーバー用のSSDボリュームを作成する必要があります。 EC2コンソールから、「Volume」に進み、「Create New Volume」に進みます。もう一度、ハードウェア要件の見積もりのブログをチェックして、あなたのソリューションのために必要なボリュームの大きさを判断してください。 GP2ボリュームは、価格とパフォーマンスの優れた組み合わせで、ほとんどのアプリケーションで推奨されています。可用性ゾーンは非常に重要な設定オプションで、インスタンスとまったく同じゾーンである必要があります。もしインスタンスがus-east-1eゾーンにあり、ボリュームゾーンにus-east-1aのデフォルト選択を使用すると、ボリュームをインスタンスに接続できなくなります。ボリュームを作成したら、「Action」、そして「Attach Volume」に進みボリュームを添付します。

インスタンスの設定

インスタンスが起動したら、ycsb1-5やgsserver1-3のようにインスタンス名をすべて指定することをお勧めします。sshを使ってycsb1から他のノードだけを管理しますので、秘密鍵もアップロードしてください。

$ scp ~/.ssh/id_rsa ycsb1_public_ip:.ssh/

すべてのサービスにローカルIPを使用し、外部IPは動的で再起動時に変更されます。 アプリケーションで一貫した外部アクセスが必要な場合は、必要に応じてElastic IPを割り当てることができます。

AWSに関して注意すべきことは、ローカルIPの決定が非常にランダムであることです。 IPは、172.16.1.10,11,12,13,15のような順序ではなく、172.31.63.83、172.31.61.5、172.31.57.184のようになります。 これを回避するには、以下のような3つのファイルを作成するとよいでしょう。
all_ips: 各行にインスタンスのローカルIPを記載します。
ycsb_ips: 各行にアプリケーションサーバーのローカルIPを記載します。
griddb_ips: 各行にGridDBサーバのローカルIPを記載します。

小規模クラスタの管理を容易にするために、ファイルをコピーしてノード上のプログラムを実行する2つのスクリプトを作成します。 大規模なクラスタでは、Puppetや他の構成管理システムを使用することをお勧めします。

runcmd.shは、上のファイルと実行するコマンド引数の文字列の1つを入力として取ります。

#!/bin/bash
for x in `cat $1`; do ssh -t centos@$x $2; done

cpall.sh takes as input one of the file above plus a path to copy:

#!/bin/bash
for x in `cat $1`; do scp -r $2 $x:$3; done

GridDBサーバの起動

まずは、上記で作成した添付のSSD EBSボリュームをパーティション分割します。

$ sudo fdisk /dev/xvdf
Command (m for help): n
Partition type:
 p primary (0 primary, 0 extended, 4 free)
 e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (63-83886079, default 63): 
Using default value 63
Last sector, +sectors or +size{K,M,G} (63-83886079, default 83886079): 
Using default value 83886079
Partition 1 of type Linux and of size 40 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

次に、新しく作成したパーティションをフォーマットします。

$ sudo mkfs.ext4 /dev/xvdf1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
2621440 inodes, 10485752 blocks
524287 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
 4096000, 7962624

Allocating group tables: done 
Writing inode tables: done 
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

GridDBを設定する方法に関するドキュメントがいくつかありますが、それらのガイドのほとんどはマルチキャストをサポートするプライベートネットワーク上でCommunity Editionを使用しています。 AWSを含むほとんどのクラウドサービスは、インスタンス間のマルチキャストをサポートしないため、固定リストを使用してGridDBを設定する必要があります。

お持ちのエディタで/etc/fstabを編集し、次のように新しいボリュームを追加してください。

/dev/xvdf1/var/lib/gridstore/data ext4 defaults 0 0

新しいパーティションをマウントし、権限が正しいことを確認します。

$ sudo mount /var/lib/gridstore/data
$ sudo chown gsadm.gridstore /var/lib/gridstore/data

その後再起動すると自動的にマウントされます。これでGridDB自体を設定し起動することができます。GridDBのすべての設定をgsadmユーザーとして実行すると、今後権限の問題が起こりにくくなります。次のコマンドでgsadmユーザーに切り替えることができます。

$ sudo su - gsadm

/var/lib/gridstore/conf/gs_cluster.jsonを編集して、$ GRIDDB_1、$ GRIDDB_2、$ GRIDDB_3を3つのGridDBサーバすべての正しいIPアドレスに置き換えます。

{
        "dataStore":{
                "partitionNum":128,
                "storeBlockSize":"64KB"
        },
        "cluster":{
                "clusterName":"AWSCluster",
                "replicationNum":2,
                "heartbeatInterval":"5s",
                "loadbalanceCheckInterval":"180s",
                "notificationMember": [
                        {

                                "cluster": {"address":"$GRIDDB_1", "port":10010},
                                "sync": {"address":"$GRIDDB_1", "port":10020},
                                "system": {"address":"$GRIDDB_1", "port":10040},
                                "transaction": {"address":"$GRIDDB_1", "port":10001},
                        },
                        {

                                "cluster": {"address":"$GRIDDB_2", "port":10010},
                                "sync": {"address":"$GRIDDB_2", "port":10020},
                                "system": {"address":"$GRIDDB_2", "port":10040},
                                "transaction": {"address":"$GRIDDB_2", "port":10001},
                        },
                        {

                                "cluster": {"address":"$GRIDDB_3", "port":10010},
                                "sync": {"address":"$GRIDDB_3", "port":10020},
                                "system": {"address":"$GRIDDB_3", "port":10040},
                                "transaction": {"address":"$GRIDDB_3", "port":10001},
                        }
                ]
        },
        "sync":{
                "timeoutInterval":"30s"
        }
}

最適なパフォーマンスを得るには、gs_node.jsonファイルの storeMemoryLimit フィールドを “10240MB”に、concurrencyフィールドを2に編集します。
次の3つのGridDBサーバすべてでadminユーザのパスワードを設定します。

$ gs_passwd
Password: 
Retype password: 
$ exit

Finally, edit /etc/sysconfig/gridstore/gridstore.conf changing CLUSTER_NAME=INPUT_YOUR_CLUSTER_NAME_HERE to CLUSTER_NAME=AWSCluster and set MIN_NODE_NUM=3.
これで、3つのGridDBサーバでサーバプロセスを開始できます。

$ sudo systemctl enable gridstore
$ sudo systemctl start gridstore

3つのGridDBサーバのすべてで起動が成功した場合は、gs_statコマンドでその動作を確認できます。マスター上で実行すると、すべてのノードのリストが返されますが、フォロワー上でgs_statを実行すると、自身とマスターのみが含まれます。

 "cluster": {
        "clusterName": "AWSCluster", 
        "clusterStatus": "FOLLOWER", 
        "designatedCount": 3, 
        "loadBalancer": "ACTIVE", 
        "master": {
                "address": "172.31.57.21", 
                "port": 10040
        }, 
        "nodeList": [
        {
               "address": "172.31.57.184", 
               "port": 10040
        }, 
        {
               "address": "172.31.57.21", 
               "port": 10040
        }
        ], 
        "nodeStatus": "ACTIVE", 
        "notificationMode": "FIXED_LIST", 
        "partitionStatus": "NORMAL", 
        "startupTime": "2017-07-19T00:31:12Z", 
        "syncCount": 6
 }

Application Server Configuration

各ノードで以下を実行する必要がある場合を除き、アプリケーションサーバーを設定します。

まず、 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlからダウンロードできるJava x64 RPMをインストールする必要があります。

$ sudo rpm -Uvh jdk-8u121-linux-x64.rpm

GridDBクライアントはGridDB SE AMIインスタンスにありますが、GridDB SEクライアントとCEクライアントは互換性がありません。CEクライアントとSEサーバを併用することはできません。 GridDBサーバのいずれかからRPMファイルをコピーできますが、その権限はrootが所有しています。

$ ssh -t $GRIDDB_1 sudo chmod 755 /usr/gridstore/rpm
$ ssh -t $GRIDDB_1 sudo chmod 644 /usr/gridstore/rpm/griddb-se-java_lib-3.1.0-linux.x86_64.rpm.rpm

これですべてのアプリケーションでRPMSをコピーしてインストールできます。

$ scp -r $GRIDDB_1:/usr/gridstore/rpm/griddb-se-java_lib-3.1.0-linux.x86_64.rpm ~
$ sudo rpm -Uvh ~/griddb-se-java_lib-3.1.0-linux.x86_64.rpm

最後に、.bashrcを編集してCLASSPATH変数を設定します。

export CLASSPATH=:/usr/share/java/gridstore.jar

YCSBの設定

「YCSB向けGridDBコネクタを使ってみよう」 に従いますが、FIXED_LIST通知メカニズムについては、いくつかの変更を行います。

すべてのYCSBコマンドに次のYCSBオプションを使用します。

YCSB_OPTIONS=" -p notificationMember=172.31.57.184:10001,172.31.61.151:10001,172.31.57.21:10001 -p clusterName=AWSCluster -p userName=admin -p password=admin -cp /usr/share/java/gridstore.jar -p fieldlength=100 -p fieldcount=10"

次に、ロード・ワークロードを実行して、すべてが機能していることを確認します。

$ ./bin/ycsb load griddb -P workloads/workloada $YCSB_OPTIONS

次に、トランザクション・ワークロードを実行します。

$ ./bin/ycsb run griddb -P workloads/workloada $YCSB_OPTIONS

1つのアプリケーションサーバーノードですべてが機能したら、YCSBディレクトリを他のクライアントノードにコピーし、テストを実行します。すべてが機能したら、マルチノードテストに進む準備が整います。

マルチノードYCSB

次のスクリプトは、GridDBに10M行をロードした5つのYCSBクライアントを実行し、単純な読み書きワークロードであるWorkload Aを実行します。 上記のスクリプトと同様に、$ GRIDDB_1,2,3と$ YCSB_1,2,3,4,5を正しいIPアドレスに置き換えてください。

#!/bin/bash

COUNT=10000000
OPCOUNT=1000000
LOADSIZE=`expr $COUNT / 5`

YCSB_OPTIONS="-p notificationMember=$GRIDDB_1:10001,$GRIDDB_2:10001,$GRIDDB_3:10001 -p clusterName=AWSCluster -p userName=admin -p password=admin -cp /usr/share/java/gridstore.jar -p fieldlength=100 -p fieldcount=10"

echo Loading...

./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p recordcount=${COUNT} -p insertstart=`expr $LOADSIZE * 0` -p insertcount=${LOADSIZE} -s &
pids="$! "
ssh $YCSB_2 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p recordcount=${COUNT} -p insertstart=`expr $LOADSIZE * 1` -p insertcount=${LOADSIZE} -s &
pids="$! $pids"
ssh $YCSB_3 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p recordcount=${COUNT} -p insertstart=`expr $LOADSIZE * 2` -p insertcount=${LOADSIZE} -s &
pids="$! $pids"
ssh $YCSB_4 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p recordcount=${COUNT} -p insertstart=`expr $LOADSIZE * 3` -p insertcount=${LOADSIZE} -s &
pids="$! $pids"
ssh $YCSB_5 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p recordcount=${COUNT} -p insertstart=`expr $LOADSIZE * 4` -p insertcount=${LOADSIZE} -s &
pids="$! $pids"

wait $pids

echo
echo Running...
./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p operationcount=${OPCOUNT} -p recordcount=${COUNT} -s
pids="$! "
ssh $YCSB_2 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p operationcount=${OPCOUNT} -p recordcount=${COUNT} -s
pids="$! $pids"
ssh $YCSB_3 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p operationcount=${OPCOUNT} -p recordcount=${COUNT} -s
pids="$! $pids"
ssh $YCSB_4 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p operationcount=${OPCOUNT} -p recordcount=${COUNT} -s
pids="$! $pids"
ssh $YCSB_5 ./ycsb-0.10.0/bin/ycsb load griddb -P ycsb-0.10.0/workloads/workloada $YCSB_OPTIONS -p operationcount=${OPCOUNT} -p recordcount=${COUNT} -s
pids="$! $pids"

wait $pids

これですべて完了しました。 いかがでしたでしょうか?みなさんの理想的な設定になるよう、上記の条件を色々と微調整してみてください。

If you have any questions about the blog, please create a Stack Overflow post here https://stackoverflow.com/questions/ask?tags=griddb .
Make sure that you use the “griddb” tag so our engineers can quickly reply to your questions.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください