Slide 1

Slide 1 text

データベースにオブザーバビリティを注入する SRETT #9 株式会社スリーシェイク 中楯 直希

Slide 2

Slide 2 text

\du 2 株式会社スリーシェイク Sreake事業部 業務内容 ● DBRE兼SRE見習い ○ クラウドもオンプレも分からない ○ データベースも分からない ● 自称データ雑用係 ○ DBAでもDBREでもデータエンジニアでも 最近注目しているデータベース ● Tsurugi ● YugabyteDB 中楯 直希 @nnaka2992 @nnaka2992.bsky.social

Slide 3

Slide 3 text

● 対象 ○ データベースエンジニア ○ データベースにもオブザーバビリティを導入したいエンジニア ● 伝えたいこと ○ データベースにおけるオブザーバビリティのメリット ○ データベースへのオブザーバビリティの導入方法 この資料のコンセプト 3

Slide 4

Slide 4 text

● オブザーバビリティとは? ● データベースモニタリングの現状 ● データベースにオブザーバビリティを導入する Agenda 4

Slide 5

Slide 5 text

オブザーバビリティとは? 01

Slide 6

Slide 6 text

オブザーバビリティとは? 6 「オブザーバビリティ」とは、 システムがどのような状態 になったとしても、それがどんなに斬新で奇妙なもので あっても、どれだけ理解し説明できるかを示す尺度で す。 1章 オブザーバビリティとは? より オブザーバビリティ・エンジニアリング https://www.oreilly.co.jp/books/9784814400126/

Slide 7

Slide 7 text

オブザーバビリティとは?: オブザーバビリティの必要性 7 ● 分散システムではログとメトリクスのみでは原因にたどり着けなくなった ● 漸近的デリバリーによりシステムが複数の状態を持つようになった ● ポストモーテムのための証跡として正確で詳細なデータが必要になった ● 運用に参加する人が増えるため誰もがシステムの状態を把握できる必要が発生し た ● 従来の監視では事前に想定したことしか分からなかった

Slide 8

Slide 8 text

オブザーバビリティとは?: オブザーバビリティの3本柱 8 オブザーバビリティでは以下が3つの柱と呼ばれている 1. メトリクス 2. ログ 3. トレース ※ 最近はここにイベント・プロファイル・例外を加えて TEMPLEと言われたりしている TEMPLE: Six Pillars of Observability https://medium.com/@YuriShkuro/temple-six-pillars-of-observability-4ac3e3deb402

Slide 9

Slide 9 text

オブザーバビリティとは?: オブザーバビリティの3本柱 9 メトリクス ● 一定の時間間隔で測定されたデータを数値で表現したもの ● 精度が高く監視に適している ● 詳細は失われるためトラブルシューティングには適さない

Slide 10

Slide 10 text

オブザーバビリティとは?: オブザーバビリティの3本柱 10 メトリクス

Slide 11

Slide 11 text

オブザーバビリティとは?: オブザーバビリティの3本柱 11 ログ ● 時間経過と共に発生するイベントの記録にタイムスタンプをつけたもの ● 集計されたデータでは表面化しないシグナルを示す ● 緊急かつ予測不可能な動作を特定するのに役立つ

Slide 12

Slide 12 text

オブザーバビリティとは?: オブザーバビリティの3本柱 12 ログ

Slide 13

Slide 13 text

オブザーバビリティとは?: オブザーバビリティの3本柱 13 トレース ● 分散トレーシングやリクエストの構造化ログ ● Oracle DatabaseやPostgreSQLなどのトレースとは異なる ● 分散システム間の因果関係を E2Eで表現する ● システム全体を通して理解を深めるのに役立つ

Slide 14

Slide 14 text

オブザーバビリティとは?: オブザーバビリティの3本柱 14 トレース

Slide 15

Slide 15 text

