Qunar.com は Mesos と Docker をベースにしたプライベート クラウド サービスを構築

Qunar.com は Mesos と Docker をベースにしたプライベート クラウド サービスを構築

この記事では、Qunar.com が Mesos と Docker を使用してプライベート クラウド サービスを構築するプロセス全体を詳しく説明し、ステートレス アプリケーションからステートフル アプリケーションへの段階的な移行の経験と洞察を共有します。

プラットフォームの概要

2014 年後半頃、Qunar はプライベート クラウド サービスの構築に関する技術調査を完了し、最終的に Docker/Mesos ソリューションを選択しました。下の図 1 は、Qunar のデータ プラットフォームの全体的なアーキテクチャを示しています。


図1: Qunarデータプラットフォームの全体的なアーキテクチャ

現在、プラットフォームには次の機能が実装されています。

  • 毎日約 340 億/25 TB のデータを処理します。
  • データの 90% は 100 ミリ秒以内に処理されます。
  • 最大3時間/24時間のデータ再生。
  • プライベート Elasticsearch クラウド。
  • 自動監視とアラーム。

Docker/Mesosを選ぶ理由

今のところ、このデータプラットフォームは、プライベートElasticsearch Cloudや監視アラームなどのデータを含む同社のストリーミングデータ全体の主な入口と出口であると言えます。では、なぜ Docker/Mesos なのでしょうか?

Docker を選択する主な理由は 2 つあります。 1つ目はパッケージングです。業務をパッケージ化した後の運用・保守において、日々直面するのは、マシンにスクリプトを配布する際に生じるさまざまな問題です。ビジネス パッケージは比較的高度なトピックなので、ここでは詳しく説明しません。ここで言う「パッケージング」とは、ソフトウェアのランタイム層を指します。 Docker のパッケージング メカニズムを使用して、問題が発生しやすいランタイムをイメージにパッケージ化してレジストリに配置し、必要なときに取り出すと、プラットフォーム全体で最大 1 つのリモート スクリプトを実行するだけで済みます。これはチームが最も楽観視している機能です。 2 つ目は運用と保守です。Docker は依存関係の制限を削除します。仮想環境またはランタイムイメージを構築すれば、それをサーバーに直接プルして、対応するプログラムを起動できます。また、Docker はクリーンアップが比較的簡単で、環境のクリーンでないアンインストールなどの問題を心配する必要がありません。

一般的なコンピューティング フレームワークに関しては、それらは本質的に、その上で実行されるジョブのランタイムに属します。上記に基づいて、チームはランタイム用にパッケージ化することを選択しました。

Mesos が選ばれたのは、シンプルで十分に安定しており、成熟したスケジューリング フレームワークを備えているためです。 Mesos のシンプルさは、そのすべての機能が Kubernetes の機能より劣っているという事実に反映されています。サービス自体をサポートしていないことが判明する場合もあります。ユーザーは、ネットワーク層を含む実際の要件を満たすために二次開発を行う必要があります。しかし、これがこの製品の強みでもあるのです。 Mesos 自体は多くの SDN インターフェースを提供し、またはモジュール読み込みメカニズムを備えており、カスタマイズや変更が可能で、プラットフォームのカスタマイズ機能が比較的強力です。したがって、Mesos ソリューションを使用する場合は、チームが開発プロセス全体を管理できるかどうかを考慮する必要があります。

フレームワークの観点から見ると、Marathon は長時間実行されるサービスをサポートできますが、Chronos はスケジュールされたタスク/バッチ処理に重点を置いています。

下の図 2 は Mesos の簡単な構造図です。


図2: Mesosアーキテクチャ

データ プラットフォームの最終的な目標アーキテクチャを以下の図 3 に示します。


図3: プラットフォームターゲット

コンポーネントのコンテナ化と展開

コンポーネントのコンテナ化は、JVM コンテナ化と Mesos コンテナ化に分けられます。 JVM コンテナ化を使用する場合は、次の点に注意する必要があります。

