こんにちは、エバンジェリストの藤城(@tafujish)です。
以前にAerospikeのMeetupで登壇させてもらったときに、ブログ書く書く言って長らく書けていなかったのですが、金杉がお試し記事を書いてくれました。
Aerospikeって何という方はそちらを読んでいただき、ここではAerospikeをIDCFクラウド上で使うのがなぜ適しているのかやベストプラクティスを紹介したいと思います。
なぜ、AerospikeをIDCFクラウド上で動かすのか
1) オールフラッシュストレージ
Aerospikeのデータの格納方法として、超高速にトランザクション処理できるがデータは揮発な「インメモリ」と、データをディスクに格納することで不揮発な「パーシステンス」の両方が利用できます。
その一方で、そもそもAerospikeは高速なトランザクションが得意で、なおかつSSDに最適化されていますので「パーシステンス」でも十分高速です。
IDCFクラウドは、オールフラッシュストレージを採用していますので、ディスクI/Oとしても高速です。そのため、「パーシステンス」で利用したとしても、高速な処理かつデータは不揮発で利用可能です。
2) 高速なCPU/メモリ
Aerospikeの処理にはディスクI/OだけでなくCPUとメモリがもちろん使用されます。Aerospikeの特徴として、スケールアップすることでAerospikeの処理性能を引き上げることができます。
もちろんIDCFクラウドはCPUとメモリの処理速度としても高速です。高性能な仮想化ハイパーバイザーとリソースの最適配置により高性能かつ安定した性能を提供していますので、Aerospikeの高性能を活かすことが可能です。
3) 高帯域の内部ネットワーク
ディスクI/O、CPU、メモリが高速になってくると、ボトルネックがネットワーク帯域になってきます。実際にAerpspikeをオンプレミスで利用しているユーザーの話でも1GbpsのNICがボトルネックになるという話がありました。
IDCFクラウドでは、通常の仮想マシンであれば2Gbps、専有タイプの仮想マシン(3XL128や5XL128)であれば5GbpsのNIC帯域が利用できネットワークボトルネックを回避可能です。
4) マルチキャスト対応
Aerospikeの特徴のひとつとして自律的な動作があります。Aerospikeの各ノードが自動構成されクラスタが組まれ、故障時の切り離しや、クラスタへ戻したときのデータ再配置も自動で行われます。通常、この各ノード間のやりとりはマルチキャスト通信が利用されています。
IDCFクラウドのネットワークでは、マルチキャスト通信が利用可能です。そのためAerospikeのクラスタは、ノードを起動するだけで、自動でクラスタが構築されスケールアウトしていくことが可能なため、簡単に運用することができます。
Aerospike on IDCFクラウドのベストプラクティス
それでは、実際にIDCFクラウド上でAerospikeを動かすときに性能を最大限活用するためのベストプラクティスを紹介します。
●リージョン/ゾーン
高速なディスクI/Oが利用できるため、オールフラッシュストレージを採用しているゾーンを利用してください。
具体的には、東日本リージョンのradian、newtonゾーン。
西日本リージョンのaugusta、monsteraゾーン。
またはこれらより新しいゾーンでオールフラッシュが利用可能です。これらのゾーン上で、仮想マシンを作成すると、そのストレージは特別な操作不要ですべてフラッシュとなります。
最新の対応状況は次のページで確認できます。
https://www.idcf.jp/cloud/spec/region_zone.html
同じゾーン内でAerospikeの仮想マシンを作成すると、同じネットワークに属しマルチキャストにより自動でクラスタが構成されます。
●ネットワークインターフェース
通常、仮想マシンを作成するだけで、高いパケット処理性能・高帯域なNICが提供されます。
RSSに対応しているためRPS/RFSの設定も不要ですのでそのままお使いください。
ただし、ISOからOSをインストールした場合は、その限りではないのでご注意ください。一応、確認方法ですが、
$ ethtool -i eth0
driver: vmxnet3
~以下、略~
driverがvmxnet3になっていればそのままご利用ください。
もし、e1000となっている場合は、テンプレートをエクスポート/インポートしNICを再設定するかRPS/RFSの設定を入れてください。
●DATAディスクのウォームアップ
作成されたDATAディスクは、シンプロビジョニングで作られただけなので使用領域を事前に確保して、オーバーヘッドを減らしておきます。例えば、次のように構築前にゼロデータでディスク容量一杯まで埋めておきます。
$ sudo dd if=/dev/zero of=/dev/sdb bs=1M dd: writing `/dev/sdb': デバイスに空き領域がありません 819201+0 records in 819200+0 records out 858993459200 bytes (859 GB) copied, 2078.7 s, 413 MB/s
2つ目のDATAディスクがあれば/dev/sdcといったように、利用するデバイスすべてに実施してください。
●ストレージエンジンの設定
Aerospikeの設定(標準で/etc/aerospike/aerospike.conf )にてストレージエンジンの設定をパーシステンスにする際、大きく2パターンあります。
storage-engine device { file /aero/test.dat filesize 64G }
こちらの設定では、ファイルシステム上にAerospikeのデータファイルを置くので取り回しが簡単です。
一方、複数のデバイスを並列に扱うことができ、かつファイルシステムをバイパスすることで性能をスケールさせることができる設定もあります。
storage-engine device { device /dev/sdb device /dev/sdc write-block-size 1024K }
IDCFクラウドでは、ストレージの種類がひとつだけなので、shadow device(device /dev/sdb /dev/sdcと一行で書く)として階層を設ける必要はありません。接続されているデバイス(DATAディスク)を行を分けて書いてください。
インメモリとパーシステンスのベンチマーク
最後にベンチマークをして、インメモリ(揮発)とパーシステンス(不揮発)の性能差を確認しましょう。
Aerospikeのサーバーは、IDCFクラウドのnewtonゾーン(オールフラッシュ)にて、Standard.X16(4コア/16GBmem)のCentOS6.7にて構築。サーバーとは別のマシンからベンチマークを実行。ベンチマークはAerospikeのCクライアント標準のものを利用し、次のとおり実行しています。結果はAMC上のスループットの値です。
・./benchmarks -h <IP Address> -k 4000000 -o S:2048 -w RU,50 -z 64
Aerospikeサーバーを1台のシングル構成と、3台でクラスタ構成でのベンチマーク結果が次の通りです。
もちろんの結果ですが、パーシステンスよりインメモリの方がより高速な結果でした。ただ、ここで言いたいのは、インメモリとパーシステンスとの性能差が小さいことです。オールフラッシュが活き、パーシステンスでも十分に高速なので、データが消えるインメモリをわざわざ使わなくても良いのではないでしょうか。
一点補足しておくと、シングル構成と3ノードクラスタ構成で、スコアにほぼ差が出ていないですが、クラスタ構成によりデータレプリケーションが生じるのでその分のオーバーヘッドがあるため台数分の性能になっていません。4台以上にノードを増設していくと、スコアもどんどん上がっていきます。このあたりのスケール性能は、次のAerospikeのMeetupで話させていただいた通りです。
www.slideshare.net
まとめ
Aerospikeはその高性能かつ簡単にスケールできることがメリットのNoSQL DBですが、IDCFクラウドの構成や性能と相性がよいです。また、IDCFクラウドのオールフラッシュストレージの基盤を活用できるのでパーシステンスでの高性能に利用することが可能です。
Aerospikeの事例紹介やEnterprise版の紹介なども可能ですので、これからAerospikeを検討するという場合も、IDCFまでお問い合わせください。