如何在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
连接服务文件可以容纳多个数据库连接信息组。 通过将组名放在方括号中来表示组的开始。 之后是连接参数(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 中创建监控服务
现在,您将配置 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
应该被监视。
关于通知选项,每个服务都指定当服务状态变为 WARNING
、UNKNOWN
、CRITICAL
、OK
(从停机时间),服务启动时 摆动 ,或计划停机时间开始或结束时。 如果没有明确地给这个选项一个值,除非手动触发,否则根本不会发送通知(给可用的联系人)。
保存并关闭文件。
接下来,您需要通过编辑常规 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_channel
和 host_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 托管数据库做什么的更多信息,请访问 产品文档 。