潜在的なファイル作成の構成に注意してください

  1. java.io.tmpdir  
  2. -XX:ヒープダンプパス 
  3. -Xloggc

-Xloggc は指定されたファイルに GC 情報を記録します。現在、XLoggc が直接構成に使用されることはほとんどありません (MXBean に置き換えられました)。 -Xloggc 経由で GC ログを出力する古いプログラムがある場合は、コンテナーに追加のボリュームをマウントする必要があります。

タイムゾーンとエンコーディング

  1. –env TZ=アジア/上海 
  2. –ボリューム /etc/localtime:/etc/localtime:ro  
  3. –env JAVA_TOOL_OPTIONS=”-Dfile.encoding=UTF-8 -Duser.timezone=PRC

タイムゾーンも考慮すべき点です。上記の 3 つの異なる方法はすべて目的を達成できます。 1 番目/3 番目は Dockerfile に書き込むことも、docker 実行時に –env を介して渡すこともできます。 2 番目の方法は、docker の実行時にボリュームを通じてのみマウントされます。また、3 番目の方法では、文字セットのエンコーディングも追加で設定されるため、この方法が推奨されます。

ヒープをアクティブに設定する

  • 人間工学によるメモリの誤算を防ぐ

これは Docker の内部実装の問題です。 Docker 用のメモリを設定しても、コンテナ内の free コマンドで見えるメモリはホストマシンのメモリと同じです。使いやすさを考慮して、JVM はデフォルトでヒューマンマシン関数を設定し、現在のマシンのメモリに基づいてヒープ サイズを計算します。 JVM ヒープ メモリを積極的に設定しないと、Memory Cgroup 制限を超えるメモリが計算され、起動時にクラッシュする可能性が非常に高いため、起動時のメモリ設定には注意が必要です。

CMSコレクターは並列処理を調整する必要がある

  1. -XX:ParallelGCThreads=CPU パラレルGCスレッド数 
  2. -XX:ConcGCThreads=CPU/2

CMS は共通コレクターです。マシン上のコアの数を使用して並列度を計算します。コンテナに 2 つの CPU が割り当てられている場合でも、JVM はホスト マシンのコア数に応じてスレッド数を初期化するため、GC 回復効率が低下します。この問題を回避する方法は 2 つあります。 1 つ目は、Lxcfs などの偽の Proc ファイル システムをマウントすることです。 2 つ目は、Hyper のようなハイパーバイザーベースのコンテナーを使用することです。

Mesos コンテナ化では、構成パラメータと実行パラメータという 2 種類のパラメータに注意する必要があります。

注意が必要な設定パラメータ

  1. MESOS_systemd_enable_サポート 
  2. MESOS_docker_mesos_イメージ 
  3. MESOS_docker_ソケット 
  4. GLOG_最大ログサイズ 
  5. GLOG_stop_logging_if_full_disk

Mesos には最も多くの構成パラメータがあります。物理マシンでは、Mesos はデフォルトでシステムの Systemd 管理タスクを使用します。 Mesos が Docker run を通じて起動される場合、Mesos Slave がコンテナのランタイム データを取得して混乱を招かないように、ユーザーは systemd_Enable_support をオフにする必要があります。

2番目はDocker_Mesos_Imageです。この構成は、Mesos Slave が現在コンテナ内で実行中であることを伝えます。物理マシン環境では、Mesos スレーブ プロセスがクラッシュして再起動すると、実行プロセス/コンテナの名前に基づいて回復アクションが実行されます。ただし、コンテナ内では、クラッシュ後にすべてのエグゼキュータがリサイクルされます。コンテナが再起動されると、スレーブはそれを新しい環境と見なし、上書きアクションをスキップしてタスクを自動的に送信するため、タスクが重複する可能性があります。

