9月20日に発生したAmazonクラウドのDynamoDB障害。原因はセカンダリインデックス増大によるメタデータ処理のパンク
Amazonクラウドが提供しているDynamoDBは、キーバリュー型のNoSQLデータベースサービスです。運用管理はクラウドに任せられて簡単に利用でき、高速かつ非常に大規模なスケールで展開できることなどを特長とする、クラウドならではのサービスの1つです。
そのDynamoDBで、米東リージョンにおいて9月20日午前2時頃(太平洋夏時間)から午前7時頃まで障害が発生。DynamoDBを利用しているEC2 Auto Scaling、Simple Queue Service、CloudWatch、そしてコンソールなどにも一時的な障害が発生していました。
また、この障害はAmazonクラウドを利用している他社のさまざまなサービスにも影響を与えたと報じられています。
- Amazon’s AWS DynamoDB experiences outage, affecting Netflix, Reddit, Medium, and more (Update: Fixed) - VentureBeat
- AWS glitch strikes Netflix and Tinder, offering a wake-up call for others | PCWorld
なぜDynamoDBが障害を起こしたのか、報告書として「Summary of the Amazon DynamoDB Service Disruption and Related Impacts in the US-East Region」が公開されました。
報告書の内容を手短にまとめると、DynamoDBの新機能としてテーブルに新たなインデックスを付加できるGlobal Secondary Indexesを追加した結果、多数の利用者がこの機能を利用し、管理のためのメタデータが劇的に増大。
そこへネットワーク障害が一時的に発生、障害からの復旧時に行われるメタデータの処理時間が予想以上にかかるようになり、メタデータの処理がパンク。それがほかのサーバを巻き込んで大きな障害へ発展していった、ということのようです。
以下で報告書のポイントをまとめました。
ネットワーク障害が引き金に
DynamoDBは、データを「パーティション」に分けて複数のサーバで分散保持しており、データを保持するサーバは「ストレージサーバ」と呼ばれます。一方、どのパーティションがどこに属するデータなのかなどを示す「メンバーシップ情報」があり、これも「メタデータ」としてDynamoDBで管理されています。ストレージサーバは自身が正しいメンバーシップ情報を持っていることをメタデータサービスに定期的に確認しています。
報告書によると、過去数カ月で利用者がDynamoDBの新機能であるGlobal Secondary Indexesが急速に利用され始めたとのことです。これによってパーティションが増加し、メンバーシップ情報のサイズも増加。
こうした中で、障害当日の午前2時19分にDynamoDBのストレージサーバ群の一部でネットワーク障害が起き、これがその後のDynamoDBの障害の引き金になります。DynamoDBの仕組みの説明も含む記述を引用します。
On Sunday, at 2:19am PDT, there was a brief network disruption that impacted a portion of DynamoDB’s storage servers. Normally, this type of networking disruption is handled seamlessly and without change to the performance of DynamoDB,
日曜日の2時19分(太平洋夏時間)、一時的なネットワーク障害があり、DynamoDBのストレージサーバの一部が影響を受けた。通常であれば、こうしたネットワーク障害に対してDynamoDBは性能低下を示すこともなく処理を継続しつつ対処する。
as affected storage servers query the metadata service for their membership, process any updates, and reconfirm their availability to accept requests. If the storage servers aren’t able to retrieve this membership data back within a specific time period, they will retry the membership request and temporarily disqualify themselves from accepting requests.
まず障害の影響を受けたストレージサーバはメタデータサービスにメンバーシップ情報を要求し、アップデート処理を行い、自身が利用者からのリクエストに応えられることを再確認する。もし規定時間内にストレージサーバがメンバーシップデータの取得を返答できなければ、リトライを行いつつ、自身のリクエスト受け入れ資格を一時的に不適格にする。
メタデータ処理がパンクし始める
DynamoDBはこうして自律的に復帰していくはずだったのですが、この日は状況が異なっていました。その説明部分。
With rapid adoption of GSIs by a number of customers with very large tables, the partitions-per-table ratio increased significantly. This, in turn, increased the size of some storage servers’ membership lists significantly. With a larger size, the processing time inside the metadata service for some membership requests began to approach the retrieval time allowance by storage servers.
多数のお客様による大規模テーブルに対するGSIの急速な追加は、劇的にテーブルあたりのパーティション数を増加させた。これによって、ストレージサーバのメンバーシップリストのサイズも劇的に増大。サイズの増大によって、いくつかのストレージサーバからのメンバーシップリクエストに対するメタデータサービス内部の処理時間が許容時間に達し始めていた。
報告書の中では、メンバーシップ情報の増大を詳細にモニタできていなかったこと、そのため処理用のリソースを十分に用意できていなかったことが示されています。
やがてメタデータ処理がパンクし始めます。
Multiple, simultaneous requests for these large memberships caused processing to slow further and eventually exceed the allotted time limit.
大規模なメンバーシップへの複数同時処理要求は処理速度をさらに遅滞させ、最終的に制限時間を超えてしまった。
This resulted in the disrupted storage servers failing to complete their membership renewal, becoming unavailable for requests, and retrying these requests.
結果としてネットワーク障害を受けたストレージサーバはメンバーシップ処理の更新処理に失敗し、処理要求を受け付けなくなり、リトライを行い続ける。
With the metadata service now under heavy load, it also no longer responded as quickly to storage servers uninvolved in the original network disruption, who were checking their membership data in the normal cadence of when they retrieve this information.
メタデータサービスは高負荷の状況になり、最初のネットワーク障害に巻き込まれていないストレージサーバからの、通常の処理であるメンバーシップ確認のためのリクエストにも応えられなくなった。
こうして多数のストレージサーバが次々に利用者からの要求を処理できなくなっていき、大きな障害に発展していきます。
対処と今後の方針
Amazonクラウドはメタデータサービスの処理能力をなんとか復旧させようとしますが、過負荷状態によってそれらの対処が妨げられてしまいます。そこで、午前5時にメタデータサービスへのリクエストを一時的に止めることを決断します。
at 5:06am PDT, we decided to pause requests to the metadata service. This action decreased retry activity, which relieved much of the load on the metadata service.
午前5時6分、われわれはメタデータサービスへのリクエストを一時的に停止させることを決断。これによってリトライが減少し、メタデータサービスが高負荷から回復してくる。
メタデータの処理が正常になり管理要求を受け入れるようになったため、より多くの処理が可能なようにリソースを追加。ストレージサーバからのリクエストをさばけるようになり、DynamoDBは正常状態に向かっていきます。
そして7時10分にエラー発生率も正常に戻り、DynamoDBは通常運用に復帰しました。
この障害を受けて、Amazonクラウドでは早急に以下の対策をしたと説明してます。
1つ目はメタデータサービスの処理能力の大幅な引き上げ。2つ目がメンバーシップサイズなどを含む詳細な監視機能の強化。3つ目はストレージノードからのメンバーシップ要求の頻度の引き下げです。
そして長期的には次のような大きな変更を行うとしています。
Finally and longer term, we are segmenting the DynamoDB service so that it will have many instances of the metadata service each serving only portions of the storage server fleet. This will further contain the impact of software, performance/capacity, or infrastructure failures.
最終的かつ長期的には、DynamoDBサービスをセグメント化していく。これはつまり、多数のメタデータサービスを特定のストレージサーバ群用にしていくこということ。これはソフトウェアや性能/容量、対障害基盤などに多くの影響を与えることになるだろう。
あわせて読みたい
クラウドのリージョンを丸ごと落とす過酷な試験を実現する「Chaos Kong」、Netflixが発表。「カオスエンジニアリング」の指針も表明
≪前の記事
国内のIaaS/PaaSクラウドシェア、1位はAWSで41%、2位Azureが19%、3位Googleが13%。MM総研