1. 概要 この記事では、Taobao を例に、同時ユーザー数 100 人から 1,000 万人までのサーバー側アーキテクチャの進化を紹介します。また、各進化段階で遭遇する関連テクノロジもリストし、アーキテクチャの進化を誰もが総合的に理解できるようにします。最後に、この記事ではアーキテクチャ設計のいくつかの原則をまとめます。 2. 基本概念アーキテクチャを紹介する前に、読者がアーキテクチャ設計の概念を理解できないことを避けるために、いくつかの基本的な概念を次に紹介します。
3. アーキテクチャの進化3.1 単一マシンアーキテクチャ 淘宝網を例に挙げてみましょう。ウェブサイトの初期段階では、アプリケーションとユーザーの数が少ないため、Tomcat とデータベースを同じサーバーに展開できます。ブラウザが www.taobao.com へのリクエストを開始すると、まずドメイン名が DNS サーバー (ドメイン ネーム システム) を通じて実際の IP アドレス 10.102.4.1 に変換され、ブラウザはその IP に対応する Tomcat にアクセスします。
3.2 最初の進化: Tomcatとデータベースは別々に展開される Tomcat とデータベースはそれぞれサーバー リソースを排他的に占有するため、それぞれのパフォーマンスが大幅に向上します。
3.3 第2の進化: ローカルキャッシュと分散キャッシュの導入 Tomcat と同じサーバーまたは同じ JVM にローカル キャッシュを追加し、外部に分散キャッシュを追加して、人気商品の情報や人気商品の HTML ページなどをキャッシュします。キャッシュにより、ほとんどのリクエストはデータベースの読み取りと書き込みの前に傍受できるため、データベースの負荷が大幅に軽減されます。関連するテクノロジには、memcached をローカル キャッシュとして使用すること、Redis を分散キャッシュとして使用すること、さらにキャッシュの一貫性、キャッシュの侵入/破壊、キャッシュのなだれ、ホット データの集中障害などの問題が含まれます。
3.4 第3の進化: 負荷分散を実現するためのリバースプロキシの導入 Tomcat を複数のサーバーに展開し、リバース プロキシ ソフトウェア (Nginx) を使用して各 Tomcat にリクエストを均等に分散します。ここでは、Tomcat が最大 100 件の同時リクエストをサポートし、Nginx が最大 50,000 件の同時リクエストをサポートしていると想定します。理論上、Nginx がリクエストを 500 台の Tomcat に分散すると、50,000 件の同時リクエストを処理できます。関連するテクノロジには、Nginx と HAProxy が含まれます。これらはどちらも、ネットワークの第 7 層で動作するリバース プロキシ ソフトウェアであり、主に http プロトコルをサポートし、セッション共有やファイルのアップロードとダウンロードの問題にも関係します。
3.5 第4の進化: データベースの読み書き分離 データベースは読み取りデータベースと書き込みデータベースに分かれています。読み取りデータベースは複数存在する場合があります。書き込みデータベース内のデータは、同期メカニズムを通じて読み取りデータベースに同期されます。最新の書き込まれたデータを照会する必要があるシナリオでは、追加のコピーをキャッシュに書き込むことができ、最新のデータはキャッシュを通じて取得できます。関連するテクノロジには、データベースの個別の読み取りと書き込み、およびサブライブラリとテーブルの分割を整理するために使用できるデータベース ミドルウェアである Mycat が含まれます。クライアントはこれを使用して基盤となるデータベースにアクセスしますが、データの同期とデータの一貫性の問題も発生します。
3.6 第5の進化: 業務別のデータベース分割 異なる企業のデータを異なるデータベースに保存すると、企業間のリソースの競争を軽減できます。トラフィック量の多い企業の場合は、サポートのためにさらに多くのサーバーを導入できます。これにより、クロスビジネステーブルで直接関連分析を実行することも不可能になり、他のソリューションが必要になります。しかし、これはこの記事の焦点ではありません。興味のある人は自分で解決策を探すことができます。
3.7 第 6 の進化: 大きなテーブルを小さなテーブルに分割する たとえば、コメント データの場合は、製品 ID に従ってハッシュし、対応するテーブルにルーティングして保存できます。支払い記録の場合、時間ごとにテーブルを作成し、各時間ごとのテーブルをさらに小さなテーブルに分割し、ユーザー ID またはレコード番号を使用してデータをルーティングできます。リアルタイムで操作されるテーブル内のデータ量が十分に小さく、リクエストが複数のサーバー上の小さなテーブルに十分に均等に分散される限り、データベースは水平拡張によってパフォーマンスを向上させることができます。前述の Mycat は、大きなテーブルを小さなテーブルに分割する場合のアクセス制御もサポートしています。 このアプローチにより、データベースの運用と保守の難易度が大幅に高まり、DBA に高い要求が課せられます。データベースがこの構造に設計されている場合、分散データベースと呼ぶことができますが、これは全体として論理的なデータベースにすぎません。データベース内のさまざまなコンポーネントは、さまざまなコンポーネントによって個別に実装されます。たとえば、サブライブラリとサブテーブルの管理、およびリクエストの分散は Mycat によって実装され、SQL 解析はスタンドアロン データベースによって実装されます。読み取りと書き込みの分離はゲートウェイとメッセージ キューによって実装され、クエリ結果の集約はデータベース インターフェイス層などによって実装される場合があります。このアーキテクチャは、実際には MPP (大規模並列処理) アーキテクチャの実装の一種です。 現在、オープンソースと商用の両方で多くの MPP データベースが存在します。より人気のあるオープンソースのものには、Greenplum、TiDB、Postgresql XC、HAWQ などがあります。商用のものには、南京大学総合研究所の GBase、Ruifan Technology の Snowball DB、Huawei の Libra などがあります。異なる MPP データベースには異なる重点があります。たとえば、TiDB は分散 OLTP シナリオに重点を置いており、Greenplum は分散 OLAP シナリオに重点を置いています。これらの MPP データベースは基本的に、Postgresql、Oracle、MySQL と同様の SQL 標準サポート機能を提供します。クエリを分散実行プランに解析し、各マシンに配布して並列実行することができます。最後に、データベース自体がデータを要約して返します。また、権限管理、サブライブラリとテーブルのシャーディング、トランザクション、データのコピーなどの機能も提供しており、そのほとんどは 100 ノードを超えるクラスターをサポートできるため、データベースの運用と保守のコストを大幅に削減し、データベースを水平に拡張できます。
3.8 第7の進化: LVSまたはF5を使用して複数のNginxサーバーの負荷を分散する ボトルネックとなっているのはNginxなので、2層のNginxを介して複数のNginxの負荷分散を実現することは不可能です。図の LVS と F5 は、ネットワークの第 4 層で動作する負荷分散ソリューションです。 LVS は、オペレーティング システムのカーネル状態で実行され、TCP 要求または上位レベルのネットワーク プロトコルを転送できるソフトウェアです。したがって、Nginx よりも多くのプロトコルをサポートし、パフォーマンスがはるかに高くなります。単一マシンの LVS は数十万の同時リクエスト転送をサポートできると考えられます。 F5 は、LVS と同様の機能を備え、LVS よりも高いパフォーマンスを備えた負荷分散ハードウェアですが、高価です。 LVS はスタンドアロン ソフトウェアであるため、LVS が配置されているサーバーがダウンすると、バックエンド システム全体にアクセスできなくなるため、バックアップ ノードが必要になります。 keepalived ソフトウェアを使用して仮想 IP をシミュレートし、その仮想 IP を複数の LVS サーバーにバインドすることができます。ブラウザが仮想 IP にアクセスすると、ルータによって実際の LVS サーバーにリダイレクトされます。メインの LVS サーバーがダウンすると、keepalived ソフトウェアはルーターのルーティング テーブルを自動的に更新し、仮想 IP を別の通常の LVS サーバーにリダイレクトして、LVS サーバーの高可用性を実現します。 ここで注意すべき点は、上図の Nginx 層から Tomcat 層への描画は、すべての Nginx がすべての Tomcat にリクエストを転送することを意味するわけではないということです。実際の使用では、いくつかの Tomcat に複数の Nginx が接続される場合があります。これらの Nginx は keepalived を通じて高可用性を実現し、他の Nginx は他の Tomcat に接続します。この方法では、アクセス可能な Tomcat の数を 2 倍に増やすことができます。
3.9 第8の進化: DNSポーリングによるコンピュータルームの負荷分散 DNS サーバーでは、1 つのドメイン名を複数の IP アドレスに対応するように構成でき、各 IP アドレスは異なるコンピューター ルームの仮想 IP に対応します。ユーザーが www.taobao.com にアクセスすると、DNS サーバーはポーリング戦略またはその他の戦略を使用して、ユーザーがアクセスする IP を選択します。この方法により、コンピュータ室内の負荷分散を実現できます。この時点で、システムはコンピュータ ルーム レベルで水平拡張を実現できます。数千万から数億の同時実行はコンピュータ室を追加することで解決でき、システム入口でのリクエストの同時実行は問題になりません。
3.10 第9の進化: NoSQLデータベースや検索エンジンなどの技術の導入 データベース内のデータが一定の規模に達すると、データベースは複雑なクエリには適さなくなり、通常のクエリのニーズしか満たせなくなります。統計レポートのシナリオでは、データ量が多いと結果を生成できない可能性があり、複雑なクエリを実行すると他のクエリの速度が低下します。全文検索や可変データ構造などのシナリオでは、データベースは本質的に適していません。したがって、特定のシナリオに適切なソリューションを導入する必要があります。たとえば、大規模なファイルストレージの場合は、分散ファイルシステム HDFS によって解決できます。キーバリュー型データの場合は、HBase や Redis などのソリューションで解決できます。全文検索のシナリオでは、ElasticSearch などの検索エンジンによって解決できます。多次元分析シナリオの場合、Kylin や Druid などのソリューションで解決できます。 もちろん、コンポーネントを増やすとシステムの複雑さも増します。異なるコンポーネントによって保存されたデータを同期する必要があり、一貫性の問題を考慮する必要があり、これらのコンポーネントを管理するには、より多くの操作および保守方法が必要です。
3.11 第10の進化: 大きなアプリケーションを小さなアプリケーションに分割する アプリケーション コードをビジネス セグメントごとに分割して、個々のアプリケーションの責任を明確にし、アプリケーション間で独立したアップグレードと反復処理を可能にします。現時点では、アプリケーション間で共通の構成がいくつか関係している可能性がありますが、これは分散構成センター Zookeeper を通じて解決できます。
3.12 第11の進化: 再利用可能な機能をマイクロサービスに抽出する 例えば、ユーザー管理、注文、支払い、認証などの機能が複数のアプリケーションに存在する場合、これらの機能のコードを個別に抽出して、管理用の別のサービスを形成できます。このようなサービスは、いわゆるマイクロサービスです。アプリケーションとサービスは、HTTP、TCP、RPC リクエストなどのさまざまな方法を通じてパブリック サービスにアクセスします。それぞれのサービスは個別のチームによって管理できます。さらに、Dubbo や SpringCloud などのフレームワークを通じて、サービス ガバナンス、電流制限、回路遮断、ダウングレードなどの機能を実装し、サービスの安定性と可用性を向上させることができます。
3.13 第12の進化: サービスインターフェースのアクセスの違いを保護するエンタープライズサービスバス (ESB) の導入 アクセス プロトコルの変換は ESB を通じて一律に実行され、アプリケーションは ESB を通じて一律にバックエンド サービスにアクセスし、サービスは ESB を通じて相互に呼び出すため、システムの結合度が低下します。単一のアプリケーションを複数のアプリケーションに分割し、パブリック サービスを個別に抽出して管理し、エンタープライズ メッセージ バスを使用してサービス間の結合の問題を緩和するこのようなアーキテクチャは、いわゆる SOA (サービス指向) アーキテクチャです。このアーキテクチャは、表現が非常に似ているため、マイクロサービス アーキテクチャと混同されやすいです。私の考えでは、マイクロサービス アーキテクチャは、システムからパブリック サービスを抽出して個別に管理するというアイデアを指し、SOA アーキテクチャは、サービスを分割してサービス インターフェイス アクセスを統一するというアーキテクチャのアイデアを指します。 SOA アーキテクチャにはマイクロサービスという考え方が含まれています。
3.14 第13の進化: 運用環境の分離と動的サービス管理を実装するためのコンテナ化技術の導入 現在、最も人気のあるコンテナ化技術はDockerであり、最も人気のあるコンテナ管理サービスはKubernetes(K8S)です。アプリケーション/サービスは Docker イメージとしてパッケージ化でき、そのイメージは K8S を通じて動的に配布およびデプロイできます。 Docker イメージは、アプリケーション/サービスを実行できる最小限のオペレーティング システムとして理解できます。アプリケーション/サービスの実行コードが含まれており、実行環境は実際のニーズに応じて設定されます。 「オペレーティング システム」全体をイメージにパッケージ化した後、関連するサービスを展開する必要があるマシンに配布できます。 Docker イメージを起動するだけで直接サービスを開始できるため、サービスの導入や運用・保守が簡単になります。 大規模なプロモーションの前に、既存のマシン クラスター上のサーバーを分割して Docker イメージを起動し、サービスのパフォーマンスを向上させることができます。大規模なプロモーションの後、マシン上の他のサービスに影響を与えずにイメージをシャットダウンできます (セクション 3.14 より前は、新しく追加されたマシンで実行されているサービスは、サービスに適応するためにシステム構成を変更する必要があり、その結果、マシン上の他のサービスに必要な動作環境が破壊されます)。
3.15 第14の進化: ホストシステムとしてのクラウドプラットフォーム このシステムはパブリック クラウド上に展開でき、パブリック クラウドの膨大なマシン リソースを活用して、動的なハードウェア リソースの問題を解決できます。プロモーション期間中は、クラウドプラットフォームに一時的にさらに多くのリソースを申請することができ、DockerとK8Sを組み合わせることで迅速にサービスを展開することができます。プロモーション終了後はリソースを解放できるため、真のオンデマンド支払いが可能になり、リソースの利用率が大幅に向上し、運用および保守コストが削減されます。 いわゆるクラウド プラットフォームは、統合リソース管理を通じて膨大なマシン リソースをリソース エンティティに抽象化し、その上でハードウェア リソース (CPU、メモリ、ネットワークなど) をオンデマンドで動的に適用し、汎用的なオペレーティング システムを提供します。ユーザーが使用できる共通の技術コンポーネント(Hadoop テクノロジー スタック、MPP データベースなど)が提供され、既製のアプリケーションも提供されます。ユーザーは、自分のニーズを満たすためにアプリケーション内でどのようなテクノロジが使用されているか(オーディオおよびビデオのトランスコーディング サービス、電子メール サービス、個人のブログなど)を気にする必要がありません。クラウド プラットフォームには次の概念が関係しています。
4. アーキテクチャ設計の概要
|
<<: 全国の人々がオンラインで授業を受けたり仕事をしたりしていますが、Alibaba Cloud はトラフィックのピークにも耐えています。
>>: 2020年、クラウドコンピューティング業界では新たな提携と新たなセキュリティ問題が出現するだろう
セキュリティ上の理由から、銀行機関は従来、業務を運営するために自社のデータセンターに IT 機器を導...
このテーマについて書こうと思ったのは少し偶然でした。先週末、エコノミスト誌の記事を閲覧中に業界関連の...
inxyは、今から1月9日まで、クリスマスと元旦のスーパーセールを開始しました。(1) 6つの主要C...
数日前、私は「架橋の詳しい説明:架橋とは何か」と「架橋の詳しい説明:架橋の機能」を書きましたが、反応...
検索エンジンがユーザーエクスペリエンスにますます注意を払う傾向にありますが、これはリンクやオリジナル...
Query Foundry は Fraphost を買収したことを発表しました。Fraphost ユ...
多くのウェブサイト所有者がウェブサイトをオンラインにした後、最も望んでいることの 1 つは、ウェブサ...
2006 年に設立されたロシアのホスティング会社 justhost は、一定の評判を誇っています。J...
ウェブサイトのコラムや記事のランキングをすぐに向上させたい場合、ウェブサイトの内部リンク構造を合理的...
ウェブサイトの直帰率に関係する要因は何でしょうか? 現在、多くのウェブマスターは統計ツールのデータに...
一見すると、Hupu の物語は、垂直型 Web サイトの分野における新たな反撃のように思えます。アテ...
クラウド ネイティブへの道を歩み始めたい場合、Kubernetes を習得することは間違いなく不可欠...
quickclickhosting は 2011 年に英国ロンドンで設立され、企業として運営されてい...
多くのウェブサイトには一定の PR 値があります。実際、PR 値は Google がウェブサイトの品...
みなさんこんにちは。今日もここでお会いできて嬉しいです。最近は体重の回復に忙しくて、とても疲れていま...