如何在 Ubuntu 18.04 上使用 Nagios Core 监控受管 PostgreSQL 数据库

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

数据库监控是了解数据库随着时间的推移如何运作的关键。它可以帮助您发现隐藏的使用问题和数据库中发生的瓶颈。实施数据库监控系统可以很快成为一个长期优势,这将对您的基础设施管理过程产生积极影响。

Nagios Core是一个流行的监控系统,您可以使用它来监控您的管理数据库。用于此任务使用Nagios的优点是其多功能性 - 易于配置和使用 - 一个庞大的存储库 可用的插件,最重要的是,集成警报。

在本教程中,您将使用 check_postgres Nagios 插件在 Nagios Core中设置 PostgreSQL 数据库监控,并设置基于 Slack 的警报。

前提条件

步骤 1 — 安装 check_postgres

在本节中,您将从Github下载最新版本的check_postgres插件,并将其提供给Nagios Core,您还将安装PostgreSQL客户端(psql),以便check_postgres能够连接到您的管理数据库。

开始安装 PostgreSQL 客户端,运行以下命令:

1sudo apt install postgresql-client

接下来,您将下载‘check_postgres’到您的主目录. 首先,导航到它:

1cd ~

转到 Github 发布页面并复制插件的最新版本的链接. 在写作时,最新版本的 check_postgres2.24.0;请记住,这将更新,如果可能的话,最好使用最新版本。

现在下载它使用curl:

1curl -LO https://github.com/bucardo/check_postgres/releases/download/2.24.0/check_postgres-2.24.0.tar.gz

使用以下命令提取它:

1tar xvf check_postgres-*.tar.gz

这将创建一个与您下载的文件相同的名称的目录. 该目录包含check_postgres可执行,您需要将其复制到Nagios存储插件的目录(通常是/usr/local/nagios/libexec/)。

1sudo cp check_postgres-*/check_postgres.pl /usr/local/nagios/libexec/

接下来,你需要给nagios用户拥有它,这样它就可以从Nagios运行:

1sudo chown nagios:nagios /usr/local/nagios/libexec/check_postgres.pl

check_postgres现在可用于Nagios,并且可以从中使用,但它提供了许多与PostgreSQL的不同方面相关的命令,并且为了更好的服务维护性,最好将它们分开,以便它们可以单独调用。

通过运行以下命令导航到Nagios存储插件的目录:

1cd /usr/local/nagios/libexec

然后,创建与:

1sudo perl check_postgres.pl --symlinks

结果将是这样的:

 1[secondary_label Output]
 2Created "check_postgres_archive_ready"
 3Created "check_postgres_autovac_freeze"
 4Created "check_postgres_backends"
 5Created "check_postgres_bloat"
 6Created "check_postgres_checkpoint"
 7Created "check_postgres_cluster_id"
 8Created "check_postgres_commitratio"
 9Created "check_postgres_connection"
10Created "check_postgres_custom_query"
11Created "check_postgres_database_size"
12Created "check_postgres_dbstats"
13Created "check_postgres_disabled_triggers"
14Created "check_postgres_disk_space"
15Created "check_postgres_fsm_pages"
16Created "check_postgres_fsm_relations"
17Created "check_postgres_hitratio"
18Created "check_postgres_hot_standby_delay"
19Created "check_postgres_index_size"
20Created "check_postgres_indexes_size"
21Created "check_postgres_last_analyze"
22Created "check_postgres_last_autoanalyze"
23Created "check_postgres_last_autovacuum"
24Created "check_postgres_last_vacuum"
25Created "check_postgres_listener"
26Created "check_postgres_locks"
27Created "check_postgres_logfile"
28Created "check_postgres_new_version_bc"
29Created "check_postgres_new_version_box"
30Created "check_postgres_new_version_cp"
31Created "check_postgres_new_version_pg"
32Created "check_postgres_new_version_tnm"
33Created "check_postgres_pgagent_jobs"
34Created "check_postgres_pgb_pool_cl_active"
35Created "check_postgres_pgb_pool_cl_waiting"
36Created "check_postgres_pgb_pool_maxwait"
37Created "check_postgres_pgb_pool_sv_active"
38Created "check_postgres_pgb_pool_sv_idle"
39Created "check_postgres_pgb_pool_sv_login"
40Created "check_postgres_pgb_pool_sv_tested"
41Created "check_postgres_pgb_pool_sv_used"
42Created "check_postgres_pgbouncer_backends"
43Created "check_postgres_pgbouncer_checksum"
44Created "check_postgres_prepared_txns"
45Created "check_postgres_query_runtime"
46Created "check_postgres_query_time"
47Created "check_postgres_relation_size"
48Created "check_postgres_replicate_row"
49Created "check_postgres_replication_slots"
50Created "check_postgres_same_schema"
51Created "check_postgres_sequence"
52Created "check_postgres_settings_checksum"
53Created "check_postgres_slony_status"
54Created "check_postgres_table_size"
55Created "check_postgres_timesync"
56Created "check_postgres_total_relation_size"
57Created "check_postgres_txn_idle"
58Created "check_postgres_txn_time"
59Created "check_postgres_txn_wraparound"
60Created "check_postgres_version"
61Created "check_postgres_wal_files"

