技術共有

Sleuth -- リンク追跡

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1 リンク トレースの概要

 大規模システムのマイクロサービス構築では、システムが多数のモジュールに分割されます。これらのモジュールはさまざまな機能を担当し、最終的に豊富な機能を提供できるシステムに結合されます。このアーキテクチャでは、リクエストに複数のサービスが関与することがよくあります。インターネット アプリケーションは、さまざまなソフトウェア モジュールのセットに基づいて構築されており、これらのソフトウェア モジュールはさまざまなチームによって開発され、さまざまなプログラミング言語を使用して実装され、複数の異なるデータ センターにわたる数千のサーバーに分散される可能性があります。このアーキテクチャ形式にはいくつかの問題があります。

  • 問題を素早く見つけるにはどうすればよいでしょうか?
  • 障害の影響範囲をどのように判断するか?
  • サービスの依存関係と依存関係の合理性をどのように整理するか?
  • リンクのパフォーマンスの問題とリアルタイムの容量計画を分析するにはどうすればよいですか?

分散リンク トレース (分散トレース) は、分散リクエストを呼び出し側リンクに復元し、ロギング、パフォーマンス監視を実行し、分散リクエストの呼び出しステータスを一元的に表示します。たとえば、各サービス ノードで費やされた時間、リクエストが到達したマシン、各サービス ノードのリクエスト ステータスなどです。

一般的なリンク トレース テクノロジーには次のようなものがあります。
  • Dianping によるオープンソースであり、以下に基づいていますジャワ開発されたリアルタイム アプリケーション監視プラットフォームには、リアルタイム アプリケーション監視とビジネス監視が含まれます。 統合された解決策は、インターセプターやフィルターなどのコード埋め込みによる監視を実装することです。 コード、統合に非常に侵入的より高いコスト。リスクはさらに大きくなります。
  • ジプキン によるツイッター同社のオープンソース分散追跡システムは、サービスのタイミング データを収集し、マイクロ サービスの問題を解決するために使用されています。サービス アーキテクチャにおける遅延の問題には、データ収集、ストレージ、検索、プレゼンテーションが含まれます。この商品は以下を組み合わせています春の雲探偵使用方法と統合は比較的簡単ですが、機能は比較的単純です。
  • ピンポイント ピンポイントこれは、バイトコード インジェクションに基づいた韓国のオープンソース コール チェーン分析およびアプリケーション監視分析ツールです。特徴さまざまなプラグインをサポートしています。インターフェース強力な機能、アクセス側でのコード侵入はありません。
  • スカイウォーキング
    スカイウォーキングこれは、バイトコード インジェクションに基づくローカル オープン ソース コール チェーン分析およびアプリケーション監視分析ツールです。多くのサポートを行っているのが特徴です。プラグインの一種、インターフェース機能は強力で、アクセス側にコードの侵入はありません。すでに参加していますアパッチインキュベータ。
  • 探偵
    スプリングクラウド 分散システムにおけるリンク追跡ソリューションを提供します。 
知らせ: スプリングクラウド アリババ テクノロジー スタックは独自のリンク トラッキング テクノロジーを提供していません。 探偵 +
ジンキン リンク追跡ソリューションを作成するには

2 探偵はじめる

2.1 探偵導入

