Ubuntu 18.04でElastic Stackを使用して管理されたPostgreSQLデータベースの統計を分析する方法

著者はhttps://www.brightfunds.org/funds/foss-nonprofits [無料およびオープンソース基金]を選択して、https://do.co/w4do-cta [Donationsのために書く]の一部として寄付を受け取りましたプログラム。

前書き

データベース監視は、データベースのパフォーマンスを示すさまざまなメトリックを体系的に追跡する継続的なプロセスです。 パフォーマンスデータを観察することにより、貴重な洞察を得て、考えられるボトルネックを特定し、データベースのパフォーマンスを向上させる追加の方法を見つけることができます。 そのようなシステムは、多くの場合、アラートが実装され、問題が発生したときに管理者に通知します。 収集された統計を使用して、データベースの構成とワークフローだけでなく、クライアントアプリケーションの構成とワークフローも改善できます。

管理対象データベースの監視にhttps://www.elastic.co/products/elastic-stack[Elastic Stack](ELKスタック)を使用する利点は、検索に対する優れたサポートと、新しいデータを非常に迅速に取り込む機能です。 データの更新には優れていませんが、このトレードオフは、過去のデータがほとんど変更されない監視およびログ記録の目的には受け入れられます。 Elasticsearchは、データを照会する強力な手段を提供します。これは、https://www.elastic.co/products/kibana [Kibana]から使用して、理解を深めることができます。データベースが異なる期間をどのように処理するかについて。 これにより、データベースの負荷を実際のイベントと関連付けて、データベースの使用方法に関する洞察を得ることができます。

このチュートリアルでは、https://www.postgresql.org/docs/9.6/monitoring-stats.html [PostgreSQL統計コレクター]によって生成されたデータベースメトリックをhttps://www.elasticを介してElasticsearchにインポートします。 co / products / logstash [Logstash]。 これには、https://jdbc.postgresql.org/ [PostgreSQL JDBCコネクター]を使用してデータベースからデータをプルするようにLogstashを構成し、すぐにインデックスを作成するためにElasticsearchに送信する必要があります。 インポートされたデータは、後で分析し、Kibanaで視覚化できます。 次に、データベースがまったく新しい場合、https://www.postgresql.org/docs/11/pgbench.html [pgbench](PostgreSQLベンチマークツール)を使用して、より興味深い視覚化を作成します。 最終的に、後の分析のためにPostgreSQL統計を取り込む自動システムができます。

前提条件

  • 少なくとも4 GBのRAM、ルート権限、およびセカンダリの非ルートアカウントを持つUbuntu 18.04サーバー。 これは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [この初期サーバー設定ガイド]に従って設定できます。 このチュートリアルでは、非ルートユーザーは「++」です。

  • サーバーにインストールされたJava 8。 インストール手順については、https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04#installing-specific-versions-of-openjdk [How Ubuntu 18.04に `+ apt +`でJavaをインストールするには。

  • サーバーにインストールされたNginx。 その方法のガイドについては、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04 [Ubuntu 18.04にNginxをインストールする方法]を参照してください。

  • サーバーにインストールされているElasticsearchとKibana。 https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elastic-stack-on-ubuntu-18-04 [インストール方法]の最初の2つのステップを完了します。 Elasticsearch、Logstash、およびUbuntu 18.04上のKibana(Elastic Stack)]チュートリアル。

  • DigitalOceanからプロビジョニング情報が提供されるPostgreSQL管理データベース。 サーバーのIPアドレスがホワイトリストに登録されていることを確認してください。 DigitalOcean Managed Databasesの詳細については、https://www.digitalocean.com/docs/databases/overview/ [product docs]にアクセスしてください。

ステップ1-LogstashとPostgreSQL JDBCドライバーのセットアップ

このセクションでは、Logstashをインストールし、https://jdbc.postgresql.org/index.html [PostgreSQL JDBCドライバー]をダウンロードして、Logstashが管理対象データベースに接続できるようにします。