オブザーバビリティとは?: オブザーバビリティの3本柱 15 昨今では OpenTelemetry という標準化された実装を利用して メトリクス・ログ・トレース (= Telemetry) を収集し、出力することが デファクトになっている ※ 2024/3/29時点で11言語が対応(開発中の機能あり) OpenTelemetry https://opentelemetry.io/

Slide 16

Slide 16 text

メトリクス・ログ・トレースは重要なものの、収集するだけでは オブザーバビリティがある状態にはならない これらの指標を単一のツールに統合して横断的に確認出来る必要がある オブザーバビリティとは?: オブザーバビリティの3本柱 16 Google Cloud Operations

Slide 17

Slide 17 text

今回は以下のように言葉を使い分けます ● オブザーバビリティ (可観測性) ○ サービスやコンポーネントをまたいで監視ができる監視手法 ○ サービスやコンポーネントをまたいで監視ができている状態 ● 監視・モニタリング ○ サービス・コンポーネント単位などで監視が独立している監視手法 ○ サービス・コンポーネント単位で監視画面やツールが分離している状態 オブザーバビリティとは?: 言葉の使い分け 17

Slide 18

Slide 18 text

● モニタリングは問題が発生したとき通知する仕組み ○ 既知の障害の未知な状態 (= 既知の未知) に対処するために最適化されている ● オブザーバビリティはアプリケーションの振る舞いを理解する取り組み ○ これまで認識されていない障害 (= 未知の未知) に発見するために最適化されている オブザーバビリティとは?: モニタリングとの使い分け 18 どちらかだけではなく適切に組み合わせて使うことが重要

Slide 19

Slide 19 text

データベースモニタリングの現状 02

Slide 20

Slide 20 text

データベースモニタリングの現状 : データベースの監視項目 20 データベースの監視では大きく分けて5つの監視項目がある 1. 性能障害の監視 2. エラー障害の監視 3. 可用性障害の監視 4. セキュリティ障害の監視 5. データ障害の監視 何から始めるべき?どこまでやるべき?予防保守と運用設計のススメ https://www.oracle.com/webfolder/technetwork/jp/ondemand/yobohoshu/yobohoshu-no2.pdf

Slide 21

Slide 21 text

データベースモニタリングの現状 : データベースの監視項目 21 データベースの監視では大きく分けて5つの監視項目がある 1. 性能障害の監視 2. エラー障害の監視 3. 可用性障害の監視 4. セキュリティ障害の監視 5. データ障害の監視 下に近づくほどオブザーバビリティの 文脈から遠ざかる ※ 既知の未知に近づく

Slide 22

Slide 22 text

データベースモニタリングの現状 : データベースの監視項目 22 データベースの監視では大きく分けて5つの監視項目がある 1. 性能障害の監視 2. エラー障害の監視 3. 可用性障害の監視 4. セキュリティ障害の監視 5. データ障害の監視 今回は性能障害とエラー障害を中心に データベースのオブザーバビリティを考えていく

Slide 23

Slide 23 text

データベースモニタリングの現状 : データベースの監視項目 23 性能障害の監視 ● 問い合わせや索引の再構築のスローダウンを監視する ● 例 ○ 問い合わせ応答速度の低下 ○ データベースバックアップ処理時間の増加 ○ テーブル・インデックス再構築時間の増加

Slide 24

Slide 24 text

データベースモニタリングの現状 : データベースの監視項目 24 エラー障害の監視 ● データベース内で発生するシステムエラーを監視する ● 例 ○ 表領域やディスク容量の不足による問い合わせの失敗 ○ メモリやコネクション数などのリソース枯渇 ○ INSERT・UPDATE時の制約違反などアプリケーションによる 誤った問い合わせ

Slide 25

Slide 25 text

データベースモニタリングの現状 : 典型的なデータベース監視の手法 25 従来の典型的なデータベース監視は以下のような方法で行われることが多い 1. データベースサーバの異常を検知する a. CPU使用率やメモリ使用率といったメトリクスが閾値を超える b. エラー発生数が閾値を超える

Slide 26

Slide 26 text