SpringCloud Sleuth の主な機能は、分散システムで追跡ソリューションを提供することです。~から多額の借金をしている グーグル
粋な まずはデザインを理解しましょう 探偵 の用語と関連概念。
  • 痕跡
    グループによってトレースID同一スパン連結してツリー構造を形成します。リクエスト追跡を実装するには、リクエストが分散システムに到着したときにエントリエンドポイントの場合、サービス追跡フレームワークはリクエストの一意の識別子(つまり、トレースID)、分散システム内ではシステム内で循環するとき、フレームワークはリクエスト全体が返されるまで常にこの一意の値を渡し続けます。そうするとこれだけ使えます1 つの識別子ですべてのリクエストが結合され、完全なリクエスト リンクが形成されます。
  • スパン 作業単位の基本セットを表します。リクエストが各サービスコンポーネントに到達したときの各処理単位の遅延をカウントするため時刻も一意の識別子 (スパンID ) の開始、特定のプロセス、および終了をマークします。合格スパンIDの始まりと終わり終了タイムスタンプ、カウントできますスパン呼び出し時間に加えて、イベント名も取得できます。資料請求などメタデータ。
  • 注釈
    一定期間にわたるイベントを記録するために使用します。 内部使用に関する重要な注意事項:
    csクライアント送信) クライアントがリクエストを発行し、リクエストの有効期間を開始します。
    srサーバー受信) サーバーはリクエストを受信して​​処理を開始します。 srcs = ネットワーク遅延 (サービスコールの時間)
    ssサーバー送信) サーバーは処理を完了し、クライアントに送信する準備ができています。ss - sr = サーバーでのリクエストの処理時間
    cr のクライアントが受信) クライアントはサーバーから応答を受信し、リクエストは終了します。 cr - sr =要求された合計時間

2.2 探偵はじめる

マイクロサービス名 、トレースID、スパニッド、 リンク追跡結果をサードパーティプラットフォームに出力するかどうか
[api-gateway、3977125f73391553、3977125f73391553、偽]
[サービスオーダー,3977125f73391553,57547b5bf71f8242,false]
[サービス製品、3977125f73391553、449f5b3f3ef8d5c5、偽]
次に、これまでのプロジェクト事例を通じて統合する 探偵 、導入事例の作成を完了します。
親プロジェクトの紹介を変更する 探偵 頼る
  1. <!--链路追踪 Sleuth-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-sleuth</artifactId>
  5. </dependency>
マイクロサービスを開始してインターフェイスを呼び出した後、コンソールで観察できます 探偵 のログ出力
c61d4a753370cbeb はどこにありますか トレースID 、0e06445e055ed94fは SpanId には、呼び出しリンクを結び付けるために順番に呼び出されるグローバル TraceId があります。各マイクロサービスのログを注意深く分析することで、リクエストの具体的なプロセスを把握することは難しくありません。

ログ ファイルを表示することは良い方法ではありません。マイクロサービスが増えると、Zipkin がログを集約して視覚的な表示や全文検索を実行できるようになります。

3 ジプキン統合

3.1 ジップキン導入

ジプキンは ツイッター に基づくオープンソース プロジェクト Google Dapper によって実装されており、データを含むマイクロサービス アーキテクチャのレイテンシ問題を解決するためにサービスのタイミング データを収集することに特化しています。 収集、保存、検索、表示

これを使用して、各サーバー上のリクエスト リンクの追跡データを収集し、分散システムの監視プログラムを実装するために追跡データのクエリを支援するために提供される REST API インターフェイスを使用して、遅延の増加を迅速に発見できます。システムの高レベルの問題を解決し、システム パフォーマンスのボトルネックの原因を特定します。
開発指向の API に加えて インターフェイスに加えて、便利な機能も提供します。 UI コンポーネントは、追跡情報を直感的に検索し、リクエスト リンクの詳細を分析するのに役立ちます。たとえば、一定期間内の各ユーザー リクエストの処理時間をクエリできます。
Zipkin は、プラグ可能なデータ ストレージを提供します。 インメモリ マイSQL カサンドラ 同様に エラスティックサーチ

