データベース可視化ツール DBmarlin を触ってみた

はじめに

従来の APM ツールはアプリケーション全体のパフォーマンス監視に優れているが、データベース特有の挙動やパフォーマンス、クエリ実行の詳細な影響分析といった、より細かな情報を提供する点では限界がある。

実際のシステム運用において、DB の状態やパフォーマンスが全体のシステムに大きな影響を与えるため、その詳細なモニタリングは非常に重要である。

ネット上で調べてもあまり日本語記事が見つからなかったため、ある一定のニーズはあるのはないかということで雑に記事にしてみた。

DBmarlin の概要

DBmarlin は、データベースのパフォーマンスや動作状況をリアルタイムで監視するためのツールである。従来の APM ツールと比べ、特に以下の点で優れている。

  • 詳細なパフォーマンス計測: クエリの実行時間、リソース使用量、ロック状況など、データベース固有のメトリクスを詳細に収集・表示する。
  • リアルタイムな可視化: リアルタイムのデータストリームを解析し、問題の早期発見やパフォーマンス低下の原因を迅速に特定する。
  • 軽量な設計: システムへの負荷を最小限に抑えながら、必要な情報を効率的に取得する設計が特徴である。

より詳細な特徴などについては公式を参照いただければと思う。

Home
Get FREE AI driven database observability. Database performance and change monitoring with DBmarlin. Monitor MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, CockroachDB, IBM DB2, Informix, SAP HANA and SAP ASE easily.
Home favicon www.dbmarlin.com
Home

DBmarlin を実際にローカルで立ててみる

以下の公式 GitHub を参考にして DBmarlin を実際にローカルで立てた。

GitHub - DBmarlin/dbmarlin-docker: DBmarlin agent running in Docker container
DBmarlin agent running in Docker container. Contribute to DBmarlin/dbmarlin-docker development by creating an account on GitHub.
GitHub - DBmarlin/dbmarlin-docker: DBmarlin agent running in Docker container favicon github.com
GitHub - DBmarlin/dbmarlin-docker: DBmarlin agent running in Docker container

まずは、リポジトリをクローンし、設定ファイルを微調整した。

$ git clone git@github.com:DBmarlin/dbmarlin-docker.git

$ cd dbmarlin-docker

$ vim docker/docker-compose.yml
docker-compose.yml
services:
  dbmarlin-server:
    image: dbmarlin/dbmarlin-server:latest
    container_name: dbmarlin-server
    platform: linux/amd64
    ports:
      - "9080:9080"
      - "9090:9090"
  dbmarlin-agent:
    image: dbmarlin/dbmarlin-agent:latest
    container_name: dbmarlin-agent
    platform: linux/amd64
    environment:
      DBMARLIN_AGENT_NAME: local-agent
      DBMARLIN_ARCHIVER_URL: http://dbmarlin-server:9090/archiver
      DBMARLIN_API_KEY:
    depends_on:
      - dbmarlin-server

  demo-db:
    image: postgres:16
    container_name: demo-postgres
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 10

次に、以下のコマンドを実行してコンテナを起動する。

$ docker compose up -d

これで docker-compose.yml に定義された以下のコンテナが起動する。

  • dbmarlin-server
    • DBmarlin サーバーとして、モニタリングと UI ダッシュボードを提供する
  • dbmarlin-agent
    • サーバーとの連携を担うエージェントとして動作する
  • demo-db
    • PostgreSQL を搭載したデモ用データベースコンテナ

正常に全てのコンテナが起動できていれば、ブラウザで localhost:9090 にアクセスすると DBmarlin のダッシュボードが確認できるはずだ。

なお、デモ用の PostgreSQL をデータベースインスタンスとして登録するとモニタリングができるようになる。docker compose でコンテナ間通信されているため、ホスト名にコンテナ名を指定することで通信ができるはず。(スクショなどがあった方がいいかも、、、)

PostgreSQL に実際に負荷をかけてみる

DBmarlin 側で PostgreSQL のモニタリング設定ができた上で、実際にデータベースに負荷をかけてみる。

負荷をかけるには、demo-postgres コンテナに入って作業した。

$ docker exec -it demo-postgres bash

まずは、SQL ファイルを作成する。

$ echo "CREATE TABLE test(id SERIAL PRIMARY KEY, name TEXT);
INSERT INTO test(name) VALUES ('Alice'), ('Bob'), ('Charlie');
SELECT * FROM test;
" > sql/create-data.sql

$ psql -h localhost -U postgres -d postgres -f sql/create-data.sql

その後、pgbench コマンドで負荷をかけた。

