作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
数据库监控是了解数据库随着时间的推移如何运作的关键。它可以帮助您发现隐藏的使用问题和数据库中发生的瓶颈。实施数据库监控系统可以很快成为一个长期优势,这将对您的基础设施管理过程产生积极影响。
Nagios Core是一个流行的监控系统,您可以使用它来监控您的管理数据库。用于此任务使用Nagios的优点是其多功能性 - 易于配置和使用 - 一个庞大的存储库 可用的插件,最重要的是,集成警报。
在本教程中,您将使用 check_postgres
Nagios 插件在 Nagios Core中设置 PostgreSQL 数据库监控,并设置基于 Slack 的警报。
前提条件
- 具有 root 特权的 Ubuntu 18.04 服务器和次要的非 root 帐户. 您可以通过遵循 此初始服务器设置指南来设置此服务器。 对于本教程,非 root 用户是
sammy
。 - Nagios Core 安装在您的服务器上。 要做到这一点,请完成 如何安装 Nagios 4 并在 Ubuntu 18.04 上监控您的服务器 教程的前五步。
- 一个 DigitalOcean 帐户和一个 [PostgreSQL 管理的] 数据库(https://www.digitalocean.com/products/managed-databases/) 由 DigitalOcean 提供连接信息。 确保您的服务器的 IP 地址在 whistitel 上。 有关更多关于 DigitalOcean
步骤 1 — 安装 check_postgres
在本节中,您将从Github下载最新版本的check_postgres
插件,并将其提供给Nagios Core,您还将安装PostgreSQL客户端(psql
),以便check_postgres
能够连接到您的管理数据库。
开始安装 PostgreSQL 客户端,运行以下命令:
1sudo apt install postgresql-client
接下来,您将下载‘check_postgres’到您的主目录. 首先,导航到它:
1cd ~
转到 Github 发布页面并复制插件的最新版本的链接. 在写作时,最新版本的 check_postgres
是 2.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
主机和服务列表,以及其当前状态:
它们都将很快变为绿色,显示OK
状态,您将在状态信息
列下看到命令输出,您可以点击服务名称并查看其状态和可用性的详细信息。
您已将check_postgres
命令、主机和多个服务添加到您的 Nagios 安装中,以监控您的数据库,您还通过 Nagios Web 界面检查服务是否正常工作。
步骤 4 – 配置 Slack 警报
在本节中,您将配置 Nagios 以通过 Slack 通知您发生的事件,将它们发布到您工作区的所需渠道中。
在开始之前,在 Slack 上登录您想要的工作区,并创建两个渠道,您希望从 Nagios 接收状态消息:一个用于主机,另一个用于服务通知。
然后,转到 Slack App Directory 中的 Nagios 应用程序并点击 ** 添加配置**. 您将看到添加 Nagios 集成的页面。
当页面加载时,向下滚动并记住代币,因为您将需要它进一步。
您现在将在您的服务器上安装并配置 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 以通过 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_channel
和host_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**
服务,并在页面加载时按一下右侧的发送自定义服务通知**
。
输入您选择的评论,然后按 Commit,然后按 Done。
您现在已经将 Slack 与 Nagios 集成,因此您将立即收到有关关键事件和状态变化的消息,您还通过从 Nagios 中手动触发事件来测试集成。
结论
现在,您已经配置了 Nagios Core 来监控您的受管理的 PostgreSQL 数据库,并向 Slack 报告任何状态变化和事件,因此您将始终保持数据库发生的事情的循环。
如果您想了解更多关于 check_postgres 的功能,请查看其 docs,在那里您可以找到更多可以使用的命令。
有关您可以使用 PostgreSQL 管理数据库的更多信息,请访问 产品文档。