Docker_Socket は、Docker によって指定されたリモート アドレスまたはローカル ファイルがデフォルトで Mesos コンテナにマウントされていることを Mesos に伝えます。ユーザーがファイルを直接実行すると、ファイル エラーが発生し、メッセージの取得に失敗します。このとき、現在の物理マシンのディレクトリをコンテナにマウントし、個別に名前を付けるという簡単な方法が推奨されます。これは、コンテナ内の物理マシン全体のパスに直接アクセスし、そのアドレスを再指定することと同じです。このようにして、変更があるたびに、Mesos はそれを検出し、独自の指示を実行できます。

次の 2 つは Mesos Logging 構成であり、ログ ファイルの生成の動作を調整します。

注意が必要な実行パラメータ

  • --pid=ホスト
  • –特権
  • –net=ホスト (オプション)
  • ルートユーザー

スレーブ コンテナーを起動するときには、Pid Namespace を追加しないことをお勧めします。コンテナー内の Pid=1 のプロセスは通常、アプリケーションであるため、子プロセスをリサイクルできない可能性があります。または、同じ目的を達成するために tini などのプロセスを使用してアプリケーションを起動しないでください。 –privileged および root ユーザーは主に Mesos の永続ボリューム機能用であり、それ以外の場合はコンテナにマウントできません。 –net=host はネットワーク効率を考慮します。結局のところ、ネイティブ ブリッジ モードは比較的非効率的です。


図4: Qunarデータプラットフォームの展開フローチャート

上の図 4 は、Qunar データ プラットフォームの展開のフローチャートです。

マラソンに基づくストリーミングスケジュール

Mesos 上の Spark の記録を見ると、Spark に基づく Marathon スケジューリングでも、ユーザーはフレームワークを開発する必要があります。本番環境に移行するには大量のコードが必要です。チームは以前、マスターで Spark が実行される問題を具体的に解決するために、約 1,000 行のコードを追加しました。ただし、ソフトウェアの 1 つがマスターに対して実行されることが多く、フレームワークごとに繰り返しコードが記述されます。さらに、内部ロジックの再利用は困難です。そのため、チームは上位レベルのすべてを統一されたフレームワークで実行することを検討しました。例えば、その後の運用・保守や容量拡張もすべてこのフレームワークひとつで行うことができます。チームは最終的に Marathon を選択し、Spark を Marathon タスクとして送信し、Spark を Marathon 内で配布しました。

ディメンションの標準化と自動化を提供することに加えて、Spark ベースの Marathon は Mesos-Dispatcher のいくつかの問題も解決できます。

  • 構成を正しく同期できません。この部分の更新頻度は特に遅く、デフォルトの速度も非常に遅いため、自分でバージョンを維持する必要があります。最初の構成を正しく同期できません。いくつかのパラメータ情報、Spark コアの数、内部損失を設定する必要があります。ここでは、構成の一部のみを選択的に抽出して送信します。
  • 属性に基づくフィルタリング機能がありません。現在の環境では、属性フィルタリング設定機能が明らかに欠落しています。マシンが専用であるか、特別な構成であるかに関係なく、すぐに送られると ES マシンがいっぱいになりやすくなります。
  • ロール/プリンシパルで Mesos にアクセスします。異なるビジネス ラインにリソースを割り当てる場合、異なるロールの Mesos にアクセスすることはできません。
  • 再登録できません。フレームワーク自体は再登録できません。フレームワークが実行中にクラッシュした場合、再起動後に以前のタスクは無視され、フレームワークを手動で強制終了する必要があります。
  • 実行者は動的に拡張できません。最後に、動的に拡張または調整することはできず、一時的な変更が必要な場合は、タスクを再送信することしかできません。

全体のプロセスは、下の図 5 に示すように、比較的簡単です。


図5: 代替Spark Mesosディスパッチャ

しかし、まだいくつか問題があります:

チェックポイントとブロック

  • 動的予約と永続ボリューム
  • ジャーを設定する
  • 無効なボリュームをクリーンアップする

チェックポイントとブロックに関しては、動的予約機能を使用して、このタスクをこのマシンに直接「固定」することができます。ハングした場合は、元のマシンで直接再起動し、ボリュームをマウントして作業を続行できます。予約されていない場合は、データ ブロックが見つからない他のマシンにスケジュールされる可能性があり、その結果、データが失われたり、処理が重複したりします。

