Skip to content

Database

データベースセンサー


📚 情報ソース

このドキュメントは以下の情報源を基に作成されています:

主要ソース

補足ソース

  • 各データベース公式ドキュメント: 接続設定とメトリクス情報
  • 実運用環境の設定例: 本番環境でのHA構成とVault統合パターン

このセクションでは、各種データベースの監視設定を解説します。データベース監視では、パフォーマンスメトリクス、クエリ統計、接続情報などを収集します。

Snowflake

📚 公式ドキュメント: Snowflake

com.instana.plugin.snowflake:
  enabled: true
  account: 'xy12345.us-east-1'
  url: 'https://xy12345.us-east-1.snowflakecomputing.com'
  user: 'monitoring_user'
  password: 'secure_password'
  role: 'ACCOUNTADMIN'
  warehouse: 'COMPUTE_WH'
  poll_rate: 3600  # 秒単位(デフォルト3600秒=1時間)
  collectOrganizationData: true
  org_poll_rate: 43200  # 組織データ収集間隔(12時間)
  availabilityZone: 'Snowflake Production'

設定項目の説明: - account: Snowflakeアカウント識別子 - url: SnowflakeアカウントURL - role: 使用するロール(ACCOUNTADMIN推奨) - warehouse: クエリ実行用ウェアハウス - collectOrganizationData: 組織レベルのデータ収集 - org_poll_rate: 組織データの収集間隔

設定値の取得方法:

項目 取得方法
account Snowflakeコンソール > Account > Account Identifier
url https://<account_identifier>.snowflakecomputing.com
user/password Snowflakeで監視用ユーザーを作成
role SHOW ROLES;で確認(ACCOUNTADMIN推奨)
warehouse SHOW WAREHOUSES;で確認

Oracle Database (リモート監視)

📚 公式ドキュメント: Oracle Database (リモート監視)

1
2
3
4
5
6
7
8
com.instana.plugin.oracledb:
  remote:
    - host: 'oracle-server.example.com'
      port: '1521'
      databaseSID: 'ORCL'
      user: 'sys as sysdba'
      password: 'oracle_password'
      poll_rate: 1

DB2

📚 公式ドキュメント: DB2

com.instana.plugin.db2:
  local:
    - instance: 'db2inst1'
      port: '50000'
      user: 'db2inst1'
      password: 'db2_password'
      poll_rate: 5
      databases:
        - 'database1'
        - 'database2'

設定値の取得方法: - instance: DB2インスタンス名(db2ilistコマンドで確認) - port: DB2ポート番号(デフォルト50000、db2 get dbm cfg | grep SVCENAMEで確認) - user/password: 下記のSQLで監視用ユーザーを作成 - databases: 監視対象データベース名(db2 list db directoryで確認)

監視ユーザーの作成:

1
2
3
4
5
6
7
8
-- DB2で実行
CREATE USER monitoring_user IDENTIFIED BY db2_password;
GRANT CONNECT ON DATABASE TO USER monitoring_user;
GRANT DATAACCESS ON DATABASE TO USER monitoring_user;
GRANT DBADM ON DATABASE TO USER monitoring_user;
-- または最小権限で
GRANT CONNECT ON DATABASE TO USER monitoring_user;
GRANT SELECT ON SYSIBMADM.* TO USER monitoring_user;

DB2 for z/OS

📚 公式ドキュメント: DB2 for z/OS

com.instana.plugin.db2z:
  remote:
    - host: '192.168.1.100'  # z/OSシステムのIPアドレス
      port: '5040'  # DDF(Distributed Data Facility)ポート
      availabilityZone: 'DB2Z Remote Monitoring'
      poll_rate: 60  # 秒単位
      locations:
        - name: 'LOCATION1'  # DB2ロケーション名
          user: 'DB2ADMIN'  # z/OSユーザーID
          password: 'password'
        - name: 'LOCATION2'
          user: 'DB2ADMIN'
          password: 'password'

設定値の取得方法: - host: z/OSシステムのIPアドレスまたはホスト名 - port: DDFポート番号(z/OS管理者に確認、通常5040または446) - locations.name: DB2ロケーション名(-DIS DDFコマンドで確認) - user/password: RACF/ACF2/Top Secretで定義されたz/OSユーザー - 必要な権限: SYSADM、SYSOPR、またはMONITOR権限

