如何在Ubuntu18.04上使用NagiosCore监控托管的PostgreSQL数据库

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。

介绍

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

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

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

先决条件

  • 具有 root 权限和辅助非 root 帐户的 Ubuntu 18.04 服务器。 您可以按照 这个初始服务器设置指南 进行设置。 对于本教程,非 root 用户是 sammy
  • Nagios Core 安装在您的服务器上。 为此,请完成 如何在 Ubuntu 18.04 上安装 Nagios 4 并监控您的服务器教程的前五个步骤。
  • DigitalOcean 提供了一个 DigitalOcean 帐户和一个 PostgreSQL 托管数据库 ,并提供了可用的连接信息。 确保您的服务器的 IP 地址在白名单中。 要了解有关 DigitalOcean 托管数据库的更多信息,请访问 产品文档
  • 一个具有完全访问权限的 Slack 帐户,已添加到您希望接收状态更新的工作区。

第 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

输出将如下所示:

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

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

/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

在这里,您通过参数 --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 中创建监控服务

现在,您将配置 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 代表兆字节等等,最高可达艾字节 (EB)。 没有容量单位的数字被视为以字节表示。

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

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

添加以下行,将 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

输出的结尾将类似于以下内容:

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 状态。 您将在 Status Information 列下看到命令输出。 您可以单击服务名称并查看有关其状态和可用性的详细信息。

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

第 4 步 — 配置 Slack 警报

在本节中,您将配置 Nagios 以通过 Slack 向您发出事件警报,方法是将事件发布到您工作区中所需的通道中。

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

然后,转到 Slack 应用程序目录中的 Nagios 应用程序,然后按 添加配置 。 您将看到一个用于添加 Nagios 集成的页面。

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

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

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 脚本。 您现在将继续使用此脚本配置 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 联系人启用警报,您需要将其添加到 admin 联系人组中,该联系人组在 contacts.cfg 配置文件中定义,位于 [X169X 下]。 通过运行以下命令打开它进行编辑:

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.cfg 中的 enable_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

输出的结尾将如下所示:

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 界面发送自定义通知。 在浏览器中重新加载 Nagios Services 状态页面。 点击PostgreSQL Backends服务,页面加载后点击右侧的Send custom service notification

输入您选择的评论并按 Commit,然后按 Done。 您将立即在 Slack 中收到一条新消息。

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

结论

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

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

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