Perl列出了它创建的 symlink 的所有函数,这些函数现在可以像往常一样从命令行执行。

您已下载并安装了check_postgres插件,您还创建了连接到插件的所有命令,以便它们可以从Nagios单独使用。在下一步,您将创建一个连接服务文件,而check_postgres将使用它来连接到您的管理数据库。

步骤 2 - 配置您的数据库

在本节中,您将创建一个 PostgreSQL 连接服务文件,其中包含您的数据库的连接信息,然后,您将通过在其上调用check_postgres来测试连接数据。

连接服务文件通常被称为 pg_service.conf,必须位于 /etc/postgresql-common/ 下。

1sudo nano /etc/postgresql-common/pg_service.conf

添加以下行,将突出位置持有者替换为在 ** 连接详细信息** 部分中的管理数据库控制面板中显示的实际值:

1[label /etc/postgresql-common/pg_service.conf]
2[managed-db]
3host=host
4port=port
5user=username
6password=password
7dbname=defaultdb
8sslmode=require

连接服务文件可以容纳多个数据库连接信息组. 一个群组的开始是通过将其名称放置在方块上来标记的。 接着,连接参数(‘主机’,‘端口’,‘用户’,‘密码’,等等)分开了新的行,必须给出一个值。

保存并关闭文件,当你完成。

现在,您将通过运行以下命令通过check_postgres连接到数据库来测试配置的有效性:

1./check_postgres.pl --dbservice=managed-db --action=connection

在这里,你会告诉check_postgres,用参数--dbservice来使用哪个数据库连接信息组,并指定它只应该通过指定连接作为操作来尝试连接。

你的输出将看起来像这样:

1[secondary_label Output]
2POSTGRES_CONNECTION OK: service=managed-db version 11.4 | time=0.10s

这意味着check_postgres成功连接到数据库,根据pg_service.conf的参数。

您已创建并填写了 PostgreSQL 连接服务文件,它作为 连接字符串工作。您还通过运行 check_postgres 来测试连接数据,并观察输出。

步骤 3 – 在 Nagios 中创建监控服务

现在,您将配置Nagios来监控您的数据库的各种指标,通过定义一个主机和多个服务,这些服务将称之为check_postgres插件及其simlinks。

Nagios 将您的自定义配置文件存储在 /usr/local/nagios/etc/objects 下。 您添加的新文件必须在位于 /usr/local/nagios/etc/nagios.cfg 的中央 Nagios 配置文件中手动启用。

首先,在/usr/local/nagios/etc/objects下创建一个文件夹,以运行以下命令来存储您的 PostgreSQL 相关配置:

1sudo mkdir /usr/local/nagios/etc/objects/postgresql

你会将 Nagios 命令存储在一个名为 "commands.cfg" 的文件中,以便编辑:

1sudo nano /usr/local/nagios/etc/objects/postgresql/commands.cfg

添加以下几行:

 1[label /usr/local/nagios/etc/objects/postgresql/commands.cfg]
 2define command {
 3    command_name check_postgres_connection
 4    command_line           /usr/local/nagios/libexec/check_postgres_connection --dbservice=$ARG1$
 5}
 6
 7define command {
 8    command_name check_postgres_database_size
 9    command_line           /usr/local/nagios/libexec/check_postgres_database_size --dbservice=$ARG1$ --critical='$ARG2$'
10}
11
12define command {
13    command_name check_postgres_locks
14    command_line           /usr/local/nagios/libexec/check_postgres_locks --dbservice=$ARG1$
15}
16
17define command {
18    command_name check_postgres_backends
19    command_line           /usr/local/nagios/libexec/check_postgres_backends --dbservice=$ARG1$
20}

保存并关闭文件。

在此文件中,您定义了四个Nagios命令,这些命令呼叫check_postgres插件的不同部分(检查连接性,获取锁和连接的数量,以及整个数据库的大小)。

「check_postgres_database_size」命令接受第二个参数,该参数被传输到「--关键」参数中,该参数指定了数据库存储空间正在填充的时刻。

现在,必要的命令已经定义了,你将定义主机(基本上是数据库)及其监控服务,以名为services.cfg的文件。

1sudo nano /usr/local/nagios/etc/objects/postgresql/services.cfg