データベースモニタリングの現状 : 典型的なデータベース監視の手法 26 従来の典型的なデータベース監視は以下のような方法で行われることが多い 1. データベースサーバの異常を検知する a. CPU使用率やメモリ使用率といったメトリクスが閾値を超える b. エラー発生数が閾値を超える 2. スロークエリログを検知 a. 発行されたクエリの実行時間が閾値を超える アプリケーションの影響が大きい部分はリリースによって新規の問題が発生し やすい

Slide 27

Slide 27 text

データベースモニタリングの現状 : 典型的なデータベース監視の手法 27 従来の典型的なデータベース監視は以下のような方法で行われることが多い 1. データベースサーバの異常を検知する a. CPU使用率やメモリ使用率といったメトリクスが閾値を超える b. エラー発生数が閾値を超える 2. スロークエリログを検知 a. 発行されたクエリの実行時間が閾値を超える ● DBとアプリケーションが分離していることで問題のクエリを発行した場所 が特定しずらく、問題解消が長引く ● アプリケーション実装によってはスロークエリログだけでは 顕在化しない場合がある ○ N+1 や複数回のクエリ実行など オブザーバビリティエンジニアリングの技術で解決できる!!!

Slide 28

Slide 28 text

データベースにオブザーバビリティを導入する 03

Slide 29

Slide 29 text

データベースにオブザーバビリティを導入する : 何を計測すべきか? 29 オブザーバビリティの3本柱はほとんど収集できている ● メトリクス ● ログ ● トレース

Slide 30

Slide 30 text

データベースにオブザーバビリティを導入する : 何を計測すべきか? 30 オブザーバビリティの3本柱はほとんど収集できている ● メトリクス ● ログ ● トレース

Slide 31

Slide 31 text

データベースにオブザーバビリティを導入する : 何を計測すべきか? 31 オブザーバビリティの3本柱はほとんど収集できている ● メトリクス ● ログ ● トレース

Slide 32

Slide 32 text

データベースにオブザーバビリティを導入する : 何を計測すべきか? 32 オブザーバビリティの3本柱はほとんど収集できている あとはそれぞれの指標をアプリケーションと統合して 見られるようにすれば良い

Slide 33

Slide 33 text

データベースにオブザーバビリティを導入する : 計装方法 33 データベースとアプリケーションを接続する方法 ● アプリケーションから発行するクエリにトレース情報を組み込む ○ クエリにコメントとして付与することで達成が可能 ? OpenTelmetry では SQL への トレース差し込みがサポートされ ていない OpenTelemetry (アプリケーション) データベース

Slide 34

Slide 34 text

データベースにオブザーバビリティを導入する : 計装ツール 34 トレース情報をSQLに組み込むツールでデファクトは今の所ない ● 言語に依存しないもの ○ sqlcommenter ■ Go, Python, Php, Ruby, Node.js, Java に対応 ○ Uptrace ■ Go, Python に対応 ● トレース組み込みをサポートしている ORM ○ Node.js: Prisma ○ Go: GORM ● その他 ○ 手動でSQLにコメントを付与する仕組みを作成する

Slide 35

Slide 35 text

以下の構成でデータベースの計装を試してみる データベースにオブザーバビリティを導入する : デモ 35 API Endpoint Cloud Run ORM SQLCommenter Cloud Operation Cloud Trace Cloud Logging Cloud SQL OpenTelemetry ORMに トレース情報を伝搬 トレース情報を伝搬 トレース情報を付与した SQLを実行 SQLの結果を送信 トレース情報付きの SQLログを保存 SQLログを参照 トレースを送信 HTTP Request HTTP Response Client

Slide 36

Slide 36 text

データベースにオブザーバビリティを導入する : デモ 36 アプリケーションにOpenTelemetryを導入した状態のトレース ※ 丁寧にトレースを実装すれば SQLの実行時間がどれぐらいか   程度はSQL自動計装ツールなしでも可能

Slide 37

Slide 37 text