上の写真は、 ジプキン インフラストラクチャは主に以下で構成されます。 4 コアコンポーネントで構成されています:
  • コレクタ: コレクター コンポーネント。主に外部システムから送信された追跡情報を処理し、この情報を変換するために使用されます。 ジプキン内部で処理される スパンその後の保存、分析、表示、その他の機能をサポートするフォーマット。
  • ストレージ: コレクターが受信した追跡情報を主に処理するストレージ コンポーネント。デフォルトでは、この情報はメモリに保存されます。このストレージ戦略を変更して、他のストレージ コンポーネントを使用して追跡情報をデータベースに保存することもできます。
  • RESTful API翻訳 主に外部アクセス インターフェイスを提供するために使用されるコンポーネント。たとえば、追跡情報をクライアントまたは外部に表示します。監視等のためのシステムアクセス
  • ウェブUIインターフェース コンポーネント、に基づく翻訳コンポーネントによって実装される上位層のアプリケーション。合格インターフェースコンポーネントユーザーは便利かつ直観的にクエリと分析を行うことができます追跡情報を分析します。
Zipkin は 2 つの端に分かれており、1 つは ジプキン サーバー側では、1 つは Zipkin クライアントは、マイクロサービスのアプリケーションです。 クライアントがサーバーを構成します メールアドレス サービス間の呼び出しが発生すると、アドレスはマイクロサービスで構成されます。 Sleuth のリスナーはこれを聞いて、対応するメッセージを生成します。 痕跡 そして スパン 情報はサーバーに送信されます。

3.2 ジップキンサーバーのインストール

いいえ。 1 ステップ : ダウンロード ジップキン バッグ
https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

 上記の URL にアクセスして、バッグ、これですジップキンサーバ側バッグ

いいえ。 2 ステップ : コマンドラインから次のコマンドを入力して起動します。 ZipKin サーバー
java -jar zipkin-server-2.12.9-exec.jar

いいえ。 3 ステップ:ブラウザ経由でアクセスする http://localhost:9411 アクセス

3.3 ジプキンクライアントの統合

ZipKin クライアントと 探偵 統合は非常に簡単で、依存関係と構成をマイクロサービスに追加するだけです。

いいえ。 1 ステップ: 各マイクロサービスに依存関係を追加する
  1. <!--zipkin-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-zipkin</artifactId>
  5. </dependency>
いいえ。 2 ステップ: 構成を追加する
  1. # sleuth 和 zipkin 相关配置
  2. spring:
  3. zipkin:
  4. base-url: http://127.0.0.1:9411/ #zipkin server的请求地址
  5. discoveryClientEnabled: false #让nacos把它当成一个URL,而不要当做服务名
  6. sleuth:
  7. sampler:
  8. probability: 1.0 #采样的百分比
いいえ。 3 ステップ : マイクロサービスインターフェイスにアクセスする
http://localhost:7000/order-serv/order/prod/1

いいえ。 4 ステップ : アクセス ジプキン インターフェース インターフェース、観察効果

いいえ。 5 ステップ: レコードの 1 つをクリックして、訪問の詳細なルートを観察します。

4 ジップキンデータの永続性

Zipkin Server はデフォルトで追跡データ情報をメモリに保存しますが、この方法は運用環境には適していません。 Zipkin は、追跡データの永続化をサポートしています。 マイスク データベースまたは エラスティックサーチ 真ん中。

4.1 使用マイスクデータの永続化を実装する

