SA.04.3 性能の拡張 (重要度: 4)
リードアクセスの外部化
CDN
CDN(Content Delivery Network)は、ウェブサイトやアプリケーションのコンテンツの配信を高速化し、パフォーマンスを向上させるための分散型のネットワークです。
CDNは、世界中に配置されたサーバーのネットワークを使用して、コンテンツをユーザーに提供します。一般的なウェブサイトでは、コンテンツ(画像、動画、HTML、CSS、JavaScriptなど)は、通常、単一のサーバーから提供されます。しかし、ユーザーが物理的に遠くに位置している場合や、トラフィックが混雑している場合、コンテンツのダウンロードや表示に時間がかかることがあります。
これに対して、CDNは、世界中に配置された複数のサーバーでコンテンツをキャッシュ(一時保存)し、ユーザーに近い場所からコンテンツを提供することで、レスポンス時間を最小化します。つまり、ユーザーは最も近いサーバーからコンテンツを取得し、高速かつ効率的にウェブページを表示できるようになります。
また、CDNはトラフィックの分散も行います。例えば、特定の地域で大きなアクセスがある場合、CDNはその地域に特化したサーバーを使用することで、トラフィックの集中を緩和します。これにより、ウェブサイトの負荷を分散し、スケーラビリティを向上させることができます。
CDNの利点は、高速なコンテンツ配信だけでなく、セキュリティの強化や可用性の向上にもあります。CDNは、一部の攻撃や負荷に対して保護機能を提供し、サービスの停止やコンテンツの不足を防ぐ役割も果たします。
総じて言えるのは、CDNはインターネット上のコンテンツ配信の最適化を目指したネットワークであり、多くのウェブサイトやアプリケーションで利用されている重要な技術です。
キャッシュ, インメモリデータベース
キャッシュは、頻繁にアクセスされるデータを一時的に保存するための仕組みです。データベースやウェブサイトのレスポンス時間を短縮し、パフォーマンスを向上させるために使用されます。
キャッシュを効果的に利用するために、インメモリデータベースと呼ばれる特殊なデータベースが存在します。このようなデータベースは、データをメインメモリに保存するため、高速な読み書きアクセスが可能です。一方で、永続的なデータストレージは提供されないため、データが失われる可能性があります。
代表的なインメモリデータベースの1つはRedisです。Redisは、メモリ中にキーバリューストアを提供し、リレーショナルデータベースと比較して高速なデータの読み書きが可能です。Redisは、データのキャッシュ、セッション管理、ランキング、リアルタイムデータの処理など、さまざまな用途で使用されます。
また、Memcachedも一般的なキャッシングシステムであり、クライアントサーバーモデルをベースにしています。Memcachedは、分散メモリオブジェクトキャッシュシステムとして機能し、リクエストに応じてデータを集中管理するため、ウェブアプリケーションのパフォーマンスを向上させる役割を果たします。
これらのキャッシュ技術を利用することで、ウェブサイトやアプリケーションのパフォーマンスを向上させることができます。キャッシュは頻繁にアクセスされるデータを素早く提供するため、レスポンス時間を短縮し、ユーザーエクスペリエンスの向上につながります。また、サーバーの負荷を軽減し、スケーラビリティを向上させる効果もあります。
ステートレスな設計を導入しアプリケーションサーバーを分散する
ステートレスな設計とは、アプリケーションサーバーが各リクエストを独立して処理し、リクエスト間での状態を保持しないようにする設計のことを指します。つまり、各リクエストはサーバーに対して必要な情報を含めて送信し、サーバーはそれに基づいてレスポンスを生成します。
ステートフルな設計とは、アプリケーションがクライアントの状態を保持する設計です。つまり、アプリケーションサーバーが各リクエストの間でクライアントの状態を把握し、記憶しておくことができます。このような設計では、セッションストレージなどの仕組みを使って、クライアントの状態を格納し、後続のリクエストで利用することができます。例えば、ユーザーのログイン情報やショッピングカートの内容などがセッションストレージに格納され、異なるページや画面間で共有されます。
一方、ステートレスな設計では、アプリケーションサーバーが各リクエストを独立して処理し、クライアントの状態を保持しません。各リクエストは必要な情報を含めて自己完結型になります。クライアント側で必要な情報を保持し、リクエスト送信時に必要な情報を含めて送信します。この設計では、特定のリクエスト間での状態共有は行われません。
データの外部化
ステートレスな設計では、クライアントが必要なデータをすべてリクエストに含めるため、データの外部化ができます。クライアントは各リクエストで必要な情報を提供するので、その情報を使ってサーバー側でデータの取得や処理を行うことができます。この方法により、サーバー側ではデータの保持や管理が必要なくなり、システムの拡張性や信頼性が向上するという利点があります。ただし、大量のデータを含む場合やセキュリティ上の問題がある場合には、適切な対策を講じる必要があります。
セッション情報の外部化
ステートレスな設計では、サーバー側はクライアントの状態を保持しないため、セッション情報を記憶するためのメカニズムがありません。
ログの外部化
ステートレスな設計では、クライアントの状態をサーバー側で保持する必要はないため、ログの情報を外部のログサービスやデータベースなどに記録することができます。
ログの外部化にはいくつかのメリットがあります。例えば、ログを外部のシステムで集中管理することで、サーバーアプリケーションのパフォーマンスが低下するリスクを減らすことができます。また、ログデータの分析や監視、セキュリティの向上にも役立ちます。
スケールアウト構成の設計
ロードバランサやメッセージングキューを使用したスケールアウト構成は、システムの性能と可用性を向上させるために使用されます。以下にそれぞれの概要を説明します。
ロードバランサ: ロードバランサは、アクセス要求を受け取り、それをバックエンドサーバーに均等に分散させる役割を担います。これにより、アプリケーションやサービスへのトラフィックが均等に分散され、各サーバーへの負荷が均等になります。また、ロードバランサは障害時のフェールオーバーも処理でき、サービスの可用性を向上させることができます。
メッセージングキュー: メッセージングキューは、アプリケーションやサービス間で非同期なメッセージの送受信を行うための仕組みです。アプリケーションはメッセージをキューに送信し、他のアプリケーションが必要に応じてメッセージを処理します。メッセージングキューは負荷分散や非同期処理を実現し、システムのスケーラビリティや可用性を向上させることができます。また、メッセージングキュー内でメッセージの順序を確保することも可能です。
これらの機能を組み合わせることで、システムの負荷が増加した場合でも、ロードバランサがトラフィックを分散し、メッセージングキューが非同期処理を行うことで処理能力を向上させることができます。迅速なスケールアウトが可能であり、システムの拡張性と柔軟性を高めることができます。さらに、障害時にはロードバランサとメッセージングキューが冗長化されたサーバーに負荷を分散し、サービスの可用性を確保することもできます。
データベースを複数ノードに分散
垂直シャーディング
垂直シャーディングは、データベース内のテーブルを異なるデータベースやサーバーに分割する手法です。各テーブルが特定の関連データや処理に特化しているため、データベースやサーバーの負荷を分散し、パフォーマンスとスケーラビリティを向上させることができます。垂直シャーディングの利点は、データの冗長性を減少させ、特定の処理に最適化することができることです。
注:テーブルの列を分割して別々のテーブルにする(水平シャーディングの列版)は厳密にはVertical Partitioningと呼ばれ、ここでは区別されています。
参考:https://shardingsphere.apache.org/document/5.1.0/en/features/sharding/#vertical-sharding
水平シャーディング
水平シャーディングは、データベース内のデータを複数のデータベースやサーバー間でレコード単位で分割する手法です。各データベースやサーバーが同様のスキーマを持ち、データの分散された部分を同一の処理やクエリで操作します。水平シャーディングは、データベースやサーバーへの負荷分散を実現し、スケーラビリティを向上させることができます。
リードレプリカの導入
リードレプリカは、データベースの冗長性とスケーラビリティを向上させるために使用される一般的な手法です。リードレプリカはマスターデータベースのデータを非同期でコピーし、リードクエリ(読み取り操作)を処理するために使用されます。
リードレプリカは、応答時間の短縮や読み取り負荷の分散など、いくつかの利点があります。例えば、アプリケーションの読み取りクエリがリードレプリカにルーティングされることにより、マスターデータベースへの負荷が軽減され、パフォーマンスが向上します。さらに、リードレプリカの導入により、読み取りトラフィックの負荷が均等に分散されるため、システム全体のスケーラビリティが向上します。
リードレプリカの設定には、データ同期の方式とレプリケーションのトポロジーの設計が含まれます。データ同期の方式には、ステートメントベースのレプリケーション(SBR)やロウベースのレプリケーション(LBR)などがあります。レプリケーションのトポロジーには、マスタースレーブ、マルチマスター、マスターマスターなどの構成があります。
ただし、リードレプリカは非同期であるため、マスターデータベースの変更がリードレプリカに完全に反映されるまでに少しの遅延が生じることに注意する必要があります。したがって、アプリケーションでリアルタイムのデータが必要な場合や、データの整合性が重要な場合には、リードレプリカを使用する前に用途と要件を検討する必要があります。
分散処理中のロックに関するボトルネック
共有資源の制限
分散環境での共有資源を制限するためのいくつかの手法があります。以下にいくつかの例を挙げます。
- マルチバージョンコントロール(Multi-Version Concurrency Control, MVCC): MVCCは、データベースシステムなどの分散システムで使用される一貫性制御手法です。MVCCでは、各トランザクションに個別のバージョンを割り当て、競合を回避します。これにより、複数のトランザクションが同時に読み取り/更新を行うことができます。
- 分散トランザクション: 分散トランザクションは、異なるノード間にまたがる一連の処理を一つのまとまりとして扱うための手法です。分散トランザクションでは、全てのノードにおける処理の整合性を確保するために、2フェーズ・コミット(Two-Phase Commit, 2PC)などのプロトコルが使用されます。
- レプリケーション: レプリケーションは、共有資源やデータベースなどを複数のノードにコピーする手法です。複数のノードにコピーすることで、各ノードが独立して資源にアクセスできます。しかし、レプリケーションによって生じる一貫性の問題に注意が必要です。
これらの手法は、分散環境での共有資源の制限や競合の問題を解決するために使用されます。ただし、適切な手法を選択し、適切に実装するためには、分散環境のニーズや制約を考慮する必要があります。
ロックの分散や期間短縮
1. 分散ロック(Distributed Locking): 分散環境では、複数のノードにまたがる操作が行われるため、複数のロックを利用して競合を管理する必要があります。分散ロックは、複数のノードで一貫したロックメカニズムを実現するための手法です。分散ロックを使用すると、ネットワーク遅延や通信オーバーヘッドを低減し、ロックの期間を短縮することができます。
2. オプティミスティックロック(Optimistic Locking): オプティミスティックロックは、他のトランザクションとの競合を検出するためにバージョン情報を使用する手法です。トランザクションがデータを変更する前に、データが他のトランザクションによって変更されていないかを確認します。競合が検出された場合、トランザクションはロールバックされ、再度処理を試行します。オプティミスティックロックを使用すると、特定のロックを取得するための待ち時間を削減することができます。
3. パフォーマンスチューニング: ロックの期間を短縮するためには、システムのパフォーマンスを最適化することも重要です。データベースやアプリケーションの設計やクエリの最適化、キャッシングの導入など、パフォーマンスチューニングを行うことで、ロックの期間を短縮することができます。
これらの手法を使用して、ロックの期間を短縮し、分散環境での競合を最小限に抑えることができます。