※コメントでご指摘頂いたSLAの箇所を修正しました。
高可用性とは
何か障害があっても、システムの停止時間をなるべく少なくすることを指す。絶対に止まらないということではなく、障害が発生することを前提とし、停止時間をどれだけ短くすることができるのかという考え方。
高可用性の実現には、複数のAZおよびリージョンにまたがるアーキテクチャにしたり、Auto Scalingを使用するといった方法がある。
高可用性を実現するAWSサービス例
- Amazon RDS
- Amazon DynamoDB
- Amazon S3
- Amazon SQS
- Elastic Load Balancing
高可用性を実現したシステム構成の例
仮に、SLAを満たすには4つのEC2インスタンスが必要なシステムをAWS上に構築していたとします。
- 2つのAZに2つずつEC2インスタンスを起動
- AZ-aに障害が起きた場合、残るのはAZ-bの2つのみ
- 残されたAZ-bに、新たに2つのEC2インスタンスが起動されるまではSLAを満たすことができない
この構成例だと常時4つのEC2インスタンスが起動しているため、平常時はSLAを満たすことが出来ている。しかし、AZ-aに障害が起きると一時的に2つのEC2インスタンスしか起動していない状態になり、SLAを満たせない時間が発生する。
可用性レベルを向上させたいのならば、Auto Scalingを設定しておいて、足りなくなった2つのEC2インスタンスが自動的にAZ-bで起動されるような構成を取るとよい。
耐障害性とは
高可用性は、システムの停止時間をどれだけ短くできるかに焦点を当てた考えた方。耐障害性は、何か障害が起きたときでもシステムのパフォーマンスを落とすことなくシステムを稼働し続けられる冗長構成のことを指す。すなわちサービスレベルアグリーメント(SLA)を守り続けられる構成のこと。
耐障害性を実現するAWSサービス例
- Amazon DynamoDB
- Amazon Route53
耐障害性を実現したシステム構成の例
こちらも仮に、SLAを満たすには4つのEC2インスタンスが必要なシステムをAWS上に構築していたとします。
- 2つのAZに4つずつのEC2インスタンスを起動
- AZ-aに障害が起きた場合でも、AZ-bにはまだ4つのEC2インスタンスが残っている
- したがってシステムのパフォーマンスは落ちないためSLAを守り続けることができる
こうすることで、AZ-aまたはAZ-bに障害が発生した場合でもSLAを満たし続ける構成にすることができる。ただし、常時8つのEC2インスタンスを起動し続けているため、コスト的には高可用性の構成よりも運用コストは高くなってしまう。
まとめ
- 高可用性
- システムが止まらないための構成を考える
- 仮にシステムが止まったとしても停止時間をいかに短くするかを考える
- 耐障害性
- 障害発生時でもシステムのパフォーマンスを落とさないことを考える
- 一般的に耐障害性を高めるとコストは高くつきやすい
高可用性と耐障害性をバランスよく実現するのであれば、前述の例でいくと、3つのAZに2つずつEC2インスタンスを起動する構成が考えられる。通常の運用コストは6つのEC2インスタンス分ですむし、いずれかのAZに障害が発生したとしてもSLAを守り続けることができる。
設計的にはAZ3つにまたがる形になるため、システムの複雑さは増す。