如何在Ubuntu 18.04上使用Nagios Core监视托管的PostgreSQL数据库

数据库监控是了解数据库在不同时间点的执行情况的关键。它可以帮助您发现隐藏的使用问题和瓶颈,还可以让您处于数据库中发生的所有事情的循环中。在本教程中,您将使用check_postgres Nagios插件在Nagios Core中设置PostgreSQL数据库监控,并设置基于Slack的警报。

作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。

介绍

数据库监控是了解数据库随时间变化的关键。 它可以帮助您发现数据库中发生的隐藏使用问题和瓶颈。 实施数据库监控系统可以很快成为长期优势,这将对您的基础架构管理流程产生积极影响。 您将能够快速响应数据库的状态更改,并在受监视的服务恢复正常运行时快速得到通知。

Nagios Core是一种流行的监控系统,可用于监控托管数据库。 使用Nagios完成此任务的好处在于它的多功能性 - 它易于配置和使用 - 可用插件的大型存储库,最重要的是集成警报。

在本教程中,您将使用check_postgres Nagios插件在Nagios Core中设置PostgreSQL数据库监控,并设置基于Slack的警报。 最后,您将为托管的PostgreSQL数据库配备一个监控系统,并立即通知各种功能的状态变化。

先决条件

第1步 - 安装check_postgres

在本节中,您将从Github下载最新版本的check_postgres插件,并将其提供给Nagios Core。 您还将安装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

输出将如下所示:

Created "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

添加以下行,将突出显示的占位符替换为“托管数据库控制面板”中“ 连接详细信息 ”部分下显示的实际值:

/etc/postgresql-common/pg_service.conf
[managed-db]
host=host
port=port
user=username
password=password
dbname=defaultdb
sslmode=require

连接服务文件可以容纳多个数据库连接信息组。 通过将其名称放在方括号中来表示组的开头。 之后是连接参数( hostportuserpassword等),由新行分隔,必须给出一个值。

完成后保存并关闭文件。

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

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

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

您的输出看起来类似于:

POSTGRES_CONNECTION OK: service=managed-db version 11.4 | time=0.10s

这意味着check_postgres根据pg_service.conf的参数成功连接到数据库。 如果出现错误,请仔细检查刚刚在该配置文件中输入的内容。

您已创建并填写了PostgreSQL连接服务文件,该文件用作连接字符串 您还通过在其上运行check_postgres并观察输出来测试连接数据。 在下一步中,您将配置Nagios以监视数据库的各个部分。

第3步 - 在Nagios中创建监控服务

现在,您将通过定义主机和多个服务来配置Nagios以监视数据库的各种指标,这将调用check_postgres插件及其符号链接。

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

添加以下行:

/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$
}

保存并关闭文件。

在此文件中,您定义了四个Nagios命令,这些命令调用check_postgres插件的不同部分(检查连接,获取锁和连接的数量以及整个数据库的大小)。 它们都接受传递给--dbservice参数的参数,并指定要连接到pg_service.conf定义的哪些数据库。

check_postgres_database_size命令接受传递给--critical参数的第二个参数,该参数指定数据库存储变满的点。 可接受的值包括1 KB (一千字节), 1 MB (兆字节)等等,最高为exabytes( EB )。 没有容量单位的数字被视为以字节表示。

既然已经定义了必要的命令,您将在名为services.cfg的文件中定义主机(本质上是数据库)及其监视services.cfg 使用您喜欢的编辑器创建它:

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

添加以下行,将db_max_storage_size替换db_max_storage_size与数据库的可用存储有关的值。 建议将其设置为已分配给它的存储大小的90%:

/usr/local/nagios/etc/objects/postgresql/services.cfg
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知道服务与哪个实体相关。 然后,您将创建四个服务,这些服务调用您刚刚定义的命令。 每个都传递managed-db作为参数,详细说明应该监视在第2步中定义的managed-db

关于通知选项,每个服务都指定在服务状态变为WARNINGUNKNOWNCRITICALOK (从停机时间恢复),服务开始振荡或计划停机时间开始或结束时发送通知。 如果没有明确地为此选项提供值,则除非手动触发,否则不会发送任何通知(对可用联系人)。

保存并关闭文件。

接下来,您需要通过编辑常规Nagios配置文件,明确告知Nagios从此新目录中读取配置文件。 通过运行以下命令将其打开以进行编辑:

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

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

/usr/local/nagios/etc/nagios.cfg
...
# directive as shown below:

cfg_dir=/usr/local/nagios/etc/servers
#cfg_dir=/usr/local/nagios/etc/printers
...

在它上面,添加以下突出显示的行:

/usr/local/nagios/etc/nagios.cfg
...
cfg_dir=/usr/local/nagios/etc/objects/postgresql
cfg_dir=/usr/local/nagios/etc/servers
...

保存并关闭文件。 该行告诉Nagios从配置文件所在的/usr/local/nagios/etc/objects/postgresql目录加载所有配置文件。

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

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

输出的结尾看起来类似于:

Total 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。 加载后,按左侧菜单中的“ 服务”选项。 您将看到postgres主机和服务列表,以及它们当前的状态:

PostgreSQL监控服务 - 待定

他们很快就会变成绿色并显示OK状态。 您将在“ 状态信息”列下看到命令输出。 您可以单击服务名称并查看有关其状态和可用性的详细信息。

您已将check_postgres命令,主机和多个服务添加到Nagios安装中以监控数据库。 您还通过Nagios Web界面检查了服务是否正常工作。 在下一步中,您将配置基于Slack的警报。

第4步 - 配置Slack Alerting

在本节中,您将配置Nagios,通过将它们发布到工作区中的所需通道来提醒您有关Slack的事件。

在开始之前,请登录Slack上所需的工作区,并创建两个通道,您需要从Nagios接收状态消息:一个用于主机,另一个用于服务通知。 如果您愿意,您只能创建一个频道,您将收到这两种警报。

然后,转到Slack App Directory中的Nagios应用程序,然后按添加配置 您将看到一个用于添加Nagios Integration的页面。

Slack  - 添加Nagios集成

添加Nagios集成 页面加载时,向下滚动并记下令牌,因为您需要进一步操作。

Slack  - 集成令牌

您现在将在服务器上为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

在文件中找到以下行:

/usr/local/nagios/libexec/slack.pl
...
my $opt_domain = "foo.slack.com"; # Your team's domain
my $opt_token = "your_token"; # The token from your Nagios services page
...

使用Nagios应用程序集成令牌将foo .slack.com替换为您的工作区域和your_token ,然后保存并关闭该文件。 该脚本现在可以向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请求的信息,如果一切正常,输出的最后一行就可以了。 如果出现错误,请仔细检查您指定的Slack通道是否存在于工作空间中。

您现在可以转到Slack工作区并选择您指定的通道。 您将看到来自Nagios的测试消息。

Slack  -  Nagios测试消息

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

您需要为Slack创建一个联系人和两个将向其发送消息的命令。 您将此配置存储在名为slack.cfg的文件中,与先前的配置文件位于同一文件夹中。 通过运行以下命令创建它以进行编辑:

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

添加以下行:

/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的联系人,声明可以随时联系该联系人,并指定用于通知服务和主机相关事件的命令。 这两个命令在它之后定义并调用刚刚配置的脚本。 您需要将service_alerts_channelhost_alerts_channel替换为您要接收服务和主机消息的通道的名称。 如果愿意,您可以使用相同的频道名称。

与上一步中的服务创建类似,在联系人上设置服务和主机通知选项至关重要,因为它控制联系人将收到的警报类型。 省略这些选项将导致仅在从Web界面手动触发时发送通知。

完成编辑后,保存并关闭文件。

要通过刚刚定义的slack联系人启用警报,您需要将其添加到位于/usr/local/nagios/etc/objects/下的contacts.cfg配置文件中定义的admin联系人组。 通过运行以下命令将其打开以进行编辑:

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

找到如下所示的配置块:

/usr/local/nagios/etc/objects/contacts.cfg
define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin
}

slack添加到成员列表中,如下所示:

/usr/local/nagios/etc/objects/contacts.cfg
define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin,slack
}

保存并关闭文件。

默认情况下,在运行脚本时,Nagios不会通过环境变量提供主机和服务信息,这是Slack脚本发送有意义消息所需的内容。 要解决此问题,您需要将nagios.cfgenable_environment_macros设置为1 通过运行以下命令将其打开以进行编辑:

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

找到如下所示的行:

/usr/local/nagios/etc/nagios.cfg
enable_environment_macros=0

将值更改为1 ,如下所示:

/usr/local/nagios/etc/nagios.cfg
enable_environment_macros=1

保存并关闭文件。

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

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

输出的结尾如下所示:

Total 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界面发送自定义通知。 在浏览器中重新加载Nagios Services状态页面。 按下PostgreSQL后端服务,然后在页面加载时按右侧的“ 发送自定义服务通知 ”。

Nagios  - 自定义服务通知

键入您选择的注释,然后按 提交” ,然后按“ 完成” 您将立即在Slack中收到新消息。

Slack  - 来自Nagios的状态警报

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

结论

您现在已将Nagios Core配置为监视托管的PostgreSQL数据库并向Slack报告任何状态更改和事件,因此您将始终处于数据库发生的循环中。 这将使您能够在紧急情况下迅速做出反应,因为您将实时获取状态Feed。

如果您想了解有关check_postgres功能的更多信息,请查看其文档 ,您可以在其中找到更多可以使用的命令。

有关使用PostgreSQL托管数据库可以执行的操作的更多信息,请访问产品文档