概要
AWS AutoScalingGroup(EC2)のAZとRDSのAZが異なる場合、処理速度に影響がある?
ということで、こちらについて解説していきます。
結論
影響あることがわかりました。
具体的には、異なるAZ間の通信が発生すると、同じAZ間の通信よりも遅いです。
検証前提
今回、以下の内容で検証しました。
・EC2インスタンスのAutoScalingGroupのAZをap-northeast-1aとap-northeast-1cの二つにしている
・EC2インスタンスを二台起動している(それぞれ1aと1cに一台ずつ)
・それぞれのEC2にECSタスクを立ち上げ、タスク内で動くプログラム(API)が稼働している
・RDSインスタンスのAZはap-northeast-1aのみ(レプリカは無し)
・アプリはDB通信を行うプログラム
検証結果
APIを何回か投げていると、応答性能に幅が見られました。
これは、1aにあるECSタスクにAPIコールが投げられた時と、1cにあるECSタスクにAPIコールが投げられた時の差と考えられます。実際にコマンドを使って、EC2とRDSの間の応答性能を確認してみます。
nping
というツールを使うとネットワークのレイテンシー測定ができます。
これはポートスキャンツールのパッケージnmap
の中に含まれているので、まずは以下をEC2にインストールします。
sudo yum install nmap
1aのEC2 <-> 1aのRDS で実施した場合
$ sudo nping -c 100 xxx.xxxx.ap-northeast-1.rds.amazonaws.com -p3306 --tcp
結果は以下(5パケット平均)
Max rtt: 0.149ms | Min rtt: 0.122ms | Avg rtt: 0.137ms
Raw packets sent: 5 (200B) | Rcvd: 5 (220B) | Lost: 0 (0.00%)
1cのEC2 <-> 1aのRDS で実施した場合
$ sudo nping -c 100 xxx.xxxx.ap-northeast-1.rds.amazonaws.com -p3306 --tcp
結果は以下(5パケット平均)
Max rtt: 1.736ms | Min rtt: 1.566ms | Avg rtt: 1.608ms
Raw packets sent: 5 (200B) | Rcvd: 5 (220B) | Lost: 0 (0.00%)
rttとは、Round Trip Timeの略称で、「応答が返ってくるまでにかかる時間」のことです。
二つを比べてみると、1a同士の場合は5回平均が0.137msであるのに対して、1cと1aの場合は5回平均で1.608msと差が出ていることがわかります。
やはり同じAZ間の方が早いですね。
補足
ちなみにEC2をマルチAZ構成にしたい場合、RDSもマルチAZ構成にするのが一般的だと思いますが、この場合はレプリカを作成しないといけないのでコストが増えてしまいます。そこまで求められていない場合は、シングルAZ構成にすると処理速度は向上します。ここはトレードオフですかね。
また、マルチAZ構成からシングルAZ構成に戻す際は、以下の手順が大事です。
以下であればECSコンテナが常に一つは稼働しています。
①AutoScalingGroupで台数を二台に設定する = EC2インスタンスが1aと1cに起動される
②ECSタスクがそれぞれ1aと1cのEC2インスタンスで稼働していることを確認する
(もしどちらかに集中してしまっている場合は、一度ひとつのタスクを停止します。すると自動で新しいタスクがもうひとつのEC2の方で起動し始めます)
③AutoScalingGroupから1cを外す = 1cにあるEC2インスタンスがシャットダウンされる
④AutoScalingGroupの台数は二台のまま。1aにもう一台のEC2が起動し始める
これでシングルAZ構成でEC2インスタンスが二台立ち上がりました。
一台にしたい場合は、最後にAutoScalingGroupで台数を一台にすればOKです。
参考記事