AWS RDS / Aurora

📚 公式ドキュメント: MySQL | PostgreSQL

💡 注意: AWS RDS/Auroraには2つの監視方法があります: 1. CloudWatch経由cloud.md参照)- メトリクス収集のみ 2. 直接DB接続(本セクション)- 詳細なクエリ監視、スロークエリ、接続数など

MySQL/Aurora MySQL:

1
2
3
4
5
6
7
8
9
com.instana.plugin.mysql:
  remote:
    - host: 'mydb.abc123.us-east-1.rds.amazonaws.com'
      port: '3306'
      user: 'monitoring_user'
      password: 'secure_password'
      database: 'mysql'  # システムデータベース
      poll_rate: 5
      availabilityZone: 'AWS RDS MySQL Production'

PostgreSQL/Aurora PostgreSQL:

1
2
3
4
5
6
7
8
9
com.instana.plugin.postgresql:
  remote:
    - host: 'mydb.abc123.us-east-1.rds.amazonaws.com'
      port: '5432'
      user: 'monitoring_user'
      password: 'secure_password'
      database: 'postgres'  # システムデータベース
      poll_rate: 5
      availabilityZone: 'AWS RDS PostgreSQL Production'

設定値の取得方法:

項目 取得方法
host AWS Console > RDS > データベース > エンドポイント
port AWS Console > RDS > データベース > ポート(MySQL: 3306, PostgreSQL: 5432)
user/password RDSで作成した監視用ユーザー(下記参照)
database システムデータベース(MySQL: mysql, PostgreSQL: postgres

監視ユーザーの作成:

MySQL/Aurora MySQL:

1
2
3
4
5
-- RDSマスターユーザーで実行
CREATE USER 'monitoring_user'@'%' IDENTIFIED BY 'secure_password';
GRANT SELECT, PROCESS, REPLICATION CLIENT ON *.* TO 'monitoring_user'@'%';
GRANT SELECT ON performance_schema.* TO 'monitoring_user'@'%';
FLUSH PRIVILEGES;

PostgreSQL/Aurora PostgreSQL:

1
2
3
4
-- RDSマスターユーザーで実行
CREATE USER monitoring_user WITH PASSWORD 'secure_password';
GRANT pg_monitor TO monitoring_user;
GRANT SELECT ON pg_stat_database TO monitoring_user;

セキュリティグループ設定: - Instana AgentのセキュリティグループからRDSへのインバウンドルールを追加 - ポート: MySQL(3306), PostgreSQL(5432)

ベストプラクティス: - パスワードはsecrets.mdのVault統合を使用 - 読み取りレプリカがある場合は、レプリカも監視対象に追加 - poll_rateは負荷に応じて調整(本番環境では5-10秒推奨)



実践的な使用例

シナリオ1: 本番環境でのMySQL監視(Vault統合)

本番環境では、Vaultを使用してデータベース認証情報を安全に管理します。

# Vault統合を使用したMySQL監視
com.instana.plugin.mysql:
  host: 'mysql-primary.prod.example.com'
  port: 3306
  database: 'production_db'
  user:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/mysql/production'
        key: 'username'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/mysql/production'
        key: 'password'
  poll_rate: 5  # 5秒ごとに監視
  availabilityZone: 'MySQL Production Primary'
  tags:
    - 'production'
    - 'primary'
    - 'critical'

監視ユーザーの作成(最小権限):

1
2
3
4
5
6
-- MySQLで実行
CREATE USER 'instana_monitor'@'%' IDENTIFIED BY 'secure_password';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'instana_monitor'@'%';
GRANT SELECT ON performance_schema.* TO 'instana_monitor'@'%';
GRANT SELECT ON mysql.* TO 'instana_monitor'@'%';
FLUSH PRIVILEGES;

シナリオ2: PostgreSQL高可用性構成の監視

プライマリとレプリカの両方を監視する設定:

# プライマリデータベース
com.instana.plugin.postgresql:
  host: 'postgres-primary.prod.example.com'
  port: 5432
  database: 'production'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/postgresql/primary'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'PostgreSQL Primary'
  tags:
    - 'production'
    - 'primary'
    - 'postgres'

# レプリカ1
com.instana.plugin.postgresql:
  host: 'postgres-replica1.prod.example.com'
  port: 5432
  database: 'production'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/postgresql/replica'
        key: 'password'
  poll_rate: 10  # レプリカは監視頻度を下げる
  availabilityZone: 'PostgreSQL Replica 1'
  tags:
    - 'production'
    - 'replica'
    - 'postgres'

PostgreSQL監視ユーザーの作成:

1
2
3
4
5
-- PostgreSQLで実行
CREATE USER instana_monitor WITH PASSWORD 'secure_password';
GRANT pg_monitor TO instana_monitor;
GRANT CONNECT ON DATABASE production TO instana_monitor;
GRANT USAGE ON SCHEMA public TO instana_monitor;

シナリオ3: マルチデータベース環境の監視

複数のデータベースを一元管理する設定:

# MySQL - アプリケーションDB
com.instana.plugin.mysql:
  host: 'mysql.prod.example.com'
  port: 3306
  database: 'app_db'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/mysql/app'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'MySQL Application DB'

# PostgreSQL - 分析DB
com.instana.plugin.postgresql:
  host: 'postgres.prod.example.com'
  port: 5432
  database: 'analytics_db'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/postgresql/analytics'
        key: 'password'
  poll_rate: 10
  availabilityZone: 'PostgreSQL Analytics DB'

# MongoDB - ログDB
com.instana.plugin.mongodb:
  hosts:
    - 'mongo1.prod.example.com:27017'
    - 'mongo2.prod.example.com:27017'
    - 'mongo3.prod.example.com:27017'
  database: 'logs_db'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/mongodb/logs'
        key: 'password'
  poll_rate: 10
  availabilityZone: 'MongoDB Logs DB'

# Redis - キャッシュ
com.instana.plugin.redis:
  host: 'redis.prod.example.com'
  port: 6379
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/redis/cache'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'Redis Cache'

シナリオ4: Kubernetes環境でのデータベース監視

StatefulSetで動作するデータベースの監視:

# Kubernetes内のPostgreSQL監視
com.instana.plugin.postgresql:
  host: 'postgres-0.postgres-headless.database.svc.cluster.local'
  port: 5432
  database: 'app_db'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/k8s/database/postgres'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'Kubernetes PostgreSQL'
  tags:
    - 'kubernetes'
    - 'statefulset'
    - 'postgres'

シナリオ5: クラウドマネージドデータベースの監視

AWS RDS、Azure Database、Google Cloud SQLの監視:

# AWS RDS MySQL
com.instana.plugin.mysql:
  host: 'mydb.abc123.us-east-1.rds.amazonaws.com'
  port: 3306
  database: 'production'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/aws/rds/mysql'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'AWS RDS MySQL us-east-1'
  tags:
    - 'aws'
    - 'rds'
    - 'managed'

# Azure Database for PostgreSQL
com.instana.plugin.postgresql:
  host: 'myserver.postgres.database.azure.com'
  port: 5432
  database: 'production'
  user: 'instana_monitor@myserver'  # Azure形式
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/azure/postgres'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'Azure PostgreSQL'
  tags:
    - 'azure'
    - 'managed'

# Google Cloud SQL
com.instana.plugin.mysql:
  host: '10.0.0.3'  # プライベートIP
  port: 3306
  database: 'production'
  user: 'instana_monitor'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/gcp/cloudsql/mysql'
        key: 'password'
  poll_rate: 5
  availabilityZone: 'GCP Cloud SQL'
  tags:
    - 'gcp'
    - 'cloudsql'
    - 'managed'

パフォーマンスチューニング

ポーリング間隔の最適化

データベースの負荷とモニタリング要件に応じて、ポーリング間隔を調整します。

# 高負荷環境 - ポーリング間隔を長くする
com.instana.plugin.mysql:
  poll_rate: 10  # 10秒(デフォルトは1秒)

# 低負荷環境 - より頻繁に監視
com.instana.plugin.mysql:
  poll_rate: 1   # 1秒

# 分析用DB - 監視頻度を下げる
com.instana.plugin.postgresql:
  poll_rate: 30  # 30秒

推奨設定:

データベースタイプ 本番環境 開発環境 分析DB
MySQL/PostgreSQL 5秒 10秒 30秒
MongoDB 5秒 10秒 30秒
Redis 5秒 10秒 15秒
Oracle 10秒 30秒 60秒
DB2 10秒 30秒 60秒

接続プールの設定

データベース接続数を最適化:

1
2
3
4
5
6
7
8
# MySQL - 接続プール設定
com.instana.plugin.mysql:
  host: 'mysql.example.com'
  port: 3306
  # 接続タイムアウト(ミリ秒)
  connection_timeout: 5000
  # 最大接続数(Instana Agent側では制御しない)
  # データベース側で設定: max_connections = 200

データベース側の設定例(MySQL):

1
2
3
4
5
6
-- my.cnf
[mysqld]
max_connections = 200
max_user_connections = 50
wait_timeout = 28800
interactive_timeout = 28800

クエリパフォーマンスの監視

スロークエリの監視設定:

1
2
3
4
5
6
7
# MySQL - スロークエリログの有効化
# my.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2  # 2秒以上のクエリをログ
log_queries_not_using_indexes = 1
1
2
3
4
5
# PostgreSQL - スロークエリログの有効化
# postgresql.conf
log_min_duration_statement = 2000  # 2秒以上のクエリをログ
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_statement = 'all'

メモリ使用量の最適化

1
2
3
4
5
6
7
# MySQL - メモリ設定
# my.cnf
[mysqld]
innodb_buffer_pool_size = 8G  # 物理メモリの70-80%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
1
2
3
4
5
6
# PostgreSQL - メモリ設定
# postgresql.conf
shared_buffers = 2GB  # 物理メモリの25%
effective_cache_size = 6GB  # 物理メモリの50-75%
work_mem = 64MB
maintenance_work_mem = 512MB

トラブルシューティング

問題1: データベースへの接続エラー

症状:

ERROR: Failed to connect to database: Connection refused

原因と解決策:

  1. データベースが起動していない

    1
    2
    3
    4
    5
    6
    7
    # MySQL
    sudo systemctl status mysql
    sudo systemctl start mysql
    
    # PostgreSQL
    sudo systemctl status postgresql
    sudo systemctl start postgresql
    

  2. ファイアウォールでポートがブロックされている

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # ポート確認
    telnet mysql.example.com 3306
    
    # ファイアウォール設定(CentOS/RHEL)
    sudo firewall-cmd --add-port=3306/tcp --permanent
    sudo firewall-cmd --reload
    
    # ファイアウォール設定(Ubuntu)
    sudo ufw allow 3306/tcp
    

  3. データベースがリモート接続を許可していない

    -- MySQL: bind-addressの確認
    -- my.cnf
    bind-address = 0.0.0.0  # すべてのIPから接続許可
    
    -- PostgreSQL: listen_addressesの確認
    -- postgresql.conf
    listen_addresses = '*'
    
    -- pg_hba.conf
    host    all    all    0.0.0.0/0    md5
    

問題2: 認証エラー

症状:

ERROR: Access denied for user 'instana_monitor'@'host' (using password: YES)

解決策:

  1. ユーザー名とパスワードの確認

    1
    2
    3
    4
    5
    # Vaultから取得した値を確認
    vault kv get secret/database/mysql/production
    
    # 直接接続テスト
    mysql -h mysql.example.com -u instana_monitor -p
    

  2. ユーザーの権限確認

    1
    2
    3
    4
    5
    6
    -- MySQL
    SHOW GRANTS FOR 'instana_monitor'@'%';
    
    -- PostgreSQL
    \du instana_monitor
    SELECT * FROM pg_roles WHERE rolname = 'instana_monitor';
    

  3. ホストベースの認証

    1
    2
    3
    -- MySQL: 特定のホストからのみ接続許可
    CREATE USER 'instana_monitor'@'instana-agent-host' IDENTIFIED BY 'password';
    GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'instana_monitor'@'instana-agent-host';
    

問題3: パフォーマンスの問題

症状: データベースの応答が遅い、CPU使用率が高い

解決策:

  1. ポーリング間隔を調整

    com.instana.plugin.mysql:
      poll_rate: 10  # 1秒から10秒に変更
    

  2. 不要なメトリクスの無効化

    1
    2
    3
    4
    # 特定のデータベースのみ監視
    com.instana.plugin.mysql:
      databases:
        - 'production_db'  # 他のDBは監視しない
    

  3. インデックスの最適化

    1
    2
    3
    4
    5
    -- MySQL: スロークエリの分析
    SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;
    
    -- インデックスの追加
    CREATE INDEX idx_user_email ON users(email);
    

問題4: メトリクスが収集されない

症状: Instanaダッシュボードにデータが表示されない

解決策:

  1. Agentログの確認

    1
    2
    3
    4
    5
    # Agentログの確認
    sudo journalctl -u instana-agent -f | grep -i mysql
    
    # ログファイルの確認
    tail -f /opt/instana/agent/data/log/agent.log
    

  2. 設定ファイルの構文チェック

    # YAML構文チェック
    yamllint /opt/instana/agent/etc/instana/configuration.yaml
    

  3. Agentの再起動

    1
    2
    3
    4
    sudo systemctl restart instana-agent
    
    # 起動確認
    sudo systemctl status instana-agent
    

問題5: Vault統合の問題

症状:

ERROR: Failed to retrieve secret from Vault

解決策:

  1. Vault接続の確認

    # Vault接続テスト
    curl -k https://vault.example.com:8200/v1/sys/health
    

  2. シークレットパスの確認

    # シークレットの存在確認
    vault kv get secret/database/mysql/production
    

  3. Vault認証の確認

    1
    2
    3
    4
    5
    # トークンの有効性確認
    vault token lookup
    
    # AppRoleの確認
    vault read auth/approle/role/instana-agent/role-id
    

問題6: レプリケーション遅延の監視

症状: レプリカの遅延が検出されない

解決策:

1
2
3
4
5
6
# MySQL - レプリケーション監視
com.instana.plugin.mysql:
  host: 'mysql-replica.example.com'
  port: 3306
  # レプリケーション状態を監視
  poll_rate: 5
1
2
3
4
5
-- MySQL: レプリケーション状態の確認
SHOW SLAVE STATUS\G

-- PostgreSQL: レプリケーション状態の確認
SELECT * FROM pg_stat_replication;

ベストプラクティス

1. セキュリティ

  • ✅ 常にVaultを使用してパスワードを管理
  • ✅ 最小権限の原則に従う
  • ✅ 監視用ユーザーには読み取り専用権限のみ付与
  • ✅ SSL/TLS接続を使用
  • ✅ 定期的にパスワードをローテーション

2. パフォーマンス

  • ✅ 本番環境では poll_rate を 5-10秒に設定
  • ✅ 不要なデータベースは監視対象から除外
  • ✅ 接続プールを適切に設定
  • ✅ スロークエリログを有効化

3. 高可用性

  • ✅ プライマリとレプリカの両方を監視
  • ✅ フェイルオーバー時の自動切り替えを考慮
  • ✅ 複数のAvailability Zoneを使用
  • ✅ タグを使用して環境を識別

4. 運用

  • ✅ 環境ごとに設定ファイルを分離
  • ✅ タグを使用してデータベースを分類
  • ✅ アラート閾値を適切に設定
  • ✅ 定期的にログを確認

よくある質問(FAQ)

Q1: 複数のデータベースインスタンスを監視できますか?

A: はい、configuration.yamlに複数の設定ブロックを追加することで、複数のデータベースを監視できます。

Q2: データベースのパスワード変更時の対応は?

A: Vaultを使用している場合、Vaultのシークレットを更新するだけで、Instana Agentが自動的に新しいパスワードを取得します。

Q3: クラウドマネージドデータベース(RDS、Azure Database等)も監視できますか?

A: はい、ネットワーク接続が可能であれば、クラウドマネージドデータベースも監視できます。

Q4: データベース監視がアプリケーションのパフォーマンスに影響しますか?

A: 適切に設定すれば、影響は最小限です。poll_rateを調整し、必要なメトリクスのみ収集することを推奨します。

Q5: レプリケーション遅延はどのように監視されますか?

A: Instanaは自動的にレプリケーション状態を監視し、遅延が発生した場合にアラートを発行します。


参考リンク