データベースにオブザーバビリティを導入する : デモ 37 SQLへのトレース埋め込みを行うように変更を加える import ( "database/sql" _ "github.com/jackc/pgx/v4/stdlib" ) func NewDB(connStr string) (*sql.DB, error) { db, err := sql.Open("pgx", connStr) 〜後略〜

Slide 38

Slide 38 text

データベースにオブザーバビリティを導入する : デモ 38 SQLへのトレース埋め込みを行うように変更を加える import ( "database/sql" _ "github.com/jackc/pgx/v4/stdlib" gosql "github.com/google/sqlcommenter/go/database/sql" sqlcommentercore "github.com/google/sqlcommenter/go/core" ) func NewDB(connStr string) (*sql.DB, error) { db, err := gosql.Open("pgx", connStr, sqlcommentercore.CommenterOptions{ Config: sqlcommentercore.CommenterConfig{}, }, ) 〜後略〜

Slide 39

Slide 39 text

データベースにオブザーバビリティを導入する : デモ 39 SQLにもトレース情報を導入した状態のトレース

Slide 40

Slide 40 text

まとめ 04

Slide 41

Slide 41 text

まとめ 41 ● オブザーバビリティをデータベースにまで広げることでより広域なアプリケーションの 振る舞いを理解できる ○ データベースエンジニアがアプリケーションを理解でき、アプリケーションエンジニアが問題のあるク エリを認識できるようになる ● 従来のモニタリングも重要 ○ オブザーバビリティエンジニアの手法で未知の未知を発見することでモニタリングで扱いやすい既知 の未知になる ● コードを数行追加するだけでSQLも計装出来る

Slide 42

Slide 42 text

42 参考資料 42 ● オブザーバビリティ・エンジニアリング ○ https://www.oreilly.co.jp/books/9784814400126/ ● Distributed Systems Observability ○ https://learning.oreilly.com/library/view/distributed-systems-observability/9781492033431/ ● 入門 監視 ○ https://www.oreilly.co.jp/books/9784873118642/ ● TEMPLE: Six Pillars of Observability ○ https://medium.com/@YuriShkuro/temple-six-pillars-of-observability-4ac3e3deb402 ● オブザーバビリティとは?監視との違い、必要性について解説 ○ https://newrelic.com/jp/blog/best-practices/what-is-observability-difference-from-monitoring ● 何から始めるべき?どこまでやるべき?予防保守と運用設計のススメ ○ https://www.oracle.com/webfolder/technetwork/jp/ondemand/yobohoshu/yobohoshu-no2.pdf

Slide 43

Slide 43 text

43 参考資料 43 ● データベースのオブザーバビリティについて | Cloud SQL for PostgreSQL ○ https://cloud.google.com/sql/docs/postgres/observability?hl=ja ● Cloud SQL におけるデータベース オブザーバビリティの決定版ガイド : パート 1 ○ https://cloud.google.com/blog/ja/products/databases/guide-to-the-database-observability-with-cloud-sql ● Sqlcommenter のご紹介: オープンソース ORM の自動インストルメンテーション ライブラリ ○ https://cloud.google.com/blog/ja/products/databases/introducing-sqlcommenter-open-source-orm-auto-instrumentation-li brary ● オブザーバビリティ(可観測性)がなぜ必要だと考えるのか ○ https://ymotongpoo.hatenablog.com/entry/2019/03/25/084500 ● オブザーバビリティについて理解する (収集・分析・可視化) ○ https://sreake.com/blog/observability/

Slide 44

Slide 44 text

44 参考資料 44 ● OpenTelemetry ○ https://opentelemetry.io/ ● sqlcommenter ○ https://google.github.io/sqlcommenter/ ● uptrace ○ https://uptrace.dev/ ● go-gorm/opentelemetry ○ https://github.com/go-gorm/opentelemetry ● OpenTelemetry tracing (Preview) | Prisma Docs ○ https://www.prisma.io/docs/orm/prisma-client/observability-and-logging/opentelemetry-tracing