永続ボリュームは Mesos によって提供される機能です。データの永続性を考慮する必要があります。 Mesos は、ローカル ディスクをディレクトリにアップグレードし、それを Docker に転送するというソリューションを提供します。データがローカルに書き込まれるたびに、永続ボリュームを通じて直接メンテナンスできるため、手動メンテナンスのコストが削減されます。しかし、現在問題があります。タスクがリサイクルされた場合、その永続ボリューム内のデータは自動的に削除されません。定期的に巡回して適宜削除するスクリプトを作成する必要があります。

一時ファイル

  • java.io.tmpdir=/mnt/mesos/sandbox
  • spark.local.dir=/mnt/mesos/sandbox

永続ボリュームを使用する場合は、これら 2 つの設定を変更し、シャッフル ファイルなどの一時ファイルを書き込む必要があります。永続ボリュームが構成されている場合、ユーザーは永続ボリュームへのパスを書き込むこともできます。

粗粒度

Spark には、細粒度と粗粒度の 2 つのリソース スケジューリング モードがあります。現在、きめ細かなモードは推奨されていません。細粒度モードでは可能な限りすべてのリソースを占有することを考慮すると、Mesos リソースが枯渇する可能性が高くなります。したがって、この時点では粗粒度モードを選択する傾向があります。


図6: マラソンの嵐

上の図 6 は Storm に基づく Marathon のスケジュールを示しており、Flink の場合も同様です。オンライン操作と保守およびデバッグと組み合わせて、次の点に注意する必要があります。

ネイティブ Web コンソール

  • ランダムポート
  • ワイルドカードドメイン名を使用した OpenResty
  • デフォルトのソース Web コンソール、フロントエンド構成転送、固定ドメイン名への直接アクセス。

ファイルビート + カフカ + ELK

  • マルチバージョントレース
  • 日常的なトラブルシューティング
  • 異常な監視

WebUI に表示される内容のほとんどは、現在の内部データ処理ステータスであり、ELK を通じて情報を照会できます。タスクが異なるバージョンの Spark で実行された場合、日次および問題の監視を含む複数のバージョンのログを追跡し、直接使用することができます。

メトリクス

3番目に注目するのはインジケーターです。たとえば、Spark では、データ ソースを出力するために Metrics のみを使用する必要があります。

Mesos の ELK

現在、プラットフォームには約 50 のクラスター、約 100 TB 以上のビジネス データ、ピーク時の 1.2k QPS、約 110 のノードがあります。 Elasticsearch の需要は徐々に増加しています。


図7: Mesos上のELK

上の図 7 は Mesos 上の ELK の構造図であり、これもチームの無力な選択です。 Mesos はまだマルチロール フレームワーク機能をサポートしていないため、この妥協的なアプローチが選択されました。マラソンでは、ビジネス ラインに応じてクォータを設定した後、ビジネス ラインを使用して新しいマラソンを起動し、それに接続します。マルチテナントの場合、後続のリソース管理とリソース適用に Kubernetes を使用できます。

ES をデプロイした後、サービス検出に関する問題が発生します。コールバックを登録すると、Marathon は情報を返し、マスター/スレーブ プロセスが配置されているマシンとポートを解析し、Haproxy を変更して転送レイヤーを実行します。これは、バックエンドの TCP 接続全体をチャネルにするのと同じです。 ES は Spark とまったく同じではありません。 Spark 送信自体のトラフィックは比較的大きく、ES は起動時にマスター アドレスにアクティブに接続し、マスターを介して対応するクラスターを取得してから P2P を実行する必要があります。トラフィックは比較的少なく、リンクも長くありません。

監視と操作

この部分には、ストリーミング監視インジケーターとアラーム、およびコンテナ監視インジケーターとアラームの 2 つの側面が含まれます。

ストリーミング監視インジケーターとアラーム

  • ストリーミング監視には、トポロジ監視とビジネス監視が含まれます。
  • ストリーミングトポロジー監視

