分散トレーシング技術について(open tracingやjaeger)

25
分散トレーシング技術について

Upload: ntt-communications-technology-development

Post on 21-Jan-2018

363 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: 分散トレーシング技術について(Open tracingやjaeger)

分散トレーシング技術について

Page 2: 分散トレーシング技術について(Open tracingやjaeger)

About me

Mahito Ogura (小倉真人<[email protected]>)

NTTコミュニケーションズ 技術開発部

業務:クラウドや分散システムの調査検証

● コムウェア入社(H21)2014年に異動で現職

● インフラ構築(Chef, Ansible)

● アプリケーション開発(Ruby)

● OpenStackとか分散ミドルとかコンテナ

● 採用のお手伝いとか各種イベント業, etc...

Page 3: 分散トレーシング技術について(Open tracingやjaeger)

はじめに

現代のサービスは複雑化され、そのシステムは大規模に分散することが多い。

特にサービスの機能ごとに分けて作り、それらを疎結合させるMicroservicesアーキテク

チャの流行もあり、機能ごとに開発チームが異なることや、開発言語が違うことが増え、

サービス内部はより分散し複雑化している。

分散し複雑化したサービスにおいて機能ごとの関係性を把握することは難しく、エラーや

性能問題などが起きた際にその原因特定が非常に難しくなる。

こうした問題に取り組むべく、分散されたサービス内のリクエストをトレース可能な、分散

トレーシング技術が現在注目を浴びている。

Page 4: 分散トレーシング技術について(Open tracingやjaeger)

分散トレーシングの歴史

2003年「Magpie: Online Modelling and Performance-aware Systems」

2007年「X-Trace: A Pervasive Network Tracing Framework」

2010年「Dapper, a Large-Scale Distributed Systems Tracing Infrastructure」

以降、Dapperの論文を元にZipkinやDapperとZipkinをベースにしたappdash、HDFSや

HBaseに使われているHTraceなどのOSSが開発される。

また、最近では分散Tracingの仕様やAPIを取りまとめたOpenTracingが登場し、

OpenTracingの仕様を実装したライブラリや、上記OSSのOpenTracing対応が進められて

いる。

Page 5: 分散トレーシング技術について(Open tracingやjaeger)

インターネットサービスはしばしば複雑に実装され、大規模に分散したシステムとなって

いることがある。

これらのシステムはソフトウェアモジュールの集合であり、各ソフトウェアモジュールは、

開発チームが異なることや、開発言語が異なること、そして何千台のマシンの複数のレ

イヤにまたがることがある。

こうした環境においてシステムのしくみの理解や、性能問題の原因特定は難しく、一度

問題が起きると解決に至るまでに膨大なコストがかかることがある。

こうした問題を解決するために、各システムの挙動や性能を把握することができる分散

トレーシング技術が注目を集めている。

なぜ分散トレーシングが注目されているか

Page 6: 分散トレーシング技術について(Open tracingやjaeger)

参考:OpenStackのアーキテクチャ

Page 7: 分散トレーシング技術について(Open tracingやjaeger)

分散トレーシングに必要なしくみは次の2つ

● 分散トレーシングのしくみ(ライブラリ含む)

● トレースの結果をモニタリングするためのしくみ

また、トレーシングがシステムの性能に影響を及ぼさないよう、

一部の処理だけをトレースするためのサンプリングレートを設定するしくみを

設けている分散トレーシングツールも存在している(ex.Zipkin, OpenTracing)

分散トレーシング

Page 8: 分散トレーシング技術について(Open tracingやjaeger)

Trace:Span全体のStartからFinishまでを含むSpanの集合体

Span:ひとつのサービス(境界)内の処理。以下の情報が含まれる

分散トレーシング(OpenTracing)用語解説 -1/2-

Trace

Span

Page 9: 分散トレーシング技術について(Open tracingやjaeger)

オプション

● Span Tags

● Span Logs

● References

○ 他Spanとの関係性

分散トレーシング(OpenTracing)用語解説 2/2

必須

● Operation Name

● Start / Finish Timestamp

● Span Context

○ Baggage Items

○ tarace / span ID

Page 10: 分散トレーシング技術について(Open tracingやjaeger)

以下例では、Traceは8つのSpanから構成されている。

各Spanの間には関係性があり有効巡回グラフ(DAG)で表すことができる。

Spanの関係図(DAG)

Page 11: 分散トレーシング技術について(Open tracingやjaeger)

SpanとReferenceについて

ChildOf Reference:

親Spanが依存する子Spanとの関係(例:RPC, SQL)

FollowsFrom Reference:

親Spanが依存しない子Spanとの関係(例:非同期処理)

Page 12: 分散トレーシング技術について(Open tracingやjaeger)

分散トレーシングのユースケース

● プログラム内の関数レベルのトレース

● サーバのエンドポイントのトレース

● クライアントコールのトレース

● 分散環境におけるデータの分散 / 転送

● イベントのロギング

● メッセージバス(MQ and Pub/Sub)シナリオのトレース

Page 13: 分散トレーシング技術について(Open tracingやjaeger)

OpenTracingについて

OpenTracingは、一般的なプラットフォームに向けて、一貫したベンダ非依存なAPIを提