次のコマンドでLogstashをインストールすることから始めます。

sudo apt install logstash -y

Logstashをインストールしたら、ブート時にサービスが自動的に開始されるようにします。

sudo systemctl enable logstash

LogstashはJavaで記述されているため、PostgreSQLに接続するには、実行中のシステムでPostgreSQL JDBC(Java Database Connectivity)ライブラリが利用可能である必要があります。 内部制限のため、Logstashは、使用するサードパーティライブラリを保存する `+ / usr / share / logstash / logstash-core / lib / jars +`ディレクトリの下にある場合にのみ、ライブラリを適切にロードします。

JDBCライブラリーのhttps://jdbc.postgresql.org/download.html#current [ダウンロードページ]に移動し、リンクを最新バージョンにコピーします。 次に、次のコマンドを実行して、 `+ curl +`を使用してダウンロードします。

sudo curl https://jdbc.postgresql.org/download/postgresql-.jar -o /usr/share/logstash/logstash-core/lib/jars/postgresql-jdbc.jar

執筆時点では、ライブラリの最新バージョンは `++`で、サポートされているランタイムバージョンはJava 8でした。 必ず最新バージョンをダウンロードしてください。 JDBCとLogstashの両方がサポートする正しいJavaバージョンとペアリングします。

Logstashは設定ファイルを `+ / etc / logstash / conf.d `に保存し、それ自体は ` / usr / share / logstash / bin +`に保存されます。 データベースから統計を取得する構成を作成する前に、次のコマンドを実行してLogstashでJDBCプラグインを有効にする必要があります。

sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-jdbc

`+ apt +`を使用してLogstashをインストールし、PostgreSQL JDBCライブラリをダウンロードして、Logstashがそれを使用して管理対象データベースに接続できるようにしました。 次の手順では、Logstashから統計データを取得するように構成します。

ステップ2-統計をプルするためのLogstashの構成

このセクションでは、管理対象のPostgreSQLデータベースからメトリックをプルするようにLogstashを構成します。

Logstashを設定して、PostgreSQLの3つのシステムデータベースを監視します。

  • + pg_stat_database +:名前、接続数、トランザクション、ロールバック、データベースのクエリによって返された行、デッドロックなどを含む各データベースに関する統計を提供します。 統計が最後にリセットされたときを指定する「+ stats_reset +」フィールドがあります。

  • + pg_stat_user_tables +:挿入、削除、更新された行の数など、ユーザーが作成した各テーブルに関する統計情報を提供します。

  • + pg_stat_user_indexes +:特定のインデックスがスキャンされた回数など、ユーザーが作成したテーブル内のすべてのインデックスに関するデータを収集します。

PostgreSQL統計をインデックス化するための設定を、Elasticsearchの `+ / etc / logstash / conf.d `ディレクトリの下の ` postgresql.conf +`というファイルに保存します。Logstashは設定ファイルを保存します。 サービスとして開始されると、バックグラウンドで自動的に実行されます。

お気に入りのエディター(たとえば、nano)を使用して `+ postgresql.conf +`を作成します。

sudo nano /etc/logstash/conf.d/postgresql.conf

次の行を追加します。

/etc/logstash/conf.d/postgresql.conf

input {
       # pg_stat_database
       jdbc {
               jdbc_driver_library => ""
               jdbc_driver_class => "org.postgresql.Driver"
               jdbc_connection_string => "jdbc:postgresql://:/defaultdb"
               jdbc_user => ""
               jdbc_password => ""
               statement => "SELECT * FROM pg_stat_database"
               schedule => "* * * * *"
               type => "pg_stat_database"
       }

       # pg_stat_user_tables
       jdbc {
               jdbc_driver_library => ""
               jdbc_driver_class => "org.postgresql.Driver"
               jdbc_connection_string => "jdbc:postgresql://:/defaultdb"
               jdbc_user => ""
               jdbc_password => ""
               statement => "SELECT * FROM pg_stat_user_tables"
               schedule => "* * * * *"
               type => "pg_stat_user_tables"
       }

       # pg_stat_user_indexes
       jdbc {
               jdbc_driver_library => ""
               jdbc_driver_class => "org.postgresql.Driver"
               jdbc_connection_string => "jdbc:postgresql://:/defaultdb"
               jdbc_user => ""
               jdbc_password => ""
               statement => "SELECT * FROM pg_stat_user_indexes"
               schedule => "* * * * *"
               type => "pg_stat_user_indexes"
       }
}