いいえ。 1 ステップ : 作成する マイスク データ環境
  1. CREATE TABLE
  2. IF
  3. NOT EXISTS zipkin_spans (
  4. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this
  5. means the trace uses 128 bit traceIds instead of 64 bit',
  6. `trace_id` BIGINT NOT NULL,
  7. `id` BIGINT NOT NULL,
  8. `name` VARCHAR ( 255 ) NOT NULL,
  9. `parent_id` BIGINT,
  10. `debug` BIT ( 1 ),
  11. `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs
  12. query and to implement TTL',
  13. `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration
  14. and maxDuration query'
  15. ) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER
  16. SET = utf8 COLLATE utf8_general_ci;
  17. ALTER TABLE zipkin_spans ADD UNIQUE KEY ( `trace_id_high`, `trace_id`, `id` ) COMMENT 'ignore insert on duplicate';
  18. ALTER TABLE zipkin_spans ADD INDEX ( `trace_id_high`, `trace_id`, `id` ) COMMENT 'for joining with zipkin_annotations';
  19. ALTER TABLE zipkin_spans ADD INDEX ( `trace_id_high`, `trace_id` ) COMMENT 'for
  20. getTracesByIds';
  21. ALTER TABLE zipkin_spans ADD INDEX ( `name` ) COMMENT 'for getTraces and
  22. getSpanNames';
  23. ALTER TABLE zipkin_spans ADD INDEX ( `start_ts` ) COMMENT 'for getTraces
  24. ordering and range';
  25. CREATE TABLE
  26. IF
  27. NOT EXISTS zipkin_annotations (
  28. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this
  29. means the trace uses 128 bit traceIds instead of 64 bit',
  30. `trace_id` BIGINT NOT NULL COMMENT 'coincides with
  31. zipkin_spans.trace_id',
  32. `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  33. `a_key` VARCHAR ( 255 ) NOT NULL COMMENT 'BinaryAnnotation.key or
  34. Annotation.value if type == -1',
  35. `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller
  36. than 64KB',
  37. `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if
  38. Annotation',
  39. `a_timestamp` BIGINT COMMENT 'Used to implement TTL;
  40. Annotation.timestamp or zipkin_spans.timestamp',
  41. `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is
  42. null',
  43. `endpoint_ipv6` BINARY ( 16 ) COMMENT 'Null when Binary/Annotation.endpoint
  44. is null, or no IPv6 address',
  45. `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint
  46. is null',
  47. `endpoint_service_name` VARCHAR ( 255 ) COMMENT 'Null when
  48. Binary/Annotation.endpoint is null'
  49. ) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER
  50. SET = utf8 COLLATE utf8_general_ci;
  51. ALTER TABLE zipkin_annotations ADD UNIQUE KEY ( `trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp` ) COMMENT 'Ignore insert on duplicate';
  52. ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id_high`, `trace_id`, `span_id` ) COMMENT 'for joining with zipkin_spans';
  53. ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id_high`, `trace_id` ) COMMENT 'for getTraces/ByIds';
  54. ALTER TABLE zipkin_annotations ADD INDEX ( `endpoint_service_name` ) COMMENT 'for getTraces and getServiceNames';
  55. ALTER TABLE zipkin_annotations ADD INDEX ( `a_type` ) COMMENT 'for getTraces';
  56. ALTER TABLE zipkin_annotations ADD INDEX ( `a_key` ) COMMENT 'for getTraces';
  57. ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id`, `span_id`, `a_key` ) COMMENT 'for dependencies job';
  58. CREATE TABLE
  59. IF
  60. NOT EXISTS zipkin_dependencies ( `day` DATE NOT NULL, `parent` VARCHAR ( 255 ) NOT NULL, `child` VARCHAR ( 255 ) NOT NULL, `call_count` BIGINT ) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER
  61. SET = utf8 COLLATE utf8_general_ci;
  62. ALTER TABLE zipkin_dependencies ADD UNIQUE KEY ( `day`, `parent`, `child` );
いいえ。 2 ステップ : 起動時 ZipKin サーバー いつ , 保存するデータを指定する マイスク 情報
  1. java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --
  2. MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root -
  3. -MYSQL_PASS=root

4.2 使用エラスティックサーチデータの永続化を実装する

いいえ。 1 ステップ : ダウンロード エラスティックサーチ
ダウンロードリンク: https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-4

 

いいえ。 2 ステップ : 起動する エラスティックサーチ

 

訪問: ローカルホスト:9200

視覚化が必要な場合は、Kibana をインストールできます

いいえ。 3 ステップ : 起動時 ZipKin サーバー 保存するデータを指定する場合 エラスティックサーチ 情報
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ESHOST=localhost:9200

elasticsearch の視覚的な使用方法については、以下を参照してください。Windows での Elasticsearch のインストールと使用、および kibana_windows のインストールkibanna-CSDN ブログ