Ubuntu18.04でNagiosCoreを使用してマネージドPostgreSQLデータベースを監視する方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
データベースの監視は、データベースが時間の経過とともにどのように機能するかを理解するための鍵です。 これは、データベースで発生している隠れた使用上の問題やボトルネックを明らかにするのに役立ちます。 データベース監視システムの実装は、すぐに長期的な利点になる可能性があり、インフラストラクチャ管理プロセスにプラスの影響を与えます。 データベースのステータス変更に迅速に対応でき、監視対象のサービスが通常の機能に戻ったときにすぐに通知されます。
Nagios Core は、管理対象データベースの監視に使用できる一般的な監視システムです。 このタスクにNagiosを使用する利点は、その汎用性(構成と使用が簡単)、使用可能なプラグインの大規模なリポジトリ、そして最も重要なこととして、統合されたアラートです。
このチュートリアルでは、 check_postgres Nagiosプラグインを使用して、 Nagios Core でPostgreSQLデータベースの監視を設定し、Slackベースのアラートを設定します。 最終的には、管理対象のPostgreSQLデータベースの監視システムが導入され、さまざまな機能のステータス変更がすぐに通知されます。
前提条件
-
ルート権限を持つUbuntu18.04サーバー、およびセカンダリの非ルートアカウント。 これは、この初期サーバーセットアップガイドに従ってセットアップできます。 このチュートリアルでは、root以外のユーザーは
sammy
です。 -
サーバーにインストールされているNagiosCore。 これを実現するには、「Nagios4をインストールしてUbuntu18.04でサーバーを監視する方法」チュートリアルの最初の5つの手順を完了します。
-
DigitalOceanからプロビジョニングされたDigitalOceanアカウントとPostgreSQL管理データベース。接続情報が利用可能です。 サーバーのIPアドレスがホワイトリストに含まれていることを確認してください。 DigitalOceanマネージドデータベースの詳細については、 productdocsにアクセスしてください。
-
フルアクセス権を持つSlackアカウント。ステータスの更新を受信するワークスペースに追加され、
ステップ1—check_postgresをインストールする
このセクションでは、Githubからcheck_postgres
プラグインの最新バージョンをダウンロードし、NagiosCoreで利用できるようにします。 また、PostgreSQLクライアント(psql
)をインストールして、check_postgres
が管理対象データベースに接続できるようにします。
次のコマンドを実行して、PostgreSQLクライアントをインストールすることから始めます。
- sudo apt install postgresql-client
次に、check_postgres
をホームディレクトリにダウンロードします。 まず、それに移動します:
- cd ~
Githubリリースページに移動し、プラグインの最新バージョンのリンクをコピーします。 執筆時点では、check_postgres
の最新バージョンは2.24.0
でした。 これは更新されることを覚えておいてください。可能な場合は、最新バージョンを使用することをお勧めします。
次に、curlを使用してダウンロードします。
- curl -LO https://github.com/bucardo/check_postgres/releases/download/2.24.0/check_postgres-2.24.0.tar.gz
次のコマンドを使用して抽出します。
- tar xvf check_postgres-*.tar.gz
これにより、ダウンロードしたファイルと同じ名前のディレクトリが作成されます。 そのフォルダにはcheck_postgres
実行可能ファイルが含まれており、Nagiosがプラグインを保存するディレクトリ(通常は/usr/local/nagios/libexec/
)にコピーする必要があります。 次のコマンドを実行してコピーします。
- sudo cp check_postgres-*/check_postgres.pl /usr/local/nagios/libexec/
次に、nagios
ユーザーに所有権を付与して、Nagiosから実行できるようにする必要があります。
- sudo chown nagios:nagios /usr/local/nagios/libexec/check_postgres.pl
check_postgres
がNagiosで利用可能になり、そこから使用できるようになりました。 ただし、PostgreSQLのさまざまな側面に関連する多くのコマンドを提供します。サービスの保守性を高めるには、コマンドを分割して個別に呼び出すことができるようにすることをお勧めします。 これを実現するには、プラグインディレクトリ内のすべてのcheck_postgres
コマンドへのシンボリックリンクを作成します。
次のコマンドを実行して、Nagiosがプラグインを保存するディレクトリに移動します。
- cd /usr/local/nagios/libexec
次に、次のコマンドでシンボリックリンクを作成します。
- sudo perl check_postgres.pl --symlinks
出力は次のようになります。
OutputCreated "check_postgres_archive_ready"
Created "check_postgres_autovac_freeze"
Created "check_postgres_backends"
Created "check_postgres_bloat"
Created "check_postgres_checkpoint"
Created "check_postgres_cluster_id"
Created "check_postgres_commitratio"
Created "check_postgres_connection"
Created "check_postgres_custom_query"
Created "check_postgres_database_size"
Created "check_postgres_dbstats"
Created "check_postgres_disabled_triggers"
Created "check_postgres_disk_space"
Created "check_postgres_fsm_pages"
Created "check_postgres_fsm_relations"
Created "check_postgres_hitratio"
Created "check_postgres_hot_standby_delay"
Created "check_postgres_index_size"
Created "check_postgres_indexes_size"
Created "check_postgres_last_analyze"
Created "check_postgres_last_autoanalyze"
Created "check_postgres_last_autovacuum"
Created "check_postgres_last_vacuum"
Created "check_postgres_listener"
Created "check_postgres_locks"
Created "check_postgres_logfile"
Created "check_postgres_new_version_bc"
Created "check_postgres_new_version_box"
Created "check_postgres_new_version_cp"
Created "check_postgres_new_version_pg"
Created "check_postgres_new_version_tnm"
Created "check_postgres_pgagent_jobs"
Created "check_postgres_pgb_pool_cl_active"
Created "check_postgres_pgb_pool_cl_waiting"
Created "check_postgres_pgb_pool_maxwait"
Created "check_postgres_pgb_pool_sv_active"
Created "check_postgres_pgb_pool_sv_idle"
Created "check_postgres_pgb_pool_sv_login"
Created "check_postgres_pgb_pool_sv_tested"
Created "check_postgres_pgb_pool_sv_used"
Created "check_postgres_pgbouncer_backends"
Created "check_postgres_pgbouncer_checksum"
Created "check_postgres_prepared_txns"
Created "check_postgres_query_runtime"
Created "check_postgres_query_time"
Created "check_postgres_relation_size"
Created "check_postgres_replicate_row"
Created "check_postgres_replication_slots"
Created "check_postgres_same_schema"
Created "check_postgres_sequence"
Created "check_postgres_settings_checksum"
Created "check_postgres_slony_status"
Created "check_postgres_table_size"
Created "check_postgres_timesync"
Created "check_postgres_total_relation_size"
Created "check_postgres_txn_idle"
Created "check_postgres_txn_time"
Created "check_postgres_txn_wraparound"
Created "check_postgres_version"
Created "check_postgres_wal_files"
Perlは、シンボリックリンクを作成したすべての関数をリストしました。 これらは、通常どおりコマンドラインから実行できるようになりました。
check_postgres
プラグインをダウンロードしてインストールしました。 また、プラグインのすべてのコマンドへのシンボリックリンクを作成して、Nagiosから個別に使用できるようにしました。 次のステップでは、接続サービスファイルを作成します。このファイルは、check_postgres
が管理対象データベースへの接続に使用します。
ステップ2—データベースの構成
このセクションでは、データベースの接続情報を含むPostgreSQL接続サービスファイルを作成します。 次に、check_postgres
を呼び出して接続データをテストします。
接続サービスファイルは、慣例によりpg_service.conf
と呼ばれ、/etc/postgresql-common/
の下に配置する必要があります。 お気に入りのエディター(nanoなど)で編集するために作成します。
- sudo nano /etc/postgresql-common/pg_service.conf
次の行を追加し、強調表示されたプレースホルダーを、接続の詳細セクションの下の管理対象データベースのコントロールパネルに表示される実際の値に置き換えます。
[managed-db]
host=host
port=port
user=username
password=password
dbname=defaultdb
sslmode=require
接続サービスファイルには、複数のデータベース接続情報グループを格納できます。 グループの始まりは、その名前を角かっこで囲むことによって示されます。 その後、接続パラメータ(host
、port
、user
、password
など)が新しい行で区切られます。価値。
終了したら、ファイルを保存して閉じます。
次に、次のコマンドを実行してcheck_postgres
を介してデータベースに接続し、構成の有効性をテストします。
- ./check_postgres.pl --dbservice=managed-db --action=connection
ここでは、パラメータ--dbservice
で使用するデータベース接続情報グループをcheck_postgres
に指示し、アクションとしてconnection
を指定して、接続を試行するように指定します。 。
出力は次のようになります。
OutputPOSTGRES_CONNECTION OK: service=managed-db version 11.4 | time=0.10s
これは、pg_service.conf
のパラメーターに従って、check_postgres
がデータベースへの接続に成功したことを意味します。 エラーが発生した場合は、その構成ファイルに入力した内容を再確認してください。
接続文字列として機能するPostgreSQL接続サービスファイルを作成して入力しました。 また、接続データでcheck_postgres
を実行し、出力を確認して、接続データをテストしました。 次のステップでは、データベースのさまざまな部分を監視するようにNagiosを構成します。
ステップ3—Nagiosでの監視サービスの作成
次に、check_postgres
プラグインとそのシンボリックリンクを呼び出すホストと複数のサービスを定義することにより、データベースのさまざまなメトリックを監視するようにNagiosを構成します。
Nagiosは、カスタム構成ファイルを/usr/local/nagios/etc/objects
に保存します。 そこに追加する新しいファイルは、/usr/local/nagios/etc/nagios.cfg
にある中央のNagios構成ファイルで手動で有効にする必要があります。 次に、コマンド、ホスト、および複数のサービスを定義します。これらを使用して、Nagiosで管理対象データベースを監視します。
まず、/usr/local/nagios/etc/objects
の下にフォルダーを作成し、次のコマンドを実行してPostgreSQL関連の構成を保存します。
- sudo mkdir /usr/local/nagios/etc/objects/postgresql
check_nagios
のNagiosコマンドをcommands.cfg
という名前のファイルに保存します。 編集用に作成します。
- sudo nano /usr/local/nagios/etc/objects/postgresql/commands.cfg
次の行を追加します。
define command {
command_name check_postgres_connection
command_line /usr/local/nagios/libexec/check_postgres_connection --dbservice=$ARG1$
}
define command {
command_name check_postgres_database_size
command_line /usr/local/nagios/libexec/check_postgres_database_size --dbservice=$ARG1$ --critical='$ARG2$'
}
define command {
command_name check_postgres_locks
command_line /usr/local/nagios/libexec/check_postgres_locks --dbservice=$ARG1$
}
define command {
command_name check_postgres_backends
command_line /usr/local/nagios/libexec/check_postgres_backends --dbservice=$ARG1$
}
ファイルを保存して閉じます。
このファイルでは、check_postgres
プラグインのさまざまな部分を呼び出す4つのNagiosコマンドを定義します(接続の確認、ロックと接続の数の取得、データベース全体のサイズ)。 これらはすべて、--dbservice
パラメーターに渡される引数を受け入れ、pg_service.conf
で定義されているデータベースのどれに接続するかを指定します。
check_postgres_database_size
コマンドは、--critical
パラメーターに渡される2番目の引数を受け入れます。この引数は、データベースストレージがいっぱいになるポイントを指定します。 受け入れられる値には、キロバイトの場合は1 KB
、メガバイトの場合は1 MB
など、最大エクサバイト(EB
)が含まれます。 容量単位のない数値は、バイト単位で表されるものとして扱われます。
必要なコマンドが定義されたので、services.cfg
という名前のファイルで、ホスト(基本的にはデータベース)とその監視サービスを定義します。 お気に入りのエディターを使用して作成します。
- sudo nano /usr/local/nagios/etc/objects/postgresql/services.cfg
次の行を追加し、db_max_storage_size
をデータベースの使用可能なストレージに関連する値に置き換えます。 割り当てたストレージサイズの90%に設定することをお勧めします。
define host {
use linux-server
host_name postgres
check_command check_postgres_connection!managed-db
}
define service {
use generic-service
host_name postgres
service_description PostgreSQL Connection
check_command check_postgres_connection!managed-db
notification_options w,u,c,r,f,s
}
define service {
use generic-service
host_name postgres
service_description PostgreSQL Database Size
check_command check_postgres_database_size!managed-db!db_max_storage_size
notification_options w,u,c,r,f,s
}
define service {
use generic-service
host_name postgres
service_description PostgreSQL Locks
check_command check_postgres_locks!managed-db
notification_options w,u,c,r,f,s
}
define service {
use generic-service
host_name postgres
service_description PostgreSQL Backends
check_command check_postgres_backends!managed-db
notification_options w,u,c,r,f,s
}
最初にホストを定義して、Nagiosがサービスがどのエンティティに関連しているかを認識できるようにします。 次に、定義したコマンドを呼び出す4つのサービスを作成します。 それぞれが引数としてmanaged-db
を渡し、ステップ2で定義したmanaged-db
を監視する必要があることを詳しく説明します。
通知オプションについては、各サービスで、サービス状態がWARNING
、UNKNOWN
、CRITICAL
、OK
になったときに通知を送信するように指定しています。ダウンタイム)、サービスがフラッピングを開始するとき、またはスケジュールされたダウンタイムが開始または終了するとき。 このオプションに値を明示的に指定しないと、手動でトリガーされた場合を除いて、通知は(利用可能な連絡先に)まったく送信されません。
ファイルを保存して閉じます。
次に、一般的なNagios構成ファイルを編集して、この新しいディレクトリから構成ファイルを読み取るようにNagiosに明示的に指示する必要があります。 次のコマンドを実行して、編集用に開きます。
- sudo nano /usr/local/nagios/etc/nagios.cfg
ファイル内でこの強調表示された行を見つけます。
...
# directive as shown below:
cfg_dir=/usr/local/nagios/etc/servers
#cfg_dir=/usr/local/nagios/etc/printers
...
その上に、次の強調表示された行を追加します。
...
cfg_dir=/usr/local/nagios/etc/objects/postgresql
cfg_dir=/usr/local/nagios/etc/servers
...
ファイルを保存して閉じます。 この行は、構成ファイルが配置されている/usr/local/nagios/etc/objects/postgresql
ディレクトリからすべての構成ファイルをロードするようにNagiosに指示します。
Nagiosを再起動する前に、次のコマンドを実行して構成の有効性を確認してください。
- sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
出力の終わりは次のようになります。
OutputTotal Warnings: 0
Total Errors: 0
Things look okay - No serious problems were detected during the pre-flight check
これは、Nagiosが構成にエラーを検出しなかったことを意味します。 エラーが表示された場合は、何が問題だったかについてのヒントも表示されるため、エラーをより簡単に修正できます。
Nagiosに構成をリロードさせるには、次のコマンドを実行してサービスを再起動します。
- sudo systemctl restart nagios
これで、ブラウザでNagiosに移動できます。 ロードしたら、左側のメニューからServicesオプションを押します。 postgres
ホストとサービスのリストが、現在のステータスとともに表示されます。
それらはすべてすぐに緑色に変わり、OK
ステータスを示します。 ステータス情報列の下にコマンド出力が表示されます。 サービス名をクリックすると、そのステータスと可用性に関する詳細情報が表示されます。
check_postgres
コマンド、ホスト、およびデータベースを監視するための複数のサービスをNagiosインストールに追加しました。 また、Nagios Webインターフェイスを介してサービスを調べることにより、サービスが正しく機能していることを確認しました。 次のステップでは、Slackベースのアラートを構成します。
ステップ4—SlackAlertingを設定する
このセクションでは、ワークスペース内の目的のチャネルにイベントを投稿することにより、Slackを介してイベントについてアラートを出すようにNagiosを構成します。
開始する前に、Slackで目的のワークスペースにログインし、Nagiosからステータスメッセージを受信する2つのチャネルを作成します。1つはホスト用、もう1つはサービス通知用です。 必要に応じて、両方の種類のアラートを受信するチャネルを1つだけ作成できます。
次に、SlackAppDirectoryのNagiosapp に移動し、 AddConfigurationを押します。 Nagios統合を追加するためのページが表示されます。
NagiosIntegrationの追加を押します。 ページが読み込まれたら、下にスクロールしてトークンをメモします。これは、さらに先に必要になるためです。
次に、サーバーにNagios用のSlackプラグイン(Perlで記述)をインストールして構成します。 まず、次のコマンドを実行して、必要なPerlの前提条件をインストールします。
- sudo apt install libwww-perl libcrypt-ssleay-perl -y
次に、プラグインをNagiosプラグインディレクトリにダウンロードします。
- sudo curl https://raw.githubusercontent.com/tinyspeck/services-examples/master/nagios.pl -o slack.pl
次のコマンドを実行して実行可能にします。
- sudo chmod +x slack.pl
次に、Slackから取得したトークンを使用してワークスペースに接続するように編集する必要があります。 編集のために開きます:
- sudo nano slack.pl
ファイル内で次の行を見つけます。
...
my $opt_domain = "foo.slack.com"; # Your team's domain
my $opt_token = "your_token"; # The token from your Nagios services page
...
foo.slack.com
をワークスペースドメインに置き換え、your_token
をNagiosアプリ統合トークンに置き換えてから、ファイルを保存して閉じます。 これで、スクリプトはSlackに適切なリクエストを送信できるようになります。これをテストするには、次のコマンドを実行します。
- ./slack.pl -field slack_channel=#your_channel_name -field HOSTALIAS="Test Host" -field HOSTSTATE="UP" -field HOSTOUTPUT="Host is UP" -field NOTIFICATIONTYPE="RECOVERY"
your_channel_name
を、ステータスアラートを受信するチャネルの名前に置き換えます。 スクリプトは、Slackに対して行ったHTTPリクエストに関する情報を出力します。すべてが正しく行われた場合、出力の最後の行はok
になります。 エラーが発生した場合は、指定したSlackチャネルがワークスペースに存在するかどうかを再確認してください。
これで、Slackワークスペースに移動して、指定したチャネルを選択できます。 Nagiosからのテストメッセージが表示されます。
これにより、Slackスクリプトが適切に構成されていることが確認されます。 次に、このスクリプトを使用してSlack経由でアラートを出すようにNagiosを構成します。
Slackの連絡先と、Slackにメッセージを送信する2つのコマンドを作成する必要があります。 この構成は、前の構成ファイルと同じフォルダーにあるslack.cfg
という名前のファイルに保存します。 次のコマンドを実行して、編集用に作成します。
- sudo nano /usr/local/nagios/etc/objects/postgresql/slack.cfg
次の行を追加します。
define contact {
contact_name slack
alias Slack
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,f,s,r
host_notification_options d,u,r,f,s
service_notification_commands notify-service-by-slack
host_notification_commands notify-host-by-slack
}
define command {
command_name notify-service-by-slack
command_line /usr/local/nagios/libexec/slack.pl -field slack_channel=#service_alerts_channel
}
define command {
command_name notify-host-by-slack
command_line /usr/local/nagios/libexec/slack.pl -field slack_channel=#host_alerts_channel
}
ここでは、slack
という名前の連絡先を定義し、いつでも連絡できることを示し、サービスおよびホスト関連のイベントの通知に使用するコマンドを指定します。 これらの2つのコマンドはその後に定義され、構成したばかりのスクリプトを呼び出します。 service_alerts_channel
とhost_alerts_channel
を、それぞれサービスメッセージとホストメッセージを受信するチャネルの名前に置き換える必要があります。 必要に応じて、同じチャネル名を使用できます。
最後のステップでのサービスの作成と同様に、連絡先にサービスとホストの通知オプションを設定することは、連絡先が受信するアラートの種類を制御するため、非常に重要です。 これらのオプションを省略すると、Webインターフェイスから手動でトリガーされた場合にのみ通知が送信されます。
編集が終わったら、ファイルを保存して閉じます。
定義したslack
連絡先を介したアラートを有効にするには、/usr/local/nagios/etc/objects/
。 次のコマンドを実行して、編集用に開きます。
- sudo nano /usr/local/nagios/etc/objects/contacts.cfg
次のような構成ブロックを見つけます。
define contactgroup {
contactgroup_name admins
alias Nagios Administrators
members nagiosadmin
}
次のように、slack
をメンバーのリストに追加します。
define contactgroup {
contactgroup_name admins
alias Nagios Administrators
members nagiosadmin,slack
}
ファイルを保存して閉じます。
デフォルトでは、スクリプトを実行するとき、Nagiosは環境変数を介してホストとサービスの情報を利用可能にしません。これはSlackスクリプトが意味のあるメッセージを送信するために必要なものです。 これを解決するには、nagios.cfg
のenable_environment_macros
設定を1
に設定する必要があります。 次のコマンドを実行して、編集用に開きます。
- sudo nano /usr/local/nagios/etc/nagios.cfg
次のような行を見つけます。
enable_environment_macros=0
次のように、値を1
に変更します。
enable_environment_macros=1
ファイルを保存して閉じます。
次のコマンドを実行して、Nagios構成の有効性をテストします。
- sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
出力の終わりは次のようになります。
OutputTotal Warnings: 0
Total Errors: 0
Things look okay - No serious problems were detected during the pre-flight check
次のコマンドを実行して、Nagiosの再起動に進みます。
- sudo systemctl restart nagios
Slack統合をテストするには、Webインターフェイスを介してカスタム通知を送信します。 ブラウザにNagiosServicesステータスページをリロードします。 ページが読み込まれたら、 PostgreSQLバックエンドサービスを押し、右側のカスタムサービス通知の送信を押します。
選択したコメントを入力し、コミットを押してから、完了を押します。 Slackですぐに新しいメッセージが届きます。
これでSlackとNagiosが統合されたため、重要なイベントやステータスの変更に関するメッセージをすぐに受け取ることができます。 また、Nagios内から手動でイベントをトリガーすることにより、統合をテストしました。
結論
これで、管理対象のPostgreSQLデータベースを監視し、ステータスの変更とイベントをSlackに報告するようにNagios Coreが構成されたため、データベースで何が起こっているかを常に把握できます。 これにより、ステータスフィードがリアルタイムで取得されるため、緊急時に迅速に対応できます。
check_postgres
の機能について詳しく知りたい場合は、その docs をチェックしてください。ここには、使用できる可能性のあるさらに多くのコマンドがあります。
PostgreSQLマネージドデータベースでできることの詳細については、 productdocsにアクセスしてください。