output {
       elasticsearch {
               hosts => "http://localhost:9200"
               index => "%{type}"
       }
}

``をホストアドレスに、 ``をデータベースに接続できるポートに、 ``をデータベースユーザーのユーザー名に、 ``をパスワードに置き換えてください。 これらの値はすべて、管理対象データベースのコントロールパネルにあります。

この構成では、3つのJDBC入力と1つのElasticsearch出力を定義します。 3つの入力は、それぞれ + pg_stat_database ++ pg_stat_user_tables +、および `+ pg_stat_user_indexes `データベースからデータを取得します。 PostgreSQL JDBCライブラリはLogstashが自動的にロードするフォルダー内にあるため、これらはすべて ` jdbc_driver_library +`パラメーターを空の文字列に設定します。

次に、値がJDBCライブラリに固有の `+ jdbc_driver_class `を設定し、データベースへの接続方法の詳細を示す ` jdbc_connection_string `を提供します。 ` jdbc:`の部分はJDBC接続であることを示し、 ` postgres:// `はターゲットデータベースがPostgreSQLであることを示します。 次に、データベースのホストとポートを入力し、スラッシュの後に接続するデータベースも指定します。これは、PostgreSQLがクエリを発行できるようにデータベースに接続する必要があるためです。 ここでは、常に存在し削除できないデフォルトのデータベースに設定されており、適切に「 defaultdb +」と名付けられています。

次に、データベースへのアクセスに使用するユーザーのユーザー名とパスワードを設定します。 `+ statement`パラメータには、処理するデータを返すSQLクエリが含まれています。この設定では、適切なデータベースからすべての行を選択します。

`+ schedule `パラメータは、Logstashがこの入力を実行するタイミングを定義するhttps://en.wikipedia.org/wiki/Cron[cron]構文の文字列を受け入れます。完全に省略すると、Logstashは一度だけ実行します。 ここで行ったように、「 * * * * * +」を指定すると、Logstashに毎分実行するように指示されます。 異なる間隔でデータを収集する場合は、独自のcron文字列を指定できます。

3つの入力からデータを受け入れる出力は1つだけです。 それらはすべて、ローカルで実行され、 `+ http:// localhost:9200 `で到達可能なElasticsearchにデータを送信します。 ` index `パラメーターは、どのElasticsearchインデックスにデータを送信するかを定義し、その値は入力の ` type +`フィールドから渡されます。

編集が完了したら、ファイルを保存して閉じます。

Logstashを設定して、さまざまなPostgreSQL統計テーブルからデータを収集し、それらをストレージとインデックス作成のためにElasticsearchに送信します。 次に、Logstashを実行して構成をテストします。

ステップ3-Logstash構成のテスト

このセクションでは、Logstashを実行して構成をテストし、データが適切にプルされることを確認します。 次に、Logstashパイプラインとして構成することにより、この構成をバックグラウンドで実行します。

Logstashは、ファイルパスを `+ -f +`パラメーターに渡すことにより、特定の構成の実行をサポートします。 次のコマンドを実行して、最後の手順の新しい構成をテストします。

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/postgresql.conf

出力が表示されるまでに時間がかかる場合があります。これは次のようになります。

OutputThread.exclusive is deprecated, use Thread::Mutex
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[WARN ] 2019-08-02 18:29:15.123 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified
[INFO ] 2019-08-02 18:29:15.154 [LogStash::Runner] runner - Starting Logstash {"logstash.version"=>"7.3.0"}
[INFO ] 2019-08-02 18:29:18.209 [Converge PipelineAction::Create<main>] Reflections - Reflections took 77 ms to scan 1 urls, producing 19 keys and 39 values
[INFO ] 2019-08-02 18:29:20.195 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
[WARN ] 2019-08-02 18:29:20.667 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"}
[INFO ] 2019-08-02 18:29:21.221 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>7}
[WARN ] 2019-08-02 18:29:21.230 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[INFO ] 2019-08-02 18:29:21.274 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]}
[INFO ] 2019-08-02 18:29:21.337 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
[WARN ] 2019-08-02 18:29:21.369 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"}
[INFO ] 2019-08-02 18:29:21.386 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>7}
[WARN ] 2019-08-02 18:29:21.386 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[INFO ] 2019-08-02 18:29:21.409 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]}
[INFO ] 2019-08-02 18:29:21.430 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
[WARN ] 2019-08-02 18:29:21.444 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"}
[INFO ] 2019-08-02 18:29:21.465 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>7}
[WARN ] 2019-08-02 18:29:21.466 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[INFO ] 2019-08-02 18:29:21.468 [Ruby-0-Thread-7: :1] elasticsearch - Using default mapping template
[INFO ] 2019-08-02 18:29:21.538 [Ruby-0-Thread-5: :1] elasticsearch - Using default mapping template
[INFO ] 2019-08-02 18:29:21.545 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]}
[INFO ] 2019-08-02 18:29:21.589 [Ruby-0-Thread-9: :1] elasticsearch - Using default mapping template
[INFO ] 2019-08-02 18:29:21.696 [Ruby-0-Thread-5: :1] elasticsearch - Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[INFO ] 2019-08-02 18:29:21.769 [Ruby-0-Thread-7: :1] elasticsearch - Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[INFO ] 2019-08-02 18:29:21.771 [Ruby-0-Thread-9: :1] elasticsearch - Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[WARN ] 2019-08-02 18:29:21.871 [[main]-pipeline-manager] LazyDelegatingGauge - A gauge metric of an unknown type (org.jruby.specialized.RubyArrayOneObject) has been create for key: cluster_uuids. This may result in invalid serialization.  It is recommended to log an issue to the responsible developer/development team.
[INFO ] 2019-08-02 18:29:21.878 [[main]-pipeline-manager] javapipeline - Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>125, :thread=>"#<Thread:0x470bf1ca run>"}
[INFO ] 2019-08-02 18:29:22.351 [[main]-pipeline-manager] javapipeline - Pipeline started {"pipeline.id"=>"main"}
[INFO ] 2019-08-02 18:29:22.721 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2019-08-02 18:29:23.798 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/cronline.rb:77: warning: constant ::Fixnum is deprecated
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/cronline.rb:77: warning: constant ::Fixnum is deprecated
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/cronline.rb:77: warning: constant ::Fixnum is deprecated
[INFO ] 2019-08-02 18:30:02.333 [Ruby-0-Thread-22: /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/jobs.rb:284] jdbc - (0.042932s) SELECT * FROM pg_stat_user_indexes
[INFO ] 2019-08-02 18:30:02.340 [Ruby-0-Thread-23: /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/jobs.rb:331] jdbc - (0.043178s) SELECT * FROM pg_stat_user_tables
[INFO ] 2019-08-02 18:30:02.340 [Ruby-0-Thread-24: :1] jdbc - (0.036469s) SELECT * FROM pg_stat_database
...

Logstashでエラーが表示されず、3つのデータベースから行が正常に「+ SELECT +」されたログがある場合、データベースメトリックスはElasticsearchに送信されます。 エラーが発生した場合は、構成ファイルのすべての値を再確認して、Logstashを実行しているマシンが管理対象データベースに接続できることを確認してください。

Logstashは、指定された時間にデータのインポートを継続します。 `+ CTRL + C +`を押すことで安全に停止できます。

前述のように、Logstashはサービスとして起動すると、バックグラウンドで `+ / etc / logstash / conf.d +`の下にあるすべての設定ファイルを自動的に実行します。 次のコマンドを実行して、サービスとして開始します。

sudo systemctl start logstash

この手順では、Logstashを実行して、データベースに接続してデータを収集できるかどうかを確認しました。 次に、Kibanaの統計データの一部を視覚化して調査します。

ステップ4-Kibanaでインポートされたデータを調べる

このセクションでは、Kibanaでのデータベースのパフォーマンスを説明する統計データを探索する方法について説明します。

ブラウザで、前提条件として設定したKibanaインストールに移動します。 デフォルトのウェルカムページが表示されます。

image:https://assets.digitalocean.com/articles/postgres_managed_elk/step4a.png [Kibana-デフォルトのウェルカムページ]

KibanaでElasticsearchインデックスを操作するには、インデックスパターンを作成する必要があります。 _インデックスパターン_は、Kibanaが動作するインデックスを指定します。 作成するには、左側の垂直サイドバーの最後のアイコン(レンチ)を押して、[管理]ページを開きます。 次に、左側のメニューから、* Kibana の下にある Index Patterns *を押します。 インデックスパターンを作成するためのダイアログボックスが表示されます。

image:https://assets.digitalocean.com/articles/postgres_managed_elk/step4b.png [Kibana-インデックスパターンの追加]

Logstashが統計を送信している3つのインデックスをリストします。 * Index Pattern *入力ボックスに「+ pg_stat_database 」と入力し、* Next step *を押します。 時間を保存するフィールドを選択するように求められるので、後で時間範囲でデータを絞り込むことができます。 ドロップダウンから、「 @ timestamp +」を選択します。

image:https://assets.digitalocean.com/articles/postgres_managed_elk/step4c.png [Kibana-インデックスパターンタイムスタンプフィールド]

[インデックスパターンの作成]を押して、インデックスパターンの作成を終了します。 これで、Kibanaを使用して探索できるようになります。 ビジュアライゼーションを作成するには、サイドバーの2番目のアイコンを押し、次に*新しいビジュアライゼーションを作成*を押します。 フォームがポップアップしたら* Line *ビジュアライゼーションを選択し、作成したインデックスパターン( + pg_stat_database +)を選択します。 空の視覚化が表示されます。

画像:https://assets.digitalocean.com/articles/postgres_managed_elk/step4d.png [Kibana-Empty Visualisation]

画面の中央部分には結果のプロットがあります。左側のパネルが生成を管理し、そこからX軸とY軸のデータを設定できます。 画面の右上には、日付範囲ピッカーがあります。 データを構成するときに別の範囲を特に選択しない限り、その範囲はプロットに表示されます。

これで、指定された間隔で分単位で「+ INSERT 」されたデータタプルの平均数を視覚化できます。 左側のパネルの* Metrics *の下にある* Y-Axis *を押して展開します。 * Aggregation *として_Average_を選択し、* Field *として ` tup_inserted +`を選択します。 これにより、プロットのY軸に平均値が入力されます。

次に、* Buckets の下の X-Axis を押します。 * Aggregation *には、 Date Histogram を選択します。 `+ @ timestamp +`が Field *として自動的に選択されるはずです。 次に、パネルの上部にある青い再生ボタンを押して、グラフを生成します。 データベースが新品で使用されていない場合、まだ何も表示されません。 ただし、すべての場合において、データベースの使用状況が正確に描写されます。

Kibanaは他の多くの視覚化フォームをサポートしています。https://www.elastic.co/guide/en/kibana/current/tutorial-visualizing.html [Kibana documentation]で他のフォームを探索できます。 また、手順2で説明した残りの2つのインデックスをKibanaに追加して、それらを視覚化することもできます。

このステップでは、Kibanaを使用して、PostgreSQLの統計データの一部を視覚化する方法を学習しました。

ステップ5-(オプション)pgbenchを使用したベンチマーク

このチュートリアル以外でデータベースをまだ使用していない場合は、pgbenchを使用してデータベースのベンチマークを行うことにより、このステップを完了してより興味深い視覚化を作成できます。 pgbenchは同じSQLコマンドを繰り返し実行し、実際のクライアントによる実際のデータベースの使用をシミュレートします。

最初に次のコマンドを実行してpgbenchをインストールする必要があります。

sudo apt install postgresql-contrib -y

pgbenchはテストデータを挿入および更新するため、個別のデータベースを作成する必要があります。 これを行うには、管理対象データベースのコントロールパネルの[ユーザーとデータベース]タブに移動し、[データベース]セクションまでスクロールします。 新しいデータベースの名前として「+ pgbench +」と入力し、[保存]をクリックします。 この名前と、ホスト、ポート、ユーザー名の情報をpgbenchに渡します。

image:https://assets.digitalocean.com/articles/postgres_managed_elk/step5a.png [DOコントロールパネルの[データベースへのアクセス]セクション]

実際に `+ pgbench `を実行する前に、データベースを初期化するために ` -i +`フラグを付けて実行する必要があります。

pgbench -h  -p  -U  -i pgbench

``をホストアドレスに、 ``をデータベースに接続できるポートに、 `++`をデータベースユーザーのユーザー名に置き換える必要があります。 これらすべての値は、管理対象データベースのコントロールパネルで確認できます。

`+ pgbench +`にはパスワード引数がないことに注意してください。代わりに、実行するたびに要求されます。

出力は次のようになります。

OutputNOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 100000 tuples (100%) done (elapsed 0.16 s, remaining 0.00 s)
vacuum...
set primary keys...
done.

`+ pgbench +`は、ベンチマークに使用する4つのテーブルを作成し、それらにいくつかのサンプル行を追加しました。 これで、ベンチマークを実行できるようになります。

ベンチマークの実行時間を制限する2つの最も重要な引数は、完了するトランザクションの数を指定する「+ -t 」と、ベンチマークを実行する秒数を定義する「 -T 」です。 これら2つのオプションは相互に排他的です。 各ベンチマークの最後に、1秒あたりのトランザクション数( ` tps +`)などの統計が表示されます。

次のコマンドを実行して、30秒間続くベンチマークを開始します。

pgbench -h  -p  -U  pgbench

出力は以下のようになります。

Outputstarting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 30 s
number of transactions actually processed: 7602
latency average = 3.947 ms
tps = 253.382298 (including connections establishing)
tps = 253.535257 (excluding connections establishing)

この出力には、実行されたトランザクションの総数など、ベンチマークに関する一般的な情報が表示されます。 これらのベンチマークの効果は、LogstashがElasticsearchに出荷する統計にその数が反映されることです。これにより、Kibanaでの視覚化がより面白くなり、実世界のグラフにより近くなります。 上記のコマンドをさらに数回実行し、場合によっては期間を変更できます。

完了したら、Kibanaに移動し、右上隅の[更新]を押します。 これで以前とは異なる行が表示され、 `+ INSERT +`の数が表示されます。 更新ボタンの上にあるピッカーの値を変更することにより、表示されるデータの時間範囲を自由に変更できます。 以下は、さまざまな期間の複数のベンチマークの後にグラフがどのように見えるかです。

image:https://assets.digitalocean.com/articles/postgres_managed_elk/step5b.png [Kibana-ベンチマーク後の視覚化]

データベースのベンチマークにpgbenchを使用し、結果のグラフをKibanaで評価しました。

結論

これで、Elasticスタックがサーバーにインストールされ、管理対象のPostgreSQLデータベースから定期的に統計データをプルするように設定されました。 Kibanaまたはその他の適切なソフトウェアを使用してデータを分析および視覚化できます。これにより、データベースのパフォーマンスに関する貴重な洞察と現実の相関を収集できます。

PostgreSQL Managed Databaseでできることの詳細については、https://www.digitalocean.com/docs/databases/ [product docs]にアクセスしてください。

Related