添加以下行,取代「db_max_storage_size」为与数据库可用的存储空间相关的值,建议将其设置为您分配给数据库的存储空间大小的90%:

 1[label /usr/local/nagios/etc/objects/postgresql/services.cfg]
 2define host {
 3      use linux-server
 4      host_name postgres
 5      check_command check_postgres_connection!managed-db
 6}
 7
 8define service {
 9      use generic-service
10      host_name postgres
11      service_description PostgreSQL Connection
12      check_command check_postgres_connection!managed-db
13      notification_options w,u,c,r,f,s
14}
15
16define service {
17      use generic-service
18      host_name postgres
19      service_description PostgreSQL Database Size
20      check_command check_postgres_database_size!managed-db!db_max_storage_size
21      notification_options w,u,c,r,f,s
22}
23
24define service {
25      use generic-service
26      host_name postgres
27      service_description PostgreSQL Locks
28      check_command check_postgres_locks!managed-db
29      notification_options w,u,c,r,f,s
30}
31
32define service {
33      use generic-service
34      host_name postgres
35      service_description PostgreSQL Backends
36      check_command check_postgres_backends!managed-db
37      notification_options w,u,c,r,f,s
38}

您首先定义一个主机,以便 Nagios 知道服务与哪个实体有关。然后,您创建四个服务,这些服务称呼您刚刚定义的命令。

至于通知选项,每个服务规定,当服务状态变为警告,未知,关键,OK(当它从停机时恢复),当服务开始(https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/3/en/flapping.html),或当计划停机时开始或结束时,应发送通知。

保存并关闭文件。

接下来,您需要明确告诉 Nagios 从这个新目录中阅读 config 文件,通过编辑一般的 Nagios config 文件。

1sudo nano /usr/local/nagios/etc/nagios.cfg

在文件中找到这个突出的一行:

1[label /usr/local/nagios/etc/nagios.cfg]
2...
3# directive as shown below:
4
5cfg_dir=/usr/local/nagios/etc/servers
6#cfg_dir=/usr/local/nagios/etc/printers
7...

以上,添加以下突出的一行:

1[label /usr/local/nagios/etc/nagios.cfg]
2...
3cfg_dir=/usr/local/nagios/etc/objects/postgresql
4cfg_dir=/usr/local/nagios/etc/servers
5...

此行告诉 Nagios 从 /usr/local/nagios/etc/objects/postgresql 目录中下载所有配置文件,您的配置文件位于那里。

在重新启动 Nagios 之前,请通过运行以下命令检查配置的有效性:

1sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

输出的结尾将看起来像这样:

1[secondary_label Output]
2Total Warnings: 0
3Total Errors:   0
4
5Things look okay - No serious problems were detected during the pre-flight check

这意味着Nagios在配置中没有发现任何错误. 如果它显示错误,您还会看到错误的线索,这样您就可以更容易地修复错误。

要让 Nagios 重新加载其配置,请通过运行以下命令重新启动其服务:

1sudo systemctl restart nagios

您现在可以在浏览器中导航到 Nagios. 一旦它加载,请从左侧菜单中点击 服务选项.您将看到postgres主机和服务列表,以及其当前状态:

PostgreSQL Monitoring Services - Pending

它们都将很快变为绿色,显示OK状态,您将在状态信息列下看到命令输出,您可以点击服务名称并查看其状态和可用性的详细信息。

您已将check_postgres命令、主机和多个服务添加到您的 Nagios 安装中,以监控您的数据库,您还通过 Nagios Web 界面检查服务是否正常工作。

步骤 4 – 配置 Slack 警报

在本节中,您将配置 Nagios 以通过 Slack 通知您发生的事件,将它们发布到您工作区的所需渠道中。

在开始之前,在 Slack 上登录您想要的工作区,并创建两个渠道,您希望从 Nagios 接收状态消息:一个用于主机,另一个用于服务通知。

然后,转到 Slack App Directory 中的 Nagios 应用程序并点击 ** 添加配置**. 您将看到添加 Nagios 集成的页面。

Slack - Add Nagios Integration

当页面加载时,向下滚动并记住代币,因为您将需要它进一步。

Slack - Integration Token

您现在将在您的服务器上安装并配置 Slack 插件(用 Perl 编写)用于 Nagios. 首先,通过运行以下命令来安装所需的 Perl 前提条件:

1sudo apt install libwww-perl libcrypt-ssleay-perl -y

然后,将插件下载到您的Nagios插件目录:

1sudo curl https://raw.githubusercontent.com/tinyspeck/services-examples/master/nagios.pl -o slack.pl

通过运行以下命令使其可执行:

1sudo chmod +x slack.pl

现在,您需要编辑它以使用您从 Slack 获得的代币连接到您的工作区。

1sudo nano slack.pl

在文件中找到以下行:

1[label /usr/local/nagios/libexec/slack.pl]
2...
3my $opt_domain = "foo.slack.com"; # Your team's domain
4my $opt_token = "your_token"; # The token from your Nagios services page
5...

用你的工作空间域代替「foo.slack.com」和「your_token」代替你的Nagios应用程序集成代码,然后保存并关闭文件。

1./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 工作区并选择您指定的频道,您将看到来自 Nagios 的测试消息。

Slack - Nagios Test Message

这确认您已经正确配置了 Slack 脚本,您现在将继续配置 Nagios 以通过 Slack 使用此脚本通知您。

您需要为 Slack 创建一个联系人和两个命令,将信息发送给它. 您将将此 config 存储在名为 slack.cfg 的文件中,与以前的 config 文件相同的文件夹中。

1sudo nano /usr/local/nagios/etc/objects/postgresql/slack.cfg

添加以下几行:

 1[label /usr/local/nagios/etc/objects/postgresql/slack.cfg]
 2define contact {
 3      contact_name slack
 4      alias Slack
 5      service_notification_period 24x7
 6      host_notification_period 24x7
 7      service_notification_options w,u,c,f,s,r
 8      host_notification_options d,u,r,f,s
 9      service_notification_commands notify-service-by-slack
10      host_notification_commands notify-host-by-slack
11}
12
13define command {
14      command_name notify-service-by-slack
15      command_line     /usr/local/nagios/libexec/slack.pl -field slack_channel=#service_alerts_channel
16}
17
18define command {
19      command_name notify-host-by-slack
20      command_line     /usr/local/nagios/libexec/slack.pl -field slack_channel=#host_alerts_channel
21}

在这里,您定义了一个名为slack的联系人,表示它可以随时联系,并指定哪些命令用于通知服务和主机相关事件。这两个命令在其后定义并调用您刚刚配置的脚本。您需要用您想要接收服务和主机消息的渠道名称代替service_alerts_channelhost_alerts_channel

与在最后一步中创建服务类似,在联系人上设置服务和主机通知选项至关重要,因为它决定联系人将收到什么类型的通知。

当你完成编辑时,保存和关闭文件。

要通过您刚刚定义的slack联系人启用通知,您需要将其添加到admin联系人组中,该联系人被定义为contacts.cfg配置文件,位于/usr/local/nagios/etc/objects/下方。

1sudo nano /usr/local/nagios/etc/objects/contacts.cfg

查找看起来像这样的 config 块:

1[label /usr/local/nagios/etc/objects/contacts.cfg]
2define contactgroup {
3
4    contactgroup_name admins
5    alias Nagios Administrators
6    members nagiosadmin
7}

slack添加到会员列表中,如下:

1[label /usr/local/nagios/etc/objects/contacts.cfg]
2define contactgroup {
3
4    contactgroup_name admins
5    alias Nagios Administrators
6    members nagiosadmin,slack
7}

保存并关闭文件。

默认情况下,在运行脚本时,Nagios 不会通过环境变量提供主机和服务信息,这正是 Slack 脚本需要发送有意义的消息的要求。

1sudo nano /usr/local/nagios/etc/nagios.cfg

找到看起来像这样的线条:

1[label /usr/local/nagios/etc/nagios.cfg]
2enable_environment_macros=0

将值更改为1,如下:

1[label /usr/local/nagios/etc/nagios.cfg]
2enable_environment_macros=1

保存并关闭文件。

通过运行以下命令来测试 Nagios 配置的有效性:

1sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

输出的结尾将看起来像:

1[secondary_label Output]
2Total Warnings: 0
3Total Errors:   0
4
5Things look okay - No serious problems were detected during the pre-flight check

继续通过运行以下命令重新启动 Nagios:

1sudo systemctl restart nagios

要测试 Slack 集成,您将通过 Web 界面发送自定义通知。在浏览器中重新加载 Nagios Services状态页面。 点击PostgreSQL Backends**服务,并在页面加载时按一下右侧的发送自定义服务通知**

Nagios - Custom Service Notification

输入您选择的评论,然后按 Commit,然后按 Done

Slack - Status Alert From Nagios

您现在已经将 Slack 与 Nagios 集成,因此您将立即收到有关关键事件和状态变化的消息,您还通过从 Nagios 中手动触发事件来测试集成。

结论

现在,您已经配置了 Nagios Core 来监控您的受管理的 PostgreSQL 数据库,并向 Slack 报告任何状态变化和事件,因此您将始终保持数据库发生的事情的循环。

如果您想了解更多关于 check_postgres 的功能,请查看其 docs,在那里您可以找到更多可以使用的命令。

有关您可以使用 PostgreSQL 管理数据库的更多信息,请访问 产品文档

Published At
Categories with 技术
comments powered by Disqus