ビジネスモニタリング

  • Kafka トピック ラグ
  • 処理遅延 平均90/上限90
  • Spark スケジューラの遅延/プロセスの遅延
  • 検索数/メッセージ数
  • 拒否/例外
  • 仮想マシン

トポロジ監視には、データ ソースとトポロジ プロセス全体が含まれており、これらはユーザーが整理して構築する必要があります。更新すると、これが誰に依存しているか、オンライン サービスに依存しているかどうかがわかります。途中で止まると機械の故障の原因になります。ビジネスモニタリングの場合、最初のものはトピックラグです。トピックラグの変動はそれぞれ異なります。このように監視すると、頻繁にアラームが発生します。中央値の 90% は 80 ~ 100 ミリ秒の範囲内にあるため、範囲全体を監視できます。

コンテナ監視インジケーターとアラーム

コンテナ監視は、次の 3 つの側面に重点を置いています。

Google cAdvisorは十分に効果的

  • rootfs をマウントするとコンテナの削除に失敗する可能性があります #771
  • --docker_only
  • –docker_env_metadata_whitelist

統計 + ウォッチャー

  • Graphiteベースの数千万の指標監視プラットフォーム

ナギオス

コンテナ部分は比較的シンプルです。 Docker を使用して Mesos と連携し、Marathon ID を取得するだけです。練習中に問題を発見しました。 Statsd Watcher は問題が発生しやすいです。 Docker を直接使用すると、いくつかのエラーが報告されます。この問題は、Statsd Watcher がパスをハングさせることです。私たちのプラットフォームでは、この問題に一度遭遇しており、コミュニティの一部の人々もこれを暴露しましたが、再発率は比較的低いです。使用中にこの問題が見つかった場合は、Statsd Watcher を停止してください。インジケーターとしては、各マシンに statsd を配置してバックグラウンドワーカーを送信し、アラームプラットフォームもこれです。

実際、Docker 監視にはまだいくつかの問題があります。

基本的な監視圧力

  • データインフレ
  • ゴミ指標の増加
  • ワイルドカードの数が多いとデータベースの負荷が高くなります

単一タスクのコンテナライフサイクル

  • リリース
  • スケーリング
  • 突然辞める

まず第一に、監視システムは大きな圧力にさらされています。もともと、仮想マシンを監視する場合は、仮想マシンごとに監視していました。仮想マシンが削除されない限り、長期レポートが実行され、インジケーター名が固定されます。しかし、コンテナ内では、このものは常に変化しています。このシステムでは、インジケーターが使用され、ローカル ディレクトリの外部にディレクトリが作成され、そこにファイルが保存されます。したがって、このストレージ メカニズムにコンテナー インジケーターを保存することは適切ではありません。主な問題は、データの拡張が非常に深刻であることです。コンテナに名前が付けられ、複数回名前が付けられた後、Graphite 側に対応するインジケーターが 10 個以上存在する場合があります。これらはすべて事前に生成された監視ファイルです。たとえば、1 秒ごとにデータ ポイントを定義し、それを 1 年間保存する場合、1 年あたりの秒数に基づいて RRD ファイルが生成され、そこに保存されます。これらの指標を既存の基準に従って計算すると、コンテナのライフサイクルは数日しかない可能性があり、このメカニズムは適用できません。同じ量のメトリックをテストしたところ、同社のストレージ方法は Graphite よりも比較的優れています。 Graphite はファイル システムに基づいているため、最初に行うべきことはインジケーター名を最適化することです。インデックスの高速化とクエリのために、ディレクトリをデータベースに転送する必要があります。ただし、コンテナ側にはワイルドカードが比較的多いため、具体的な対応IDを直接取得することはできません。集計にはワイルドカード クエリのみを使用できます。長期ワイルドカードは文字列インデックスで依然として簡単に使用できるため、一般的に使用されるクエリ結果とディレクトリをそこに入れるという妥協案が採用されるようになりました。

