使用 monit 监控 nfs

使用 monit 监控 nfs

我想使用 Monit 监控 NFS 挂载和 NFS 服务器进程。

在服务器上,我需要一个 PID 文件,但我似乎找不到使用现有配置文件创建该文件的方法。有没有办法做到这一点,或者是否有人以不同的方式监控服务器(检查端口 53 是否处于活动状态等)。

在客户端上,我考虑让 Monit 简单地在 NFS 安装中查找特定文件,如果该文件可访问,则一切正常。问题是,如果 NFS 服务器确实出现故障,文件请求通常会挂起(甚至可能无限期挂起,不确定)。如何通过 monit 解决此问题?

任何配置示例都将不胜感激!

答案1

至于NFS服务器故障时Monit进程的“挂起”,可以通过两种方法来规避。

  1. 您将 NFS 挂载选项从 更改hardsoft,这会导致 NFS 层在retrans重试后向访问应用程序发出 I/O 错误。因为这可能会导致与数据完整性相关的其他问题(您的写作应用程序需要能够应对 I/O 错误,或者至少能够干净地退出,而不会损坏写入的文件),您还可以尝试:
  2. 将您的检查与 Monit 异步化(将其解开)。您可以定义一个 cronjob 定期检查您的 NFS 挂载文件并写入另一个“NFS 状态文件”,例如写入 /tmp。这样,如果 NFS 服务器消失,则只有 cronjob 会挂起(而不是您的 Monit 客户端)。您的 Monit 检查现在只检查这个第二阶段的“NFS 状态文件”以及它是否比 cronjob 的频率要旧得多(这将表明 NFS 挂起)。

希望这可以帮助!

答案2

一般方法是(假设 Monit 内置规则均不适用)

  1. 了解如何进行检查手动
  2. 编写执行这些检查的 shell 脚本,返回 0 表示“成功”,返回 1 表示“失败”
  3. 让 Monit 测试这些脚本(示例来自官方文档):

    check program myscript with path "/usr/local/bin/myscript.sh"
       if status != 0 then alert
    

对于具体问题,这可能意味着

  • 服务器:这可能取决于您的操作系统、Linux 发行版、NFS 3 或 4 等,但应该很容易弄清楚。例如在 Ubuntu 12.04 上,我将通过以下方式测试 NFS 服务器是否正在运行

    $ service portmap status
    $ service nfs-kernel-server status
    

    如果两个命令都返回“运行”,则创建一个返回 0 的 shell 脚本。

  • 客户端:要检查某个 NFS 共享当前是否已安装,我主要使用 df -h。因此相应的 shell 脚本如下所示

    #! /bin/bash
    df -h | grep -q thesharename
    

答案3

我直接使用df测试,没有使用特定的脚本:

check program nfs-var with path "/bin/df -t nfs4 /var"
        if status != 0 then alert
        if status = 1 then exec "/bin/mount /var"

答案4

我想回复克拉斯,但我没有足够的声誉点。使用外部脚本的想法非常好,因为它提供了灵活性,并且建议使用 portmap 或 rpcinfo 来检查 nfs 服务器可用性非常聪明。

我发现了一个Github 上由 Thibaut Madelaine 编写的脚本我认为这对许多面临同样问题的人来说应该很有趣。他像这样使用 rpcinfo,rpcinfo -u 123.456.789.12 nfs 3其中 123.456.789.12 是您的 nfs 服务器的 ip 地址。

如果一切正常,响应将立即类似于program 100003 version 3 ready and waiting如果失败123.456.789.12: RPC: Program not registered。当然,我猜响应可能会因您的系统风格而异。

相关内容