$ pgbench -h localhost -p 5432 -U postgres -d postgres -i
$ pgbench -h localhost -p 5432 -U postgres -d postgres -c 10 -t 100

数分待つと DBmarlin のダッシュボード上で異常な数値が計測できているはずだ。

おまけ)APM との連携

DBmarlin は APM ツールである Instana との連携が可能である。Instana と連携させることで、アプリケーションおよびデータベースのパフォーマンスを統合的に監視でき、異常検知やトラブルシューティングが迅速に行える。

IBM Instana Observability
Harness the power of AI and automation to proactively solve issues across the application stack with IBM Instana Observability.
IBM Instana Observability favicon www.instana.com
IBM Instana Observability

下記の YouTube 動画が非常に参考となった。

Integrating IBM Instana with DBmarlin for Database Insights
Short demo showing the integration from IBM Instana to DBmarlin for deeper database visibility. See how to enable the integration and then walk-through the c...
Integrating IBM Instana with DBmarlin for Database Insights favicon youtu.be
Integrating IBM Instana with DBmarlin for Database Insights

Instana との連携については本記事では触れないが、次回以降の記事で詳しく解説する予定である。

まとめ

本記事では、DBmarlin を用いて Docker 環境下での PostgreSQL を監視するチュートリアルをやってみた。

日本語記事がまだまだ少ないと思うので、興味がある人はぜひ参考にして欲しい。

参考

