インフラ構築について考える機会があり、そこで重要な概念である
- 可用性(Availability)
- スケーラビリティ(Scalability)
- 一貫性(Consistency)
について改めて調べました。
可用性(Availability)とは
可用性とは、システムが使用できる状態が維持されていることを指します。
可用性が低いと、次のような事象が頻発します。
- Webサイトに繋がらない
- アプリにログインができない
つまり可用性が低い状態とは、サービスが利用できない状態ということです。
ユーザーにとっては重大な問題です。
可用性を挙げる手段としては、以下が挙げられます。
- 地理的に離れた複数のサーバーでシステムを構成する
複数のサーバーでシステムを構成することで、あるサーバーが壊れても他のサーバーで対応することができます。
これをサーバーの冗長化といいます。
例えば、ロードバランサ―を用いて複数の**仮想サーバー(VM)**に処理を分散させることで、一部のサーバーに障害が発生してもシステム全体は稼働し続けます。
さらに、地理的に離れた場所(リージョン)にサーバーを配置することで、ある地域で災害やネットワーク障害が発生しても別の地域のサーバーで対応することができます。
AWSを利用する場合、AZ(Availabirity Zone)やリージョンを分散させ手構成する手法が一般的にとられます。
スケーラビリティ(Scalability)とは
スケーラビリティとは、ユーザーやデータの増加に対して、性能を落とさずにサービスを維持するために柔軟に拡張できる力を指します。
例えば、
- ユーザー数が 100人 → 100万人 に急増
- タスク数が 100件/日 → 1000万件/日 に拡大
こうした急激な変化に対応できなければ、システムは遅延やダウンを引き起こします。
このように、ユーザー数やリクエスト数は時間経過とともに将来、必ず増えることを想定してシステムを構築する必要があります。
スケーラビリティを保つには、以下のようにサーバーをスケーリングすることで対処できます。
- サーバーの能力を上げる(垂直スケーリング(スケールアップ))
- サーバーの台数を増やす(水平スケーリング(スケールアウト))
前者では、CPUやメモリを増強してサーバーの能力を上げる(パワーアップする)手法を取っています。
これは、垂直スケーリングやスケールアップと呼ばれます。
後者では、サーバーの台数を増やすことでタスクを分散させ、サーバー1台当たりの負荷を分散させる手法を取っています。
これは、水平スケーリングやスケールアウトと呼ばれます。
特にWebサービスのような変動が激しいシステムでは、水平スケーリングが好まれます。オートスケーリングやロードバランサーと組み合わせることで、高い拡張性を実現できます。
一貫性(Consistency)とは
一貫性とは、いつ、どこからアクセスしても、データが正しく整っている状態を指します。
例えば、
スマホでTODOアプリに「買い物リスト」を追加したのに、PCで閲覧すると先程スマホから追加した買い物リストが表示されない
上記は一貫性が保たれていない状態で、サービスの信頼性を損ないます。
サービスとは、複数のデバイスやサーバーでデータをやり取りすることが想定されます。
特に以下の領域では致命的な事象となりかねません。
- 金融(送金髄かどうかの判定)
- 医療(カルテや投薬履歴の共有)
データが同期されていなかったり、古い情報が表示されたりすると、命やお金に関わる深刻な事故につながる可能性があります。
一貫性は利用するデータベースによって違いが発生します。
以下の通りです。
- RDB(Rerationa DataBase):強い一貫性を持ち、更新は即時に全体へ反映される
- NoSQL(Not only SQL):分散処理(スケーラビリティ)に優れます。ただし設定次第では整合性一時的にずれる可能性があり、一貫性を損なう可能性があります。
まとめ
- 可用性:システムが使用できる状態が維持されていること。
- スケーラビリティ:ユーザー増加に対して、性能を落とさずサービスを維持できること。
- 一貫性:いつ、どこからアクセスしてもデータにずれがないこと。
以上です。