Net::Amazon::EC2でEC2 API Toolsより高速にEBSのスナップショットを取得
こんにちは。フレクト 大橋です。
前回、EBS上に置いたMySQLのバックアップを取得する方法を紹介しましたが、
EC2 API Toolsを使ったEBSのスナップショット取得に5秒くらいかかってしまう
欠点がありました。
欠点がありました。
(※ 5秒かかるのは私たちが使っているベターホームレシピ(http:bhmb.jp)でのことで
他の環境ではどうかは分かりませんが、それなりにかかると思います)
前回紹介した方法ではスナップショット取得中はファイルシステムへの書き込みを
ブロックしているので、運用中のサービスによっては5秒程度ブロックされるが嫌だったり
することもあると思います。
ところが以下を見てみると、スナップショット取得にEC2 API Toolsの
「ec2-create-snapshot」コマンドを使うより、PerlでNet::Amazon::EC2モジュールを
使った方が高速にスナップショット取得ができそうとのことなので
やってみました。
やってみました。
■ Net::Amazon::EC2を使ったEBSスナップショットの取得
cpanからNet::Amazon::EC2モジュールをインストールしてください。
cpanコマンドを使えば簡単にできると思います。Mooseが入っていないと
Mooseのインストールも必要になるため、若干時間がかかるかもしれません。
インストールしたあと、以下のようなスクリプトでEBSのスナップショット取得ができます。
Volume IDは各自の環境のものをご利用ください。またAmazon Web Serviceのアクセスキー、秘密鍵なども各自の環境のものをご利用ください。
#!/usr/bin/env perl # ebs_snapshot.pl use strict; use warnings; use Net::Amazon::EC2; my $aws_access_key = $ENV{EC2_ACCESS_KEY}; my $aws_secret_key = $ENV{EC2_SECRET_KEY}; my $volume_id = 'vol-xxxxxxx'; my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key, SecretAccessKey => $aws_secret_key, region => 'us-west-1', ); my $snapshot = $ec2->create_snapshot( VolumeId => $volume_id, Description => 'snapshot by Net::Amazon::EC2', ); exit 0;
■ EC2 API Toolsとの比較
EC2 API Toolsを使うと以下のようなコマンドでスナップショットが取れます。
Volume IDに各自の環境のものをいれます。
> ec2-create-snapshot -d 'スナップショットの説明' Volume-ID
EC2 API Toolsで私ども環境でEBSのスナップショット(40GB)を取得してみると、
timeコマンドでの計測ではだいたい4秒から5秒くらいかかっています。
環境はus-west-1のEC2上のインスタンスを使いました。(一部出力を省略しています)
【1回目】
# time ec2-create-snapshot -d command-line-test-01 vol-xxxxx
real 0m5.020s
user 0m4.408s
sys 0m0.205s
【2回目】
# time ec2-create-snapshot -d command-line-test-02 vol-xxxx
real 0m4.696s
user 0m4.603s
sys 0m0.151s
【3回目】
# time ec2-create-snapshot -d command-line-test-03 vol-xxxx
real 0m4.479s
user 0m4.590s
sys 0m0.165s
次にNet::Amazon::EC2を使ったスクリプトで計測してみました。
スクリプトは先ほど説明したPerlのスクリプトで、ebs_snapshot.plとしています。
EC2 API Toolsで計測した環境と同じ環境で試してみました。
【1回目】
# time perl ebs_snapshot.pl
real 0m1.256s
user 0m0.747s
sys 0m0.050s
【2回目】
# time perl ebs_snapshot.pl
real 0m1.468s
user 0m0.848s
sys 0m0.041s
【3回目】
# time perl ebs_snapshot.pl
real 0m1.331s
user 0m0.792s
sys 0m0.021s
だいたいこっちは1.2秒〜1.4秒くらいのスピードでできました。
EC2 API Toolsより3倍〜4倍くらいのスピード。計測方法が若干いい加減ですが、
速くなるのは間違いなさそうです。
EC2 API Toolsより3倍〜4倍くらいのスピード。計測方法が若干いい加減ですが、
速くなるのは間違いなさそうです。
こっちを使えば、バックアップ時に書き込みロックの時間を少し軽減できそうです。
また、コマンドライン操作でもストレスが減りますね。
■ なぜ速いのか&まとめ
詳細を調査したわけではないですが、単純にEC2 API ToolsはJavaでできていて
コマンドラインで実行すると起動すると実処理に入るまでが時間がかかることが
大きいです。あとはNet::Amazon::EC2はQuery APIを使っていて、EC2 API Toolsが
SOAPを使っているのも遅くなる要因にはあると思いますが、実時間がどれくらい
差があるのかは分かりません。
Amazon Web Servicesを操作するコマンドで、よく使うものは
Perl, Rubyなど起動の軽いスクリプトでQuery APIを使って運用ツールを作った方
が長期的には何かとストレスが小さいかな、と思います。
フレクトではAmazon Web Servicesを使ったプロダクトやソリューション事業を積極的に
実施しています。興味のある方はいつでも以下からご連絡ください。
コメント