達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践
こちらの書籍は 2022/08/26 紙版の2刷に対応するため更新をおこないました。 (概要) LINE株式会社が主催するWebサービスのパフォーマンスチューニングコンテスト、ISUCON(Iikanjini Speed Up Contest)で技術を競い合ってきた著者がWebサービス高速化のための考え方とノウハウをわかりやすく解説。 本書では、お題となるWebサービスをひとつ用意して、手を動かしながら高速化手法を学んでいきます。Webサービスがどのくらいの負荷に耐えられるか、どのくらいの負荷で不具合が起こるかを検証し、不具合が起こる原因を突き止め、改善していきます。また、負荷に対応する方法だけでなく、負荷を発生させる方法(ベンチマーカーの作成方法)も紹介します。 本書を読んで、Webサービス高速化について理解を深め、性能を向上させましょう。 (こんな方におすすめ) ・Webサービス・アプリケーションの動作が重くて困っている方 ・ISUCONに出場してみたい方 ・ISUCONに出場したことはあるが、良い成績を収められなかった方 (目次) Chapter 1 チューニングの基礎知識   1-1 “高速であること”は現代のWebサービスの必須要件   1-2 高速なWebサービスとは   1-3 Webサービスの負荷   1-4 必要十分なキャパシティを用意するには   1-5 パフォーマンスチューニング“きほんのき”   1-6 パフォーマンスチューニング“きほんのほ”   1-7 パフォーマンスチューニング“きほんのん”   1-8 まとめ Chapter 2 モニタリング   2-1 モニタリングとは - インフラにおけるテスト   2-2 モニタリングに対する考え方   2-3 モニタリングの種類   2-4 手動でのモニタリング   2-5 モニタリングツール   2-6 モニタリングツールのアーキテクチャ   2-7 実際にモニタリングを行う   2-8 モニタリングの注意点   2-9 ログに対するモニタリング   2-10 まとめ Chapter 3 基礎的な負荷試験   3-1 本書で扱うWeb サービス private-isu   3-2 負荷試験の準備   3-3 ベンチマーカーによる負荷試験の実行   3-4 パフォーマンスチューニング 最初の一歩   3-5 ベンチマーカーの並列度   3-6 まとめ Chapter 4 シナリオを持った負荷試験   4-1 負荷試験ツールk6   4-2 k6による単純な負荷試験   4-3 k6でシナリオを記述する   4-4 複数のシナリオを組み合わせた統合シナリオを実行する   4-5 負荷試験で得られたアクセスログを解析する   4-6 まとめ Chapter 5 データベースのチューニング   5-1 データベースの種類と選択   5-2 データベースの負荷を測る   5-3 インデックスでデータベースを速くする   5-4 N+1とは   5-5 データベースとリソースを効率的に利用する   5-6 まとめ Chapter 6 リバースプロキシの利用   6-1 アプリケーションとプロセス・スレッド   6-2 リバースプロキシを利用するメリット   6-3 nginxとは   6-4 nginxのアーキテクチャ   6-5 nginxによる転送時のデータ圧縮   6-6 nginxによるリクエスト・レスポンスのバッファリング   6-7 nginxとアップストリームサーバーのコネクション管理   6-8 nginx のTLS通信を高速にする   6-9 まとめ Chapter 7 キャッシュの活用   7-1 キャッシュデータ保存に利用されるミドルウェア   7-2 キャッシュをKVSに保存する際の注意点   7-3 いつキャッシュを利用するか   7-4 具体的なキャッシュ実装方法   7-5 キャッシュを監視する   7-6 まとめ Chapter 8 押さえておきたい高速化手法   8-1 外部コマンド実行ではなく、ライブラリを利用する   8-2 開発用の設定で冗長なログを出力しない   8-3 HTTPクライアントの使い方   8-4 静的ファイル配信をリバースプロキシから直接配信する   8-5 HTTPヘッダーを活用してクライアント側にキャッシュさせる   8-6 CDN上にHTTPレスポンスをキャッシュする   8-7 まとめ Chapter 9 OSの基礎知識とチューニング   9-1 流れを見極める   9-2 Linux Kernelの基礎知識   9-3 Linux のプロセス管理   9-4 Linuxのネットワーク   9-5 LinuxのディスクI/O   9-6 CPU利用率   9-7 Linuxにおける効率的なシステム設定   9-8 Linuxカーネルパラメータ   9-9 MTU(Maximum Transmission Unit)   9-10 まとめ 付録 A private-isuの攻略実践   A-1 用意した競技用環境   A-2 ベンチマーカーの実行方法   A-3 各章の技法を適用する   A-4 まとめ 付録 B ベンチマーカーの実装   B-1 ISUCONのベンチマーカーは何をするのか   B-2 ベンチマーカーに頻出する実装パターン   B-3 private-isuを対象としたベンチマーカーの実装   B-4 まとめ 続きを読む
達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践  favicon amazon.co.jp
達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践
詳説 データベース ―ストレージエンジンと分散データシステムの仕組み
データベースを選択し、使用し、管理するには、その内部構造を理解することが不可欠です。しかし、今日ではたくさんの分散型データベースやツールが存在するため、それぞれが何を提供しているのか、どのように異なるのかを理解することは困難です。 本書はデータベースとストレージエンジンの内部で利用されている概念を解説します。ストレージエンジンでは、ストレージの分類、Bツリーベースのストレージエンジンとイミュータブルなログ構造化ストレージエンジンの違いと事例を紹介します。ストレージの構成要素については、ページキャッシュ、バッファプール、ログ先行書き込みなどの補助的なデータ構造を使って、効率的なストレージを構築するためのデータベースファイルの構成を説明します。分散型システムでは、ノードとプロセスがどのように接続され、複雑な通信パターンを構築するのかを段階的に学びます。 データベースそれぞれで大きな違いがあるストレージエンジンの内部構造や、データの分散方法を決定するサブシステムについて詳述する本書は、データべースシステムを使ってソフトウェアを構築するすべての人に必携の一冊です。
詳説 データベース ―ストレージエンジンと分散データシステムの仕組み  favicon amazon.co.jp
詳説 データベース ―ストレージエンジンと分散データシステムの仕組み
SQL実践入門 ──高速でわかりやすいクエリの書き方 WEB+DB PRESS plus
本電子書籍は2015年4月11日初版発行のものを、後日電子化し、発売したものです。 (概要) SQLはデータベース操作に特化した言語で,柔軟にデータを操作できます。ただし,独自のロジックに基づいているため,それを正しく理解しなければ,読みづらくパフォーマンスの出ないSQLになってしまいます。本書では,「条件分岐」「集約」「ループ」「結合」「更新」など日常的に実行する処理の良い書き方・悪い書き方を解説します。その際,データベース内部でどう処理が実行されているかを示す実行計画を読み解くことで,「なぜそう書くと効率が良いのか」「可読性や保守性が向上するのか」を実感を持って理解することを目指します。 (こんな方にオススメ) ・データベースに触れる機会の多いWebアプリケーションエンジニア ・データベースエンジニア (目次) 第1章 DBMSのアーキテクチャ──この世にただ飯はあるか 第2章 SQLの基礎──母国語を話すがごとく 第3章 SQLにおける条件分岐──文から式へ 第4章 集約とカット──集合の世界 第5章 ループ──手続き型の呪縛 第6章 結合──結合を制する者はSQLを制す 第7章 サブクエリ──困難は分割するべきか 第8章 SQLにおける順序──甦る手続き型 第9章 更新とデータモデル──盲目のスーパーソルジャー 第10章 インデックスを使いこなす──秀才の弱点 Appendix A:PostgreSQLのインストールと起動 Appendix B:演習問題の解答 続きを読む
SQL実践入門 ──高速でわかりやすいクエリの書き方 WEB+DB PRESS plus  favicon amazon.co.jp
SQL実践入門 ──高速でわかりやすいクエリの書き方 WEB+DB PRESS plus