インターネット企業における分散システムの適用は非常に一般的になり、オープンソース ソフトウェアが次々と登場しています。 Hadoop エコシステム、HDFS から HBase、MapReduce から Spark、Storm から Spark Streaming、Heron、Flink など、オープンソースの海で迷子にならないようにするにはどうすればよいでしょうか?この記事では、基本的な概念とアーキテクチャから分散システムを学ぶ方法を、私自身の学習と仕事の経験と組み合わせて説明します。分散システムの理論体系は非常に大きく、知識も広範囲にわたるため、著者の能力には限界があります。何か不足な点がありましたら、お気軽に話し合い、意見を交換してください。 一般的な分散システムは、HDFS や HBase などのデータ ストレージ システムに分けられます。 Storm、Spark、Flink などのデータ処理およびコンピューティング システム。 Elastic Search や Druid など、データ ストレージに基づく複雑なデータ検索およびクエリ機能を提供する、データ ストレージと分析のハイブリッド システム。ストレージ システムとコンピューティング システムについては、個別に分析することもできます。そのため、この記事では、データ ストレージとコンピューティングの 2 つのシステムについて説明します。 この記事の全体的な構成は次のとおりです。パート I、分散システムの基本概念。パート II とパート III では、それぞれデータ ストレージ システムとデータ コンピューティング システムについて詳しく説明します。最後の部分は要約です。 コンセプト 分散システム:誰もが分散システムについて話していますが、分散システムとは何でしょうか?基本的な概念は、コンポーネントがネットワーク コンピューター全体に分散され、コンポーネントはメッセージの受け渡しを通じてのみ通信し、アクションを調整するというものです。 分散システムとは、ネットワーク化されたコンピュータに配置されたコンポーネントが、メッセージを渡すことによってのみ通信し、動作を調整するシステムです。 (分散システムの概念と設計からの抜粋)
CAP 理論では、3 つの文字がシステムの 3 つの矛盾する特性を表します。
CAP 理論によれば、CAP プロパティを完全に備えた分散プロトコルを設計することは不可能です。 上記の CAP の概念から、テクノロジを選択する際には、ニーズに基づいて、AP の高可用性 (不整合なデータ戻りを許容) を備えたシステムが必要か、CP の強力な一貫性を備えたシステムが必要かを決定するか、システムによって提供されるパラメータに基づいて 2 つを比較検討する必要があるという結論を導き出すことができます。 (読者の中には、なぜ P が必要なのかと疑問に思う人もいるかもしれません。分散システムであるため、ネットワーク分断異常が発生した場合でも、正常にサービスを提供する必要があります。) データストレージシステム データ量が多すぎて単一のマシンで処理できる限界を超える場合は、分散データ ストレージ システムが必要になります。オープンソース システムを選択する場合でも、独自に設計する場合でも、最初に考慮すべきことはデータをどのように配布するかです。 データ配信方法 ハッシュ方式:ハッシュ方式は、データを配布する最も一般的な方法です。大きなハッシュ テーブルを想像してみてください。各バケットがストレージ サーバーに対応し、各データは何らかの方法でハッシュ値を計算して対応するバケットに割り当てられます。 int serverId = data.hashcode % serverTotalNum 上記は単なる簡単な計算式の例です。このようにして、データをさまざまなサーバーに分散することができます。
データ範囲の分布:データの特定の特性値を、値の範囲に応じて異なる間隔に分割します。たとえば、時間または間隔によって、異なる時間範囲を異なるサーバーに割り当てることができます。
データ量の配分:データ量の配分に関しては、簡単な例を考えてみましょう。ログ ファイルを使用してシステム操作のログ情報を記録する場合、ログ ファイルが一定のサイズに達すると、新しいファイルが生成され、後続のログ情報の記録が開始されます。この保存方法は、データの特性タイプとは関係ありません。これは、大きなファイルを固定サイズの複数のブロックに分割することを意味します。
一貫性のあるハッシュ:前述のように、ノードを追加または削除すると、すべてのノードがデータ移行に参加し、クラスター全体が影響を受けます。そうすると、一貫性のあるハッシュによってこの問題をうまく解決できます。コンシステント・ハッシュのデータ分散方法はハッシュとほぼ同じです。唯一の違いは、コンシステントハッシュの値の範囲がリングであることです。
データ分散の問題について議論した後、次のステップは、特定のノード サービスに到達できない場合でもシステムが正常に動作し続けるという問題 (分散システム CAP におけるネットワーク パーティション異常問題) をどのように解決するかを考えることです。この問題の解決策は非常に簡単で、複数のコピーによってデータのストレージを増やし、それらを異なるノードに分散することです。ノードがハングアップすると、他のデータ コピーから読み取ることができます。 複数のレプリカを導入すると、一連の疑問が生じます。複数のレプリカのうち、どのレプリカのデータが読み取り時の基準として使用されるのでしょうか?アップデートが成功したとみなされるのは何ですか?すべてのレプリカが正常に更新された場合にのみ更新が成功したと見なされますか、それとも一部のレプリカが正常に更新された場合にのみ更新が成功したと見なされますか?これらの疑問は、実際には CAP 理論における可用性と一貫性の問題です。プライマリ-セカンダリ コピー制御モデルは、この種の問題を解決する効果的な方法です。 一次二次制御モデル プライマリ/セカンダリ モデルは、一般的なレプリカ更新および読み取りモデルです。このモデルは比較的単純です。レプリカ関連の制御はすべて中央ノードによって制御され、同時データ変更もプライマリノードによって制御されます。この方法では、問題を単一マシンの問題に簡略化することができ、システムの複雑さが大幅に簡素化されます。 注: 一般的に使用されるレプリカ更新読み取りアーキテクチャには、プライマリ/セカンダリと分散型の 2 つがあります。プライマリ-セカンダリ構造の方が一般的ですが、分散型構造では、paxos、raft、vector time などのプロトコルがよく使用されます。私の能力が限られているため、ここでは説明しません。興味があれば自分で勉強してみて下さい。ぜひ追加してください。 次のマスター スレーブ コピー操作が関係します。 レプリカの更新 レプリカ更新の基本的なプロセス: データ更新操作はプライマリ ノードに送信され、プライマリ ノードはデータ更新操作を他のセカンダリ レプリカに同期し、他のレプリカの同期結果に基づいてクライアントに応答を返します。さまざまなデータストレージ分散システムのレプリカ更新操作プロセスは一般的に同じです。唯一の違いは、プライマリ レプリカの更新操作が完了した後にクライアントに応答するタイミングであり、これはシステムの可用性と一貫性の要件に密接に関連しています。 MySQL のマスターとスレーブを例に挙げてみましょう。通常の状況では、MySQL の更新では、クライアントに応答するためにマスターが正常に更新されるだけでよく、スレーブは binlog を通じてゆっくりと同期できます。この場合、スレーブの読み取りに一定の遅延が発生し、一貫性は比較的弱くなりますが、システムの可用性は保証されます。別のスレーブ更新戦略では、データ更新操作ではマスターが正常に更新されるだけでなく、スレーブも正常に更新される必要があります。プライマリ データとセカンダリ データは同期されたままであり、システムは強力な一貫性を保証しますが、可用性は比較的低く、応答時間は長くなります。 上記の例では、レプリカは 2 つだけです。強力な一貫性が必要な場合は、すべてのレプリカが更新された場合にのみ更新が成功したと見なされます。応答時間は比較的許容範囲内です。しかし、レプリカがさらに多い場合、一定の可用性を満たしながら一定の一貫性を確保する方法はあるのでしょうか?ここで、Quorum プロトコルについて検討する必要がありますが、その理論は簡単な数学の問題で説明できます。 N 個のレプリカがあり、更新中にそのうち W 個が正常に更新されます。次に、R レプリカを読み取ります。どのような条件下で、W と R は、読み取る R レプリカの 1 つが最新のデータであることを保証するのでしょうか (各レプリカにバージョン番号があり、バージョン番号が大きい方が最新のデータであると仮定)? 質問の答えは、W+R > N です (興味があれば考えてみてください) クォーラム プロトコルを使用すると、ある程度の可用性と一貫性を確保しながら、レプリカ更新の成功回数をレプリカの総数の半分 (つまり、N/2+1) に設定するのが最もコスト効率が高くなります。 (Zookeeper サーバーの最適な数がカーディナリティである理由がわかりましたか?) レプリカの読み取り レプリカの読み取り戦略は、一貫性の選択に関連しています。強力な一貫性が必要な場合は、プライマリレプリカからのみ読み取ることができます。最終的な一貫性が必要な場合は、セカンダリレプリカから結果を読み取ることができます。最新のデータを読み取る必要がある場合は、クォーラム プロトコルの要件に従って、対応する数のレプリカを読み取ります。 コピー間の切り替え システム内のレプリカが使用できない場合は、後続のシステムの正常な実行を保証するために、残りのレプリカの 1 つをプライマリ レプリカとして選択する必要があります。ここでは 2 つの問題が関係しています。
ストレージアーキテクチャモデル データ分散とレプリカ モデルの詳細が詳しく説明されています。システム全体のアーキテクチャの観点から、データストレージの一般的なプロセスと主要なモジュールは何ですか?メタデータの保存とノード間のメンバーシップ管理の観点から、主に次の 2 つのカテゴリに分けられます。 集中型ノードメンバーシップ管理アーキテクチャ このタイプのシステムは、主に 3 つのモジュールに分かれています。ユーザーとシステムの内部モジュール間の通信を担当するクライアント モジュール。メタデータの保存とノードの健全性状態の管理を担当するマスター ノード モジュール。データの保存とデータ クエリの返送に使用されるデータ ノード モジュール。 データ クエリ プロセスは通常、次の 2 つのステップに分かれます。
hdfs、hbase、Elastic Search などの現在の一般的なデータ ストレージ システムを分析し、上記の一般的なシステムと比較すると、マスター ノード モジュールは、具体的には hdfs の namenode、hbase の hMaster、Elastic Search のマスター ノードに対応していることがわかります。データ ノードは、hdfs のデータ ノード、hbase のリージョン サーバー、Elastic Search のデータ ノードに対応します。 分散型ノードメンバーシップ管理アーキテクチャ 以前のモデルと比較して、このアーキテクチャにはマスターノードが存在しないという最大の変更点があります。システム内の各ノードは、システム メタデータの保存やクラスター ノードの管理など、マスターと同様のタスクを実行できます。 データをクエリする方法も異なります。クライアントはシステム内の任意のノードにアクセスでき、マスター ノードに制限されなくなりました。具体的なクエリ プロセスは次のとおりです。1. システム内の任意のノードをクエリします。データがこのノード上にある場合は、対応するデータを返します。このノード上にない場合は、対応するデータのノード アドレスを返し、2 番目のステップを実行します。 2. データに対応するアドレスを取得した後、関連するデータを要求します。 ノード間でステータス情報をどのように共有するのでしょうか?一般的な方法は、ゴシップなどのプロトコルと、これに基づいて開発された serf フレームワークを使用することです。興味がある場合は、redis クラスターと consul の実装を参照してください。 データ計算および処理システム 一般的に使用されるデータ コンピューティングは、主にオフライン バッチ コンピューティング (リアルタイム コンピューティングまたは準リアルタイム ミニ バッチ コンピューティング) に分けられます。オープンソース システムは数多く存在し、各システムには独自の重点分野がありますが、共通する問題もいくつかあります。 データ配信戦略 データ処理で最初に考慮すべきことは、データ レコードがシステム内で何回処理されるか (正常および異常な状況を含む) です。
異常タスクの処理 データ コンピューティング ノードはステートレスであり、タスクのコピーを開始するだけで済むため、例外処理はデータ ストレージ システムよりもはるかに簡単です。 注: 失敗したタスクと時間制限のあるタスクに加えて、異常なタスクには、特別なタイプのタスクである遅れタスクも含まれます。大きなジョブは複数の小さなタスクに分割され、同時に実行されます。タスクの実行速度は、同じタイプの他のタスクよりもはるかに遅いことがわかります (データ スキューによって発生する実行速度の低下要因は無視します)。 タスク回復戦略は次のとおりです。
バックプレッシャー データ処理では、上流のデータ処理がデータを消費する速度が速すぎて、MySQL などの下流のデータ出力端末に負担がかかってしまうという問題がよく懸念されます。通常の解決策は、オンラインになる前に詳細なテストを行って、下流のデータ システムが耐えられる最大の圧力を評価し、次に、1 秒あたりに消費されるデータの最大量を制限するなど、上流データのフロー制御を構成することです。実際、これはよくある問題です。現在、スパークストリーミング、ストームなど、さまざまなリアルタイムデータ処理システムがバックプレッシャー機能を提供しています。下流のデータ処理速度が遅すぎる場合、システムは上流のデータの消費速度を自動的に低下させます。 バックプレッシャーに興味がある方、データ処理システムを自分で実装したい方は、Reactive Stream を参考にしてください。このプロジェクトは、一般的なデータ処理の仕様を提供します。 Akka はこの仕様を採用している有名なプロジェクトです。 データ処理の一般的なアーキテクチャ データ処理のアーキテクチャは一般的に似ており、通常は次のモジュールが含まれます。
上の図は一般的なアーキテクチャモデル図です。これは Hadoop v1 バージョンの MapReduce コンピューティング フレームワーク ダイアグラムなのかと疑問に思う人もいるかもしれません。これで、yarn モードの新しいコンピューティング フレームワーク ダイアグラムができました。このモデルをまだ使っている人はいますか?ハハ、その通りです。しかし、このモデルを使用する処理フレームワークはまだいくつかあります - Storm。 図のいくつかの概念を Storm の概念にマッピングしてみましょう。ジョブ トラッカーは Nimbus に対応し、タスク トラッカーはスーパーバイザーに対応し、各スーパーバイザーもワーカー スロットで構成する必要があり、ワーカーは Storm のワーカーに対応します。こうして比べてみると、同じように見えませんか? このフレームワーク モデルには問題があります。責任が明確ではなく、各モジュールが異なるタスクを実行します。たとえば、ジョブ トラッカーはタスクの実行ステータスを監視するだけでなく、タスクのスケジュールも担当します。 TaskTracker は、タスクのステータスと実行だけでなく、ノード リソースの使用状況も監視します。 上記の問題に対処するために、YARN モードに基づく新しい処理アーキテクチャ モデルでは、タスク実行ステータスの監視とタスク リソースのスケジュールを分離します。元のジョブ トラッカーは、リソースのスケジュールを管理するリソース マネージャーと、タスクの実行を監視する各 appMaster に分かれています。元のタスク トラッカーはノード マネージャーになり、リソースの監視とタスクの開始を担当し、タスクの実行ステータスと例外処理は appMaster によって処理されます。 同様に、Twitter は Storm アーキテクチャのいくつかの問題に基づいて、新しい処理フレームワーク Heron を立ち上げました。これが解決する問題は、タスクのスケジュールとタスク実行ステータスの監視の責任を分離することであり、ここでは AppMaster に似た新しい概念である Topology Master を導入します。 要約する 分散システムは多くのコンテンツをカバーします。この記事では、主に全体的なアーキテクチャと概念から開始する方法を紹介します。学習プロセスにはいくつかの一般的な問題があり、以下にまとめます。
今回シェアさせていただいた記事の内容は以上です。そこには必然的にいくつかの省略があります。ご質問がございましたら、いつでもお気軽にご指摘、ご連絡ください。一緒に進歩しましょう。ありがとう。 著者: Li Feng、シニアエンジニア。現在はLogicMonitor(SaaSサービス監視プラットフォームを提供し、毎日数百億の監視データを収集)に勤務し、分散ストレージストリーミングコンピューティングを中心としたデータ処理プラットフォームのアーキテクチャに従事しています。クリックすると元のテキストが表示され、やり取りの記録が表示されます。 |
<<: ガートナーは、クラウドコンピューティング市場が2020年に4,110億ドルに達すると予測している。
>>: Dockerはボリュームの永続化にOpenStack Cinderを使用する
検索があるところには必ず SEO があります。たとえば、Taobao には検索があり、Alibaba...
中国国際放送、北京4月6日。記者が国家ポルノ違法出版取り締まり弁公室から得た情報によると、3月5日に...
SEO キーワード最適化に不慣れなすべての初心者は、このような目標を持ち、優れた SEO 最適化者、...
[[405672]]最近、権威あるコンサルティング会社ガートナーは、エッジコンピューティング分野にお...
コロナウイルスのパンデミックの影響にもかかわらず、多くの組織はこれまで以上に柔軟なストレージを必要と...
ネットワーク セキュリティの分野では、技術面だけでなく、反ソーシャル エンジニアリング攻撃能力につい...
毎日絶えずアウトバウンド リンクを送信している友人は、この記事を注意深く読んでください。この記事では...
クラウド コンピューティングの利点は明らかですが、クラウドの導入を始めたばかりの企業にとって、クラウ...
この記事では主に、仮想ネットワーク制御プレーン上の ServiceMesh テクノロジーと転送プレー...
今年、Baidu は Green Radish Algorithm 1.0 をリリースし、最近 Gr...
フォーラムでは、Web マスターは、Web サイトを最適化するときに URL を静的にする必要がある...
Baidu の「いいね!」ボタンは小規模なテストではありません。百度の「いいね!」ボタンは小規模なテ...
Baidu Thumbs Up、これは SEO の世界ではやや冗談めいた名前です。これは百度自身が開...
多くのウェブマスターの友人は、苦労して上げたキーワードの順位が下がったり消えたりする状況に遭遇します...
12月1日、マット・カッツ氏は自身のブログとGoogleウェブマスターツールのブログに記事を投稿し、...