供することにより、開発者に容易にシステムへトレーサの追加、またはトレーサの切り替

えを行うことが出来るしくみを提供する、分散トレーシングの実装である。

また、OpenTracingは分散トレーシングとしてのOSSの実装以外にも、プラットフォーム固

有のトレーサーに向けた共通仕様も用意しており、他の分散トレーシングツールはこの

仕様を実装することで、OpenTracing互換のトレーサーとして実装することが出来るた

め、ユーザは設定の変更だけでトレーサの切り替えを行うことができる。

Page 14: 分散トレーシング技術について(Open tracingやjaeger)

OpenTracing仕様を実装したトレーサー

● Zipkin:Twitter社が開発したトレーサー

● Jaeger:Uber社が開発したトレーサー

● Appdash:sourcegraph社がGo言語で開発した軽量なトレーサー

● LightStep:OpenTracing互換のトレーサー

● Hawkular:OpenTracing-Javaをサポート

● Instana:OpenTracingのJava, Node.js, Goをサポート

● sky-walking:OpenTracing-Javaをサポート

● inspectIT:OpenTracing-Javaをサポート

● stagemonitor:Javaのバイトコードからトレーシングを行う

Page 15: 分散トレーシング技術について(Open tracingやjaeger)

Zipkin

GoogleのDapperを参考に作られた分散トレーシングシステム

分散システムのレイテンシ問題の

トラブルシューティングに必要な

データを収集し(Zipkin)、

システムの依存関係を参照するための

UI(Zipkin UI)を提供する

アーキテクチャは右図参照

● ReporterはTransportにデータを転送

● Transporはcollectorにデータを転送

● CollectorはStorageにデータを格納

参考:http://zipkin.io/pages/architecture.html

Page 16: 分散トレーシング技術について(Open tracingやjaeger)

Jaeger

Uber社がGo言語で開発している分散トレーサーとそのUI

● 2017年9月にプロジェクトがCNCFにホストされることになった

Go言語で書かれた自前のモニタリングツールが用意されている

Go, Python, Node, JavaなどのTracerが用意されている

● Python 3には未対応

Page 17: 分散トレーシング技術について(Open tracingやjaeger)

Architecture

出典:http://jaeger.readthedocs.io/en/latest/architecture/

Page 18: 分散トレーシング技術について(Open tracingやjaeger)

分散トレースのしくみ(ex. HTTP Request)

HTTPヘッダに格納された親スパンの

情報をデシリアライズ(extract)

現在のSpanの情報をシリアライズして

HTTPヘッダに格納(inject)

Serialize span ID to a string {trace_id}:{span_id}:{parent_id}:{flags}

出典:http://jaeger.readthedocs.io/en/latest/architecture/

Page 19: 分散トレーシング技術について(Open tracingやjaeger)

sourcegraph社がGo言語で開発した軽量なトレーサー

Go言語で書かれた自前のモニタリングツールが用意されている

● 一応OpenTracingへの対応はしているとドキュメントに書かれている

● 開発の更新は2016/11で止まっている(2017/9/19時点)

● DAGの表示はできない

Go, Python, Ruby(サードパーティー)などのTracerが用意されている

● しかしながらRubyはOpenTracing未対応かつ壊れている可能性が高い

参考:Appdashを動かしてみた - Qiita

Appdash

Page 20: 分散トレーシング技術について(Open tracingやjaeger)

LightStep

OpenTracing互換のTracer

● Go / JavaScript / Python / PHP / Ruby / Java / iOS / Android

MonitoringはSplunk/kibanaを利用する模様

詳細はLightStep社に問い合わせが必要

Page 21: 分散トレーシング技術について(Open tracingやjaeger)

Hawkular

RedHatが支援している既存のモニタリングの課題を解決するためのツール

以下の4つの機能を有する

● Federated Alerting

● Distributed Tracing

● Metrics TSDB

● ManageIQ Provider

分散トレーシングについてはJaegerとコラボをすることでOpenTracing対応をしているらし

い。

Page 22: 分散トレーシング技術について(Open tracingやjaeger)

サンプル(OpenStack Novaへの実装)

nova-computeがnova-schedulerにインスタンスの情報を同期する流れ

22

nova-compute

Queue<conductor>

RabbitMQ

nova-conductor

Queue<reply_xxx>

nova-scheduler

Queue<scheduler>

① call to ”conductor” for DB access

② reply to ①

③ cast to ”scheduler”

Database

Page 23: 分散トレーシング技術について(Open tracingやjaeger)

Jaeger UI上でのトレース結果

① call to ”conductor” for DB access

② reply to ①

③ cast to ”scheduler”

① + ②

Page 24: 分散トレーシング技術について(Open tracingやjaeger)

● 分散システムの挙動やレイテンシの把握は難い

● 分散トレーシングの仕様としてOpenTracingがある

● OpenTracing実装として各種ツールがあるが、

現状はUber社が開発をしているJaegerがよさそう

● まだ全体的にドキュメントが足りておらずコードを

読まないとわからないことが多い

まとめ

Page 25: 分散トレーシング技術について(Open tracingやjaeger)

Presentation by NTT Communications