もう 1 つはコンテナのライフサイクルです。監査やバージョン変更を行ったり、Mesos レベルで Marathon に基づいて監視したり、問題が見つかったときにその状態をマークしたり、どのコンテナーまたはタスクに問題があるか、それに応じて容量を拡張して記録したりすることができます。 Docker 自体にも問題があるため、後でレコード全体を作成すると、比較的完全な TASK-ID が得られます。

著者について: Xu Lei は、Qunar.com プラットフォーム部門の運用保守開発エンジニアです。 2015年にQunar.comに入社し、リアルタイムログの開発と運用・保守を担当しています。彼は通信およびクラウド コンピューティング業界で長年の経験を持ち、Red Hat China で勤務していました。

<<:  「9つの言葉、1つの手、専用のクラウド」、Youfu Networkのクラウドへの道

>>:  クラウドコンピューティングは「星を見上げる」ことから「地に足をつけた」ものへと進化しました

推薦する

外部リンクに関する個人的な見解についての簡単な議論

私は長年 SEO に携わってきましたが、多くのウェブマスターが私と同じように、外部リンクへの道がます...

2022 年のクラウドとエッジ コンピューティングの 6 つの主要なテクノロジー トレンド

2022 年には、クラウドの仕組みを変える新しいテクノロジーが登場します。これらのテクノロジーは、ク...

クラウド コンピューティング市場での今後 10 年間の競争に勝つにはどうすればよいでしょうか?

[51CTO.com からのオリジナル記事] コスト削減と効率性向上の利点により、クラウド コンピュ...

#攻撃対策: Buyvm-Ddos 保護を 100G に無料でアップグレード/Alipay をサポート

buyvm から朗報です。元々月額 3 ドルだった 20G 向け DDoS 対策サービスは、価格変更...

ハッカー基地のリーダーであるローン・ソードマンは懲役5年の刑を宣告された

記者らは本日、Heiji.com(旧ハッカー基地)の代表である王先兵氏と講師の周林良氏が、コンピュー...

WordPressブログのSEO最適化に役立つプラグイン

世界で最も人気のあるブログ テンプレートである WordPress の最大の利点は、ユーザーがニーズ...

劉恒紅、李佳琦の「交通パスワード」を解読

一日に何度も人気検索リストに上がり、画面には羽根つきの練習があふれた。周杰倫ですら人気者になれなかっ...

Yixinがマーケティングアカウントの新たなターゲットに。NetEaseは「友達追加」に制限を設ける予定

マーケターは数百人規模の大規模なグループを作成している。NetEaseは「友達の追加」に制限を設ける...

プライベートクラウドとは何ですか?パブリッククラウドとどう違うのでしょうか?

序文プライベート クラウドは、組織専用に構築されたクラウド コンピューティング サービスの一種です。...

万万小丹が秋世百科のUEOモデルについて簡単に語る

今や求氏有は中国全土に広まっていると言っても過言ではなく、求氏百科事典の成功は明らかです。万万達小丹...

コンテンツを更新し続け、時々リンクランキングを変更して着実に改善します

最近、私はいとこの会社のウェブサイトの最適化を手伝っています。この会社は主に工作機械の部品を販売して...

ブルーオーシャンからレッドオーシャンへ、ソーシャルコンテンツ電子商取引の未来はどこにあるのでしょうか?

ネットセレブやスターに倣って買い物をすることは、多くの人にとって一般的なショッピングパターンとなって...

weloveservers-年間5ドル/cpanel仮想ホスト/50gハードドライブ/1Tトラフィック/無制限のウェブサイト構築

weloveservers は長い間プロモーションをリリースしていませんでした。私は「なんとも言えな...

安価なマシン 3 台で 1 秒あたり 200 万回の書き込みを実現! Kafka はなぜこんなに速いのでしょうか?

Kafka のメッセージはディスクに保存またはキャッシュされます。一般的に、ディスク上のデータの読み...

UFIDA NC が安全な「エンタープライズレベルのクラウド コンピューティング」を開始

クラウド コンピューティングは近年登場した新しい概念です。これは、テクノロジー企業がまずデータセンタ...