信頼性と可観測性
ログ、メトリクス、トレース、アラートを使って、信頼性の高いシステムを構築し、効果的に監視する方法を学びましょう。
信頼性と可観測性が重要な理由
実際のシステムでは、障害はまれな例外ケースではなく、継続的に検知して対処しなければならない想定内の状態です。
- トラフィックの急増やリソース制限によって、システムが過負荷になることがあります。
- 依存先やデータベースが障害を起こしたり、遅くなったりすることがあります。
- ネットワークの問題によって、レイテンシ、パケットロス、または停止が発生します。
詳細
本番環境で稼働するバックエンドシステムは、予測できない状況に常にさらされています。制御された環境とは異なり、実際のシステムは、変動するトラフィック、部分的な障害、性能低下にいつでも対応しなければなりません。これらの問題は例外ではなく、システムの通常の振る舞いの一部です。
信頼性とは、コンポーネントが故障してもシステムが正しく動作し続ける能力です。これには、可用性の維持、ダウンタイムの最小化、エラーからの適切な復旧が含まれます。信頼性の高いシステムは、障害が発生することを前提に、それに耐えられるよう設計されています。
可観測性は、システム内部で何が起きているかを理解することに重点を置きます。問題が発生したとき、エンジニアは根本原因を特定するために内部状態や挙動を把握できる必要があります。可観測性がなければ、障害は診断可能な問題ではなく、推測に頼るしかないものになってしまいます。
実際には、システムは継続的なループで動作します。障害が発生し、監視システムが異常な挙動を検知し、エンジニアが利用可能なデータを使って調査します。このプロセスの速度と正確さは、システムの安定性とユーザー体験に直接影響します。
ログ
ログは、システム内で発生するイベントの構造化された記録であり、実行中に何が起きたかを詳細な時系列で示します。
- ログは、リクエスト、クエリ、エラーなどのシステム活動をステップごとに記録します。
- 障害のデバッグやシステムの動作理解に不可欠です。
- 異なる種類のログは、システムのさまざまな部分を可視化します。
詳細
バックエンドシステム内のあらゆるアクションは、ログエントリを生成できます。たとえば、リクエストを受信したとき、ユーザーが認証されたとき、データベースクエリが実行されたとき、またはエラーが発生したときなど、各ステップをログとして記録できます。これらの記録は、エンジニアが分析できるイベントの時系列の軌跡を作ります。
ログは、最も基本的な observability ツールの1つです。システムが失敗したとき、何が問題だったのかを理解するために、エンジニアが最初に確認する場所がログであることがよくあります。ログメッセージを調べることで、エンジニアは障害に至るまでの操作の流れを追跡し、根本原因を特定できます。
一般的なログにはいくつかの種類があります。アプリケーションログは一般的なシステム動作を記録し、エラーログは失敗や例外に特化し、アクセスログは HTTP トラフィックのような受信リクエストを記録します。これらを組み合わせることで、システム活動を包括的に把握できます。
ログがなければ、システムは不透明になります。エンジニアは過去の出来事を信頼できる形で再構築できず、デバッグやインシデント対応が大幅に難しくなります。
メトリクス
メトリクスは、システムのパフォーマンスを数値で測定し、時間の経過に伴う継続的な監視を可能にする指標です。
- メトリクスは、リクエスト率、エラー率、レイテンシーなどの主要なシグナルを追跡します。
- システムの健全性とパフォーマンスをリアルタイムで可視化します。
- 時間の経過に伴う傾向は、異常の検出や潜在的な問題の予測に役立ちます。
詳細
ログが詳細なイベント単位の情報を記録するのに対し、メトリクスは集約された数値データに焦点を当てます。一般的な例としては、1秒あたりのリクエスト数、失敗したリクエストの割合、レスポンスのレイテンシー、CPU使用率などがあります。これらの値は、システムがどのように動作しているかを高レベルで把握するためのものです。
メトリクスは継続的な監視のために設計されています。システムはこれらの測定値を時間とともに収集・保存し、エンジニアが傾向を可視化してパターンを特定できるようにします。たとえば、レイテンシーが徐々に増加している場合は、パフォーマンスのボトルネックが拡大していることを示している可能性があります。一方、エラー率が急激に上昇した場合は、障害を示している可能性があります。
メトリクスは軽量で構造化されているため、ダッシュボードやアラートシステムに最適です。エンジニアは、詳細なログを深く調べなくても、これらを使ってシステムの健全性をすばやく評価できます。
モニタリングとは、これらのメトリクスを収集、保存、分析する実践です。これにより、システムのパフォーマンスに関する継続的な洞察が得られ、問題が重大な障害に発展する前に早期検出できます。
分散トレーシング
分散トレーシングは、1つのリクエストを複数のサービスにまたがって追跡し、実行中に各コンポーネントがどのように相互作用するかを明らかにします。
- トレーシングは、リクエストが複数のサービスを通って進む経路を示します。
- どこでレイテンシーが発生しているか、どのコンポーネントが遅いかを特定します。
- 分散システムにおける障害の正確な原因箇所を突き止めるのに役立ちます。
詳細
現代のバックエンドシステムは、1つのアプリケーションだけで構成されることはほとんどありません。代わりに、相互に通信する複数のサービスで構成されています。1つのユーザーリクエストが、APIサービス、認証サービス、データベースを経由してからレスポンスを返すことがあります。
分散トレーシングは、この一連の流れ全体を記録します。リクエストの各ステップは trace として記録され、各サービスにどれだけ時間がかかったか、そしてそれらがどのようにつながっているかを示します。これにより、システム全体にわたるリクエスト実行の完全なビューが得られます。
トレーシングは、パフォーマンス問題の診断に特に重要です。たとえば、リクエストが遅い場合、トレーシングによって、その遅延が API レイヤー、外部依存先、またはデータベースクエリのどこから来ているのかを明らかにできます。
トレーシングがないと、エンジニアは複雑なシステムで問題がどこで発生しているのかを推測するしかありません。トレーシングがあれば、リクエストの正確な経路をたどり、ボトルネックや障害を正確に特定できます。
アラート
アラートは、システムの動作が事前に定義されたしきい値を超え、対応が必要になったときにエンジニアへ通知する自動化された信号です。
- アラートは、メトリクスが安全または想定された範囲を超えたときに発生します。
- これにより、ダウンタイムや高いエラー率のような問題を迅速に検知できます。
- 適切に設定されていないアラートはノイズを増やし、効果を下げることがあります。
詳細
本番システムでは、エンジニアが常にダッシュボードを手動で監視することはできません。アラートは、メトリクスを継続的に監視し、異常が発生したときに通知を送ることで、この作業を自動化します。たとえば、エラー率の急上昇、サービスの停止、データベースの高レイテンシーなどがアラートの原因になります。
アラートは通常、シンプルな流れで動作します。メトリクスが事前に定義されたしきい値を超えると、システムがアラートを生成し、エンジニアにはメール、メッセージングアプリ、インシデント管理ツールなどのチャネルを通じて通知されます。
効果的なアラートには、慎重な設定が必要です。しきい値が敏感すぎると、エンジニアは大量のアラートを受け取り、重要な信号が無視されるアラート疲れにつながります。しきい値が緩すぎると、重大な問題を見逃す可能性があります。
目標は、実際に対応が必要な本当の問題を示す、実行可能なアラートを設計することです。適切に設計されたアラートは、対応時間を短縮し、システムの信頼性維持に役立ちます。
再試行
再試行は、一時的な障害に対して、すぐに失敗させるのではなく、リクエストを自動的にもう一度試すことで対処します。
- 多くの障害は一時的なもので、再試行で成功することがあります。
- 再試行戦略は、いつ、どのくらいの頻度で再試行するかを制御します。
- 不適切な再試行はシステムに負荷をかけ、障害を悪化させることがあります。
詳細
分散システムでは、障害は短時間で解消されることがよくあります。ネットワークのタイムアウト、一時的に負荷が高いサービス、または短いデータベース障害によって、システム自体は正常に動作していてもリクエストが失敗することがあります。すぐにエラーを返す代わりに、システムはそのリクエストを再試行できます。
再試行はシンプルなパターンです。リクエストが失敗し、システムは短時間待ってから、もう一度そのリクエストを試します。多くの場合、2回目の試行では、根本原因が解消されているため成功します。
一般的な再試行戦略には、試行の間に固定の遅延を入れる方法や、指数バックオフを使う方法があります。指数バックオフでは、失敗するたびに待機時間を長くします。これにより、すでに負荷が高いシステムへの圧力を下げ、再試行を分散できます。
再試行は慎重に使う必要があります。攻撃的な再試行は、障害時の負荷を増幅し、連鎖的な問題を引き起こす可能性があります。適切に設計された再試行ロジックは、回復とシステムの安定性のバランスを取ります。
サーキットブレーカー
サーキットブレーカーは、障害が発生しているサービスへの繰り返しの呼び出しを停止し、小さな問題がシステム全体の障害へと拡大するのを防ぎます。
- 繰り返し発生する失敗を検出し、それ以上のリクエストを一時的に遮断します。
- これにより、障害中のサービスへの負荷を減らし、連鎖的な障害を防ぎます。
- トラフィックは徐々に再開される前に、システムが回復する時間を確保できます。
詳細
分散システムでは、1つの障害が連鎖反応を引き起こすことがあります。サービスがすでに障害状態にあるのにリクエストを受け続けると、過負荷になり、遅延や停止が発生してシステムの他の部分にも広がる可能性があります。
サーキットブレーカーは、失敗率を監視することでこれに対処します。失敗がしきい値を超えると、回路は「開き」、障害中のサービスに送られる代わりに、受信したリクエストはブロックされるか、即座に拒否されます。
クールダウン期間の後、システムは少数のテストリクエストを許可することがあります。それらが成功すれば回路は閉じ、通常のトラフィックが再開されます。失敗が続く場合、回路は開いたままになります。
このパターンは、障害中のコンポーネントへの不要な負荷を防ぎ、システムに回復の時間を与えるため、分散環境で安定性を維持するうえで重要なツールです。
レート制限
レート制限は、クライアントがどのくらいの頻度でリクエストを送れるかを制御し、システムを過負荷や悪用から保護します。
- 一定の時間枠内で、クライアントが送信できるリクエスト数を制限します。
- バックエンドサービスを過剰な負荷や悪意のあるトラフィックから保護します。
- 上限に達すると、リクエストは許可されるか拒否されます。
詳細
バックエンドシステムは、多数のクライアントからのトラフィックを同時に処理しなければなりません。制限がなければ、1つのクライアント、あるいは複数のクライアントが大量のリクエストを送信し、パフォーマンスの低下や障害を引き起こす可能性があります。
レート制限は、リクエスト頻度に境界を設けます。たとえば、あるシステムではユーザーごとに1分あたり100リクエストまで許可するかもしれません。クライアントがこの上限を超えると、追加のリクエストは拒否されるか、次の時間枠まで遅延されます。
この仕組みには複数の目的があります。スパムやサービス拒否攻撃のような悪用を防ぎ、バックエンドリソースが圧倒されるのを防ぎ、ユーザー間で公平な利用を確保します。
レート制限は通常、token buckets や leaky buckets のようなアルゴリズムを使って実装され、時間の経過に伴うリクエストの流れを追跡・制御します。
可観測性ツール
可観測性ツールはシステムデータを収集して可視化し、エンジニアが健全性を監視し、問題をリアルタイムで診断できるようにします。
- ログ、メトリクス、トレースなどのテレメトリデータを収集します。
- ダッシュボードはシステムの動作やパフォーマンスの傾向を可視化します。
- 統合されたアラートにより、問題をすばやく検知して対応できます。
詳細
現代のシステムは、ログ、メトリクス、トレースを含む大量のテレメトリデータを生成します。可観測性ツールはこのデータを集約し、ダッシュボード、クエリ、アラートを通じて利用可能にします。
Prometheus は時系列メトリクスの収集と保存に広く使われており、Grafana はダッシュボードを構築するための強力な可視化機能を提供します。Datadog は、監視、アラート、分散トレーシングを組み合わせた統合プラットフォームを提供します。OpenTelemetry は、システム全体でテレメトリデータを収集するための標準化されたフレームワークを提供します。
これらのツールはパイプラインとして連携します。アプリケーションがテレメトリデータを生成し、それが監視システムによって収集・処理され、その後ダッシュボードで可視化され、アラートのトリガーに使われます。
これらのツールがなければ、エンジニアはシステムの動作をスケーラブルに理解する手段を持てません。可観測性プラットフォームは、生のシステムデータを実用的なインサイトへと変換し、より迅速なデバッグと、より信頼性の高いシステムを実現します。
質問セクション
1 / 5
このレッスンはプレミアムコンテンツです
プレミアムにアップグレードしてぼかしを解除し、全文を読めるようにしましょう。