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

著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにFree and Open Source Fundを選択しました。

前書き

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

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

このチュートリアルでは、PostgreSQL statistics collectorによって生成されたデータベースメトリックをLogstashを介してElasticsearchにインポートします。 これには、PostgreSQL JDBC connectorを使用してデータベースからデータをプルし、直後にインデックスを作成するためにElasticsearchに送信するようにLogstashを構成する必要があります。 インポートされたデータは、後で分析し、Kibanaで視覚化できます。 次に、データベースが新しい場合は、PostgreSQLベンチマークツールであるpgbenchを使用して、より興味深い視覚化を作成します。 最終的に、後の分析のためにPostgreSQL統計を取り込む自動システムができます。

前提条件

  • 少なくとも4 GBのRAM、ルート権限、およびセカンダリの非ルートアカウントを持つUbuntu 18.04サーバー。 これは、this initial server setup guideに従って設定できます。 このチュートリアルでは、root以外のユーザーはsammyです。

  • サーバーにインストールされたJava 8。 インストール手順については、How To Install Java with apt on Ubuntu 18.04にアクセスしてください。

  • サーバーにインストールされたNginx。 これを行う方法のガイドについては、How To Install Nginx on Ubuntu 18.04を参照してください。

  • サーバーにインストールされているElasticsearchとKibana。 How To Install Elasticsearch, Logstash, and Kibana (Elastic Stack) on Ubuntu 18.04チュートリアルの最初の2つのステップを完了します。

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

[[step-1 -—- setting-up-logstash-and-the-postgresql-jdbc-driver]] ==ステップ1—LogstashとPostgreSQLJDBCドライバーのセットアップ

このセクションでは、Logstashをインストールし、PostgreSQL JDBC driverをダウンロードして、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ライブラリのdownload pageに移動し、リンクを最新バージョンにコピーします。 次に、次のコマンドを実行して、curlを使用してダウンロードします。

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

執筆時点では、ライブラリの最新バージョンは42.2.6であり、サポートされているランタイムバージョンとしてJava8が使用されていました。 必ず最新バージョンをダウンロードしてください。 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から統計データを取得するように構成します。

[[step-2 -—- configuring-logstash-to-pull-statistics]] ==ステップ2—統計をプルするためのLogstashの構成

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

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

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

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

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

ElasticsearchのPostgreSQL統計にインデックスを付けるための構成を/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://host:port/defaultdb"
                jdbc_user => "username"
                jdbc_password => "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://host:port/defaultdb"
                jdbc_user => "username"
                jdbc_password => "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://host:port/defaultdb"
                jdbc_user => "username"
                jdbc_password => "password"
                statement => "SELECT * FROM pg_stat_user_indexes"
                schedule => "* * * * *"
                type => "pg_stat_user_indexes"
        }
}

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

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

この構成では、3つのJDBC入力と1つのElasticsearch出力を定義します。 3つの入力は、それぞれpg_stat_databasepg_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がこの入力を実行するタイミングを定義するcron構文の文字列を受け入れます。完全に省略すると、Logstashは1回だけ実行します。 ここで行ったように* * * * *を指定すると、Logstashに毎分実行するように指示されます。 異なる間隔でデータを収集する場合は、独自のcron文字列を指定できます。

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

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

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

[[step-3 -—- testing-the-logstash-configuration]] ==ステップ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
] 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=>"#"} [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つのデータベースから行が正常に「選択」されたことをログに記録した場合、データベースメトリックはElasticsearchに送信されます。 エラーが発生した場合は、構成ファイルのすべての値を再確認して、Logstashを実行しているマシンが管理対象データベースに接続できることを確認してください。

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

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

sudo systemctl start logstash

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

[[step-4 -—- exploring-imported-data-in-kibana]] ==ステップ4—Kibanaでインポートされたデータを探索する

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

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

Kibana - Default Welcome Page

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

Kibana - Add Index Pattern

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

Kibana - Index Pattern Timestamp Field

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

Kibana - Empty Visualisation

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

ここで、データタプルの平均数INSERT+`ed on minutes in the given interval. Press on *Y-Axis* under *Metrics* in the panel on the left to unfold it. Select _Average_ as the *Aggregation* and select `+tup_insertedFieldとして視覚化します。 これにより、プロットのY軸に平均値が入力されます。

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

Kibanaは、他の多くの視覚化フォームをサポートしています。Kibana documentationで他のフォームを探索できます。 また、手順2で説明した残りの2つのインデックスをKibanaに追加して、それらを視覚化することもできます。

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

[[step-5 -—- optional-benchmarking-using-pgbench]] ==ステップ5—(オプション)pgbenchを使用したベンチマーク

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

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

sudo apt install postgresql-contrib -y

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

Accessing Databases section in DO control panel

実際にpgbenchを実行する前に、-iフラグを指定して実行し、データベースを初期化する必要があります。

pgbench -h host -p port -U username -i pgbench

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

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 host -p port -U username pgbench -T 30

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

Outputstarting vacuum...end.
transaction type: 
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に移動し、右上隅にあるRefreshを押します。 これで、以前とは異なる行が表示され、 `INSERT`の数が示されます。 更新ボタンの上にあるピッカーの値を変更することにより、表示されるデータの時間範囲を自由に変更できます。 以下は、さまざまな期間の複数のベンチマークの後にグラフがどのように見えるかです。

Kibana - Visualization After Benchmarks

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

結論

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

PostgreSQLマネージドデータベースでできることの詳細については、product docsにアクセスしてください。

Related