【システム設計シリーズ】拡張性の見直し

システムデザインシリーズの初志

システム設計入門書: 和文档GitHub - donnemartin/system-design-primer: 大規模システムの設計方法を学びます。システム設計面接の準備をします。Anki フラッシュカードが含まれています。

中国語版: https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md

本来の目的は主にシステム設計を学ぶことですが、中国語版は機械翻訳っぽいので、今でも手作業で簡単なメモを取り、わかりにくい部分はAIを活用して英語版と比較しながら学習しています。翻訳と知識の拡大。

システム設計とは何か

        システム設計とは、コンピュータ システムの構築および実装中に、コンピュータ ハードウェア、ソフトウェア、外部機器などのさまざまなコンポーネントを計画的かつ目標を絞って設計および編成することを指します。システム設計の目的は、ユーザーのニーズを満たす、高性能、信頼性が高く、使いやすく、安全でスケーラブルなコンピュータ システムを実現することです。システム設計は、ハードウェア設計とソフトウェア設計の 2 つの主要な側面に分けることができます。
ハードウェア設計は、中央処理装置 (CPU)、メモリ、入出力デバイス、ストレージ デバイスなどの主要コンポーネントの選択、編成、相互接続など、コンピュータ システムの物理的な実装に焦点を当てます。ハードウェア設計では、システムの拡張性とメンテナンスの容易さを確保しながら、パフォーマンス、信頼性、消費電力、コストなどの要素を考慮する必要があります。
        ソフトウェア設計は主に、オペレーティング システム、アプリケーション ソフトウェア、プログラミング言語、コンパイラなどのソフトウェア コンポーネントの設計と実装を含む、コンピュータ システムの論理実装に焦点を当てます。ソフトウェアの設計では、ソフトウェアの互換性と使いやすさを確保しながら、プログラムの読みやすさ、保守性、効率、セキュリティなどの要素を考慮する必要があります。
        つまり、システム設計は、ハードウェアからソフトウェアまで、ユーザーのニーズ、性能、信頼性、セキュリティ、使いやすさなどを十分に考慮し、効率性、信頼性、使いやすさを実現する多面的・多層的な総合プロジェクトです。 -use. 便利で安全なコンピュータ システム。

基礎知識の学習

まず、一般原則、その概要、使用方法、長所と短所について基本的に理解する必要があります。

スケーラビリティを確認するビデオ講義

(この動画はYouTube動画なので中国では視聴できない可能性があるのでテキストでまとめます) 

以下では、システム設計の基礎知識をセクションに分けて紹介します。写真はインターネットからのものです。侵害は削除されます~

ハーバード大学スケーラビリティ講義

 

垂直スケーリング

        垂直拡張または垂直拡張とも呼ばれる垂直スケーリングは、単一サーバーのリソースを増やすことによってシステムのパフォーマンスとスケーラビリティを向上させる拡張方法です。このアプローチは、CPU、メモリ、ストレージ容量の制限など、単一サーバー上のボトルネックを解決するためによく使用されます。

        垂直方向の拡張は、CPU コア数の増加、メモリ容量の増加、ストレージ デバイスのアップグレードなど、単一サーバーのハードウェア構成をアップグレードすることで実現できます。このアプローチにより、単一サーバーのパフォーマンスと容量が向上し、システムのスループットとスケーラビリティが向上します。

        垂直拡張の利点は、単一サーバーのパフォーマンスと容量を向上させることができるため、サーバーの数を減らし、コストを削減できることです。さらに、垂直スケーリングは単一サーバー上で行われるため、複雑なアーキテクチャの調整やアプリケーションの変更は必要ありません。

        ただし、垂直スケーリングにはいくつかの欠点もあります。たとえば、単一サーバーにリソースを追加するとコストが上昇する可能性があり、リソースを追加しすぎると無駄が生じる可能性があります。また、単一サーバーの性能限界に達すると、垂直方向の拡張ではシステムのパフォーマンスやスケーラビリティを向上させることができなくなる可能性があり、水平方向の拡張(水平スケーリング)など、他の拡張方法を検討する必要があります。 。

 

水平方向のスケーリング

        水平スケーラビリティとも呼ばれる水平スケーリングは、複数のサーバーを追加することによってシステムのパフォーマンスとスケーラビリティを向上させる拡張方法です。水平拡張では、複数のサーバーを論理的に 1 つのエンティティとして扱い、単純なクラスタリングまたは負荷分散戦略を通じて、論理エンティティ全体の実行速度とパフォーマンスを効果的に加速できます。垂直スケーリングとは異なり、水平スケーリングでは、リソースを 1 台のサーバーに追加するのではなく、複数のサーバーを追加することで負荷を分散します。

        水平スケーリングの利点は次のとおりです。

        システム パフォーマンスの向上: 複数のサーバーを追加することにより、水平拡張によりシステムのコンピューティング速度とパフォーマンスが効果的に向上し、システムのスループットと応答性が向上します。

        システムの可用性の向上: 水平拡張により、冗長性とサーバーのフェイルオーバーを通じてシステムの可用性が向上し、ハードウェア障害やネットワーク障害が発生した場合でもシステムが正常に動作できるようになります。

        柔軟性と拡張性: 水平拡張により、ビジネス ニーズや負荷状況に応じてサーバーを柔軟に追加または削減できるため、拡張と管理が容易になります。

        ただし、水平スケーリングにはいくつかの課題と制限もあります。

        システムの一貫性: 複数のサーバーが論理エンティティを構成するため、これらのサーバー間のデータの一貫性と同期を確保する必要があります。

        負荷分散: 水平方向の拡張では、各サーバーで負荷分散を確保し、一部のサーバーの過負荷や他のサーバーでのリソースの浪費を避けるために、負荷分散戦略を実装する必要があります。

        データのパーティショニングと分散トランザクション: 水平拡張シナリオでは、データの整合性と一貫性を確保するために、データのパーティショニングと分散トランザクションの問題を解決する必要があります。

        アプリケーションの最適化: 水平スケーリングにより、アプリケーションはマルチサーバー環境に適応するために分散設計と最適化が必要になる場合があります。

        つまり、水平拡張は複数のサーバーを追加することでシステムのパフォーマンスと拡張性を向上させる拡張方法であり、システムのパフォーマンス、可用性、柔軟性を向上させる必要があるシナリオに適しています。しかし同時に、克服する必要のある技術的な課題や制限もいくつかあります。

 

キャッシュ

        キャッシュはストレージ テクノロジであり、その主な目的はデータ アクセスの速度と効率を向上させることです。頻繁にアクセスされるデータをメモリやハードディスクなどの記憶媒体に一時的に保存することで、データのアクセス時間と帯域幅の消費を削減します。データを使用する必要がある場合、元のデータ ソースではなく最初にキャッシュからデータを読み取ることができるため、システムの応答速度とパフォーマンスが向上します。

        キャッシュには多くの種類があり、さまざまなアプリケーション シナリオとキャッシュ戦略に応じて次のカテゴリに分類できます。

        CPU キャッシュ: CPU 内にあるキャッシュで、プロセッサーがアクセスするデータと命令を保存し、高速化します。通常、一次キャッシュ (L1 キャッシュ) と二次キャッシュ (L2 キャッシュ) に分けられ、それらの役割は、プロセッサがデータにアクセスするときに高速応答のキャッシュ レベルを提供することです。

        メモリ キャッシュ: メモリ内にあるキャッシュ。通常、オペレーティング システム、アプリケーション、およびユーザー データを保存するために使用されます。メモリキャッシュによりハードディスクへのアクセス回数が軽減され、データの読み出し速度が向上します。

        ハード ドライブ キャッシュ: ハード ドライブ上にあるキャッシュ。ディスク キャッシュとも呼ばれます。主にディスクから読み取ったデータを保存し、ディスクデータへのアクセス速度を向上させるために使用されます。

        ネットワーク キャッシュ: 主にネットワーク分野で使用され、たとえば、CDN (コンテンツ配信ネットワーク) のノードは、ユーザーのアクセス速度を向上させるために人気のあるコンテンツをキャッシュします。

        データベース キャッシュ: クエリの効率を向上させるためにデータベースにホット データを保存するために使用されます。Hibernate や MyBatis などのデータベース アクセス フレームワークは、さまざまなレベルのキャッシュ戦略を提供します。

        フロントエンド キャッシュ: 主に Web フロントエンド分野で使用され、Web サイトの読み込み速度を向上させるために、ブラウザーまたはプロキシ サーバーを通じて一般的に使用されるリソース (CSS、JS、画像など) をキャッシュします。

        分散キャッシュ: キャッシュ サーバーなどの分散システムで使用されます。複数のノード上のキャッシュを統合キャッシュ層にマージして、データ アクセス速度とシステム パフォーマンスを向上させることができます。

        要約すると、キャッシュはデータ アクセス速度とシステム パフォーマンスを向上させる技術的手段であり、コンピューター、ネットワーク、データベース、分散システムなどの分野で広く使用されています。キャッシュを適切に構成して使用すると、システムの遅延が効果的に短縮され、ユーザー エクスペリエンスが向上します。

負荷分散

        負荷分散は、システムの信頼性、可用性、およびパフォーマンスを向上させるために、複数のサーバーまたはデバイス間で負荷を分散するために使用されるコンピュータ ネットワーク テクノロジです。負荷分散は、単一のサーバーまたはデバイスのパフォーマンスのボトルネックを効果的に解決し、システム全体の処理能力を向上させ、リソースの無駄を回避します。

        負荷分散の主な目的は、複数のサーバーまたはデバイス間で負荷を分散し、各サーバーまたはデバイスが最大負荷範囲内で動作できるようにすることです。負荷分散は、ネットワーク層、アプリケーション層、データベース層などのさまざまなレベルで適用できます。さまざまなアプリケーション シナリオに応じて、ロード バランシングでは、ポーリング、最小接続数、ソース IP ハッシュなどのさまざまなテクノロジと戦略を使用できます。

        負荷分散には次のような利点があります。

        システム パフォーマンスの向上: 負荷分散により複数のサーバーまたはデバイスに負荷を分散することで、システム全体の処理能力が向上し、システム パフォーマンスが向上します。

        システムの可用性の向上: サーバーまたはデバイスに障害が発生した場合、負荷分散によって自動的にそのサーバーまたはデバイスが負荷分散から削除され、他のサーバーまたはデバイスがサービスを提供し続けることができるため、システムの可用性が向上します。

        システムの拡張性の向上: サーバーまたはデバイスを追加することで、システムの負荷容量を拡張でき、システムの拡張性が向上します。

        負荷分散により、単一障害点を回避し、システムの安定性を向上させることができます。

        負荷分散を実装するにはさまざまな方法があり、一般的な負荷分散テクノロジーには次のものがあります。

        DNS ポーリング: DNS サーバーを構成すると、ドメイン名が複数のサーバーの IP アドレスに解決され、クライアントからの要求に応じて、DNS サーバーがポーリングして異なる IP アドレスを返します。

        リバース プロキシ ロード バランシング: Nginx や HAProxy などのリバース プロキシ サーバーは、ロード バランシングを実現し、クライアント要求をバックエンド サーバーに分散できます。

        ソフトウェア負荷分散: LVS (Linux Virtual Server) などのソフトウェア負荷分散ソリューションは、オペレーティング システム レベルで負荷分散を実現できます。

        ハードウェア負荷分散: F5 や Citrix NetScaler などのハードウェア負荷分散デバイスは、専用のハードウェアを通じて負荷分散を実現できます。

        クラウド サービス プロバイダーの負荷分散サービス: AWS ELB (Elastic Load Balancer)、Alibaba Cloud Load Balancing など。クラウド サービス プロバイダーが提供する負荷分散サービスは、ユーザーがクラウド環境で負荷分散を実現するのに役立ちます。

        つまり、負荷分散はシステムのパフォーマンス、可用性、拡張性を向上させるための重要なテクノロジーであり、コンピューター ネットワークの分野で広く使用されています。合理的な構成と負荷分散の使用により、システムのパフォーマンスが効果的に向上し、ユーザーはより良いサービス品質を享受できます。

データベースのレプリケーション

        データベース レプリケーションとは、異なるデータベース間でデータの一貫性と同期更新を実現するために、あるデータベースから別のデータベースにデータを同期するプロセスを指します。データベース レプリケーション テクノロジは、データ バックアップ、データ同期、読み取りと書き込みの分離など、多くのシナリオで非常に重要です。データベースのレプリケーションにより、異なる場所に分散されたデータが同時に自動的に更新され、データの整合性が確保されます。

        データベース レプリケーション プロセスには主に次の手順が含まれます。

        サブスクリプションの作成: ソース データベース内のデータ変更を監視するために、ソース データベースにサブスクリプションを作成します。ソース データベース内のデータが変更されると、サブスクリプションはこれらの変更に関する情報を受け取ります。

        データ変更のキャプチャ: サブスクリプションは、挿入、更新、削除操作など、ソース データベース内のデータ変更をキャプチャします。これらのデータ変更はサブスクリプションに記録され、ターゲット データベースとの同期を待機します。

        データの同期: キャプチャされたデータの変更をソース データベースからターゲット データベースに同期することにより、異なるデータベース間でデータを同期して更新できます。データ同期は、バッチ同期、リアルタイム同期など、さまざまな方法で実行できます。

        サブスクリプション管理: サブスクリプションは、トランザクション サブスクリプション、マージ サブスクリプションなど、多くの種類に分類できます。サブスクリプション管理は、さまざまなシナリオのニーズを満たすためにサブスクリプションを管理および構成するために使用されます。

        データベース レプリケーション テクノロジは、SQL Server、MySQL、Oracle などの異なるデータベース システム間で適用できます。さらに、MySQL のマスター/スレーブ レプリケーション、SQL Server の分散トランザクションなど、ユーザーがデータベース レプリケーション機能を実装するのに役立つオープン ソース データベース レプリケーション ソフトウェアが多数あります。

        つまり、データベース レプリケーションは、異なるデータベース間でのデータ更新の一貫性と同期を確保できる重要なデータ管理テクノロジです。データベース レプリケーション テクノロジを使用することで、企業はデータの可用性、セキュリティ、パフォーマンスを向上させ、ビジネス開発を強力にサポートできます。

データベースパーティション

        データベースのパーティショニングは、データベースの管理性、パフォーマンス、可用性を向上させるために、大規模なデータベースを複数の小さな独立した物理記憶領域に分割する物理データベース設計手法です。パーティショニング テクノロジは、多くのビッグ データおよびデータ ウェアハウスのシナリオで広く使用されています。

        データベースのパーティショニングの主な目的は、データの整合性と一貫性を維持しながら複数の物理ストレージ デバイスにデータを分散させ、それによってクエリの速度と応答時​​間を向上させることです。パーティショニングにより、単一のサーバーまたはデバイスのパフォーマンスのボトルネックが効果的に解決され、システム全体の処理能力が向上し、リソースの無駄が回避されます。

        一般的なデータベースのパーティション分割方法には次のものがあります。

        パーティショニング: テーブルを複数の物理ストレージ スペースに論理的に分割することで、データをクエリするときに毎回テーブル全体をスキャンする必要がなくなります。パーティション テーブルは、複数の関連する基になるテーブルによって実装され、ハンドル オブジェクトによっても実装されます。

        テーブル分割: 特定のルールに従って、大きなテーブルを複数の小さなテーブルに分解します。これらの小さなテーブルは、同じディスク上または異なるマシン上に分散できます。アプリケーションは、データの読み取りおよび書き込みを行うときに、事前定義されたルールに従って対応するサブテーブル名を取得し、対応するサブテーブルを操作します。

        データベースのパーティショニングには次のような利点があります。

        クエリのパフォーマンスの向上: データを複数の物理ストレージ デバイスに分散させることで、クエリの速度と応答時​​間を大幅に向上させることができます。

        システムのスケーラビリティの向上: 物理ストレージ デバイスを追加することでデータベースのストレージ容量を拡張できるため、システムのスケーラビリティが向上します。

        負荷分散: 複数の物理デバイスにデータを分散させることで、負荷分散を実現し、システム全体のパフォーマンスと可用性を向上させることができます。

        管理が簡単: パーティショニング テクノロジを使用すると、大規模なデータベースを複数の小さな独立した物理ストレージ スペースに分割できるため、データベースの管理性が向上します。

        データベースのパーティショニングはすべてのシナリオに適しているわけではないことに注意してください。実際のアプリケーションでは、特定のビジネス要件とデータ特性に基づいてパーティショニング テクノロジを使用するかどうかを決定する必要があります。さらに、パーティショニング テクノロジには、パーティション間のデータ移行や同期など、特別な注意が必要な制限もあります。

おすすめ

転載: blog.csdn.net/u013379032/article/details/132677943