Monit 笔记

Monit 笔记

96 藤原豆腐店 关注html

 0.1 2017.06.29 21:08* 字数 1472 阅读 937评论 0喜欢 1node

文章已经放到个人 github 上git

0. 开始以前

  • 本文主要基于 Monit 官方文档, 所以跟偏向于速查手册
  • 整理 Monit 相关知识用于公司内部技术分享
  • 生产环境上主要用于进程监控和系统资源监控, 报警使用 邮件 和 shell + bearychat
  • 我的能力有限, 若有错误欢迎指出

1. Monit 是什么

  • Monit 是一个管理和监控 Unix 系统的小型开源组件.
  • Monit 能够在出现错误的状况下, 自动维护, 修复和作一些有意义的行为

2. 为何选择 Monit

除了 Monit 还有一些其余的第三方监控方案(eg. Supervisor), 咱们考虑选择额 Monit 做为监控的缘由有github

  • 超轻量, 稳定, 高可用
  • 依赖少, 安装配置方便, 尽可能减小运维及学习成本(即便没有任何 Monit 基础的人, 都能轻易的读懂大部分监控文件)
  • 非侵入式, 被监控的程序能够不用知道监控程序的存在(若是使用 Supervisor 监控, 则服务必须从 Supervisor 启动)
  • 基本功能完备(9 种类型监控, 邮件报警, 支持用户自定义 shell 扩展)

3. Monit 使用

3.1 概述

想要让 Monit 可靠的为咱们工做, 学习成本很是低, 只须要学习一些 Monit 命令行和配置文件写法shell

3.2 命令行

3.2.1 经常使用命令安全

# options - 选项
- monit
- monit -t
- monit -c /var/monit/monitrc  # 指定配置文件
- monit -g <groupname> start/stop # Monit 能够对各个监控分组, 若是须要对某个分组统一操做, 能够用这个命令

# arguments - 参数
- monit reload
- monit quit
- monit start/stop/restart/monitor/unmonitor <name>/all  # <name>: 每一个监控都有一个独一无二的名字, 具体后面会提到; all: 全部监控服务

3.2.2 所有命令文档服务器

3.3 配置文件

3.3.1 概述并发

1. 配置文件 monitrc 优先级app

# Monit 查找配置文件的优先级按以下顺序

# 命令行指定
command-line

# 配置文件
~/.monitrc
/etc/monitrc
@sysconfdir@/monitrc  # 编译安装指定配置文件路径  eg: ./configure --sysconfdir /var/monit/etc
./monitrc

2. 配置文件权限less

  • 不能超过 0700 (u=xrw,g=,o=) 权限, 不然 Monit 会警告并退出

3. 配置文件支持字符

  • 关键字不区分大小写
  • 3 种: 语法字段, 十进制数字, 字符串
  • 字符串: 能够用双引号(能够包含空格)或者不用引号, 由字符和数字构成

4. 配置文件分层

  • 全局的 set 段
  • 全局的 include 段
  • 一个或多个 具体服务配置 段

3.3.2 服务监控配置文件格式

详细配置, 共计 9 种, 全部配置中, 都符合如下规则

  • 若是指定的 path 不存在, 并且配置块里包含 start 方法, 会调用这个 start 方法
  • 若是 path 指定的文件类型不对, Monit 不能监控这个项目

1. Process

CHECK PROCESS <unique name> <PIDFILE <path> | MATCHING <regex>>

<path> pid-file 的绝对路径. 不存在 pid-file 文件或者 pid-file 文件没有对应的正在运行的程序, Monit 会执行 start 方法

<regex> 进程名称的正则表达来监控进程, 能够经过命令行测试正则是否写对了: monit procmatch "regex-pattern"

2. File

CHECK FILE <unique name> PATH <path>

<path> file 的绝对路径.

3. Fifo

CHECK FIFO <unique name> PATH <path>
<path> fifo 的绝对路径.

4. Filesystem

CHECK FILESYSTEM <unique name> PATH <path>
<path> 设备/磁盘, 挂载点的路径 或 NFS/CIFS/FUSE 连接字符串. 若是文件系统不可用, Monit 会执行 start 方法

5. Directory

CHECK DIRECTORY <unique name> PATH <path>

<path> 目录问价的绝对路径

6. Remote host

CHECK HOST <unique name> ADDRESS <host>

<host> 能够是域名或者 IP 地址. eg: "tildeslash.com" or "64.87.72.95".

7. System

CHECK SYSTEM <unique name>

<unique name> 一般来讲是本机名称(能够用 $HOST), 也能够是其余名称. 用于邮件报警或者 M/Monit 的初始化名称
这类配置能够监控系统资源(CPU, memory, load average...)

8. Program

CHECK PROGRAM <unique name> PATH <executable file> [TIMEOUT <number> SECONDS]

<path> 可执行程序或脚本的绝对路径. 容许检查程序退出状态.若是程序没能在 <number> 秒内执行完成, Monit 会终结这个程序, 默认是 300s
程序的输出会被记录, 用于用户界面或者报警, 默认 512 bytes(能够经过 set limits 修改)

9. Network

CHECK NETWORK <unique name> <ADDRESS <ipaddress> | INTERFACE <name>>

# <ipaddress> 是被监控的 IPv4/IPv6 网卡地址. 用 eth0 也是能够的

3.3.3 全局配置

1. 设置日志路径:

SET LOGFILE

2. 守护进程模式:

SET DAEMON <seconds>
    [[WITH] START DELAY <seconds>]

第一个 <seconds> 监控周期
第二个 <seconds> 多少时间后开始监控 - 开机启动时候比较有用

命令行:
    monit - 若是已经有后台守护 Monit 进程, 发送唤醒信号给守护进程的 Monit, 马上开始检查
    monit quit - 关闭后台守护 Monit 进程

3. HTTPD

- 能够经过过页面作一些操做(查看状态/控制监控服务)
    默认: http://localhost:2812/

- 若是关闭可能影响某些功能
    monit status

- 强烈建议开启
    若是安全敏感性比较高, 绑定本机访问
    能够设定只读帐号 `read-only`

4. 报警

Monit 提供邮件报警, 若是有其余报警方案, 能够经过本身实现 shell 脚原本扩展功能, 好比咱们就经过 shell 脚本向第三方实时通信软件 bearychat 发消息, 实现手机端的推送, 这里主要描述邮件报警的相关配置

  • 设定/取消报警
set alert foo@bar  # 默认报警邮箱, 若是有多个, 能够写多个
set alert foo1@bar

check ....
    noalert foo@bar
  • 自定义邮件格式
set mail-format {
    from: Monit Support <monit@foo.bar>
    reply-to: support@domain.com
    subject: $SERVICE $EVENT at $DATE
    message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
             Yours sincerely,
             monit
}

可用变量

$EVENT
$SERVICE
$DATE
$HOST
$ACTION
$DESCRIPTION
  • 配置邮件服务器和队列
须要配置邮件服务器和队列

SET MAILSERVER
<hostname|ip-address>
[PORT number]
[USERNAME string] [PASSWORD string]
[using SSL [with options {...}]
[CERTIFICATE CHECKSUM [MD5|SHA1] <hash>],
...
[with TIMEOUT X SECONDS]
[using HOSTNAME hostname]

多个服务器能够用逗号隔开, Monit 会依次尝试, 直到找到可用的
若是没有可用的邮件服务器, 会存在本地文件系统的队列里, 等待下一次尝试(队列内部信息是持久化的)

SET EVENTQUEUE BASEDIR <path> [SLOTS <number>]

<path> 存储队列的目录
<number> 限定队列的长度

若是一台机器上运行多个 Monit 实例, 请确保队列使用不一样的文件目录

5. 服务内 start/stop 方法

<START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

check process mmonit with pidfile /usr/local/mmonit/mmonit/logs/mmonit.pid
    start program = "/usr/local/mmonit/bin/mmonit" as uid "mmonit" and gid "mmonit" with timeout 60 seconds

默认是 30s 的尝试 start/stop, 失败后会放弃尝试并打印错误信息, 全局设定是经过 SET LIMITS

6. 监控分组

monit -g <groupname> start/stop/restart

check process mmonit with pidfile /usr/local/mmonit/mmonit/logs/mmonit.pid
    GROUP groupname
    GROUP groupname1

7. 报警模式

MODE <ACTIVE | PASSIVE>

ACTIVE: 默认, 尝试重启服务, 发报警
PASSIVE: 不会尝试重启服务, 只会发报警

8. 开机行为

ONREBOOT <START | NOSTART | LASTSTATE>

START: Monit 老是启动全部监控, 不论服务在重启前是不是中止的状态
NOSTART: 永远不会自动启动监控服务. 用于一些高可用场景(XXX)

这块理解描述可能不许, 原文:

In nostart mode, the service is never started automatically after reboot. This mode is intended for a high-availability solutions with active/passive clusters. For example, a service group HA, consisting of e.g. a mobile IP alias and an application server, is started on host H1, host H2 is backup and heartbeat is in place between both hosts. The service group HA must be started on one node only. If H1 dies, H2 takes over the HA group. If H1 reboots, it is important that it won't try to start the HA group also. Even though the group was active on H1 before it crashed, as HA is running on H2 now.

LASTSTATE: 保持以前状态

9. 尝试服务重启重试次数

IF <number> RESTART <number> CYCLE(S) THEN <action>

if 2 restarts within 3 cycles then unmonitor
if 5 restarts within 5 cycles then exec "/foo/bar"

10. 依赖

DEPENDS on service[, service [,...]]

WEB-SERVER(a) -> APPLICATION-SERVER(b) -> DATABASE(c) -> FILESYSTEM(d)

当前没有服务启动
    启动顺序: d, c, b, a

当前全部服务都启动
    (monit stop all) 中止顺序: a, b, c, d;
    (monit stop d) a, b, c 也会被中止, 由于依赖 d

若是 a 没有启动
    Monit 会启动 a

若是 b 没有启动
    Monit 会中止 a, 启动 b, 最后启动 a

若是依赖包含循环或者不包含被依赖的服务, 会通告并退出

能够同时依赖多个服务
在 stop/start/monitor/unmonitor 的时候会检查 DEPENDS 语句里的服务

若是服务 stop/unmonitor, 则会 stop/unmonitor 任何依赖这个服务的服务
若是服务 start, 全部该服务依赖的服务都会先 started, 而后在 start 这个服务
若是服务 restart, 关闭依赖该服务的全部服务, 在这个服务正常启动后, 会启动 restart 以前是活跃状态的服务

11. Monit 自己相关的配置 LIMITS

SET LIMITS {
    PROGRAMOUTPUT:     <number> <unit>,
    SENDEXPECTBUFFER:  <number> <unit>,
    FILECONTENTBUFFER: <number> <unit>,
    HTTPCONTENTBUFFER: <number> <unit>,
    NETWORKTIMEOUT:    <number> <timeunit>
    PROGRAMTIMEOUT:    <number> <timeunit>
    STOPTIMEOUT:       <number> <timeunit>
    STARTTIMEOUT:      <number> <timeunit>
    RESTARTTIMEOUT:    <number> <timeunit>
}

unit is "B" (byte), "kB" (kilobyte) or "MB" (megabyte) timeunit is "MS" (millisecond) or "S" (second)

12. ACTION

Monit 监控以后能够作的行为

ALERT: 发报警
RESTART: 重启并发报警(注册的 restart 方法, 若是没有, 则先 stop 再 start)
START: 启动并发报警(注册的 start 方法)
STOP: 关闭服务并发报警, 关闭以后不会再被 Monit 检查, 重启 Monit 也不会监控这个服务, 只能从网页或者控制台再次开启 (注册的 stop 方法)
EXEC: 执行指定的脚本并报警, 能够指定用户(须要以 root 权限启动), 能够设定屡次检查周期做为一个周期
    if failed <test> then exec "/usr/local/bin/sms.sh"
        as uid nobody and gid nobody
        repeat every 5 cycles
UNMONITOR: 再也不监控并发报警, 关闭以后不会再被 Monit 检查, 重启 Monit 也不会监控这个服务, 只能从网页或者控制台再次开启

13.容许必定的监控公差

FOR

<X> CYCLES ...
or
<Y> [TIMES WITHIN] <Z> CYCLES ...


if failed
    port 80
    for 3 cycles
then alert

if failed
    port 80
    for 3 times within 5 cycles
then alert

<X> X 个周期连续符合条件
<Y/Z> Z 个周期内有 Y 次符合条件

cycles 最大值为 64

14. 一些判断条件的语法, 写在 CHECK 中

# process/file/directory/filesystem/fifo
IF [DOES] NOT EXIST THEN <action>
IF [DOES] EXIST THEN <action>

# system/process
IF <resource> <operator> <value> THEN <action>
    <resource>:  "CPU", "TOTAL CPU", "CPU([user|system|wait])", "MEMORY", "SWAP", "THREADS", "CHILDREN", "TOTAL MEMORY", "LOADAVG([1min|5min|15min])"
    <operator>:  "<", ">", "!=", "==" in C notation, "gt", "lt", "eq", "ne" in shell sh notation and "greater", "less", "equal", "notequal" in human readable form (if not specified, default is EQUAL)

# process
IF DISK READ [RATE] <operator> <number> <unit>/S THEN action
IF DISK READ <operator> <number> operations/S THEN action
IF DISK WRITE <operator> <number> <unit>/S THEN action
IF DISK WRITE <operator> <number> operations/S THEN action

# file
IF FAILED [MD5|SHA1] CHECKSUM [EXPECT checksum] THEN action
IF CHANGED [MD5|SHA1] CHECKSUM THEN action
# test the content of a text file
IF CONTENT <operator> <regex|path> THEN action  # 默认只有 511 字符被监控, 能够用 limit 设置该值的大小
IGNORE CONTENT <operator> <regex|path>  # 被 IGNORE 命中的行不被监控

# file/fifo/directory
IF TIMESTAMP [[operator] value [unit]] THEN action
IF CHANGED TIMESTAMP THEN action

# file
IF SIZE [[operator] value [unit]] THEN action
IF CHANGED SIZE THEN action

# filesystem
IF CHANGED FSFLAGS THEN action
IF SPACE operator value unit THEN action
IF SPACE FREE operator value unit THEN action

# filesystem
IF INODE(S) operator value [unit] THEN action
IF INODE(S) FREE operator value [unit] THEN action

# filesystem
IF READ [RATE] <operator> <number> <unit>/S THEN action
IF READ [RATE] <operator> <number> operations/S THEN action
IF WRITE [RATE] <operator> <number> <unit>/S THEN action
IF WRITE [RATE] <operator> <number> operations/S THEN action

# Service Time is the time taken to complete a read or a write operation
IF SERVICE TIME <operator> <number> <unit> THEN action

# file/fifo/directory/filesystem
IF FAILED PERM(ISSION) octalnumber THEN action
IF CHANGED PERM(ISSION) THEN action

IF FAILED [E]UID user THEN action
IF FAILED GID group THEN action
IF CHANGED PID THEN action
IF CHANGED PPID THEN action

# process/system
IF UPTIME [[operator] value [unit]] THEN action

# program
IF STATUS operator value THEN action
IF CHANGED STATUS THEN action

# network
IF FAILED LINK THEN action
IF CHANGED LINK [CAPACITY] THEN action
IF SATURATION operator value% THEN action
IF UPLOAD operator value unit/S THEN action
IF DOWNLOAD operator value unit/S THEN action
IF TOTAL UPLOADED operator value unit IN LAST number time-unit THEN action
IF TOTAL DOWNLOADED operator value unit IN LAST number time-unit THEN action
IF UPLOAD operator value PACKETS/S THEN action
IF DOWNLOAD operator value PACKETS/S THEN action
IF TOTAL UPLOADED operator value PACKETS IN LAST number time-unit THEN action
IF TOTAL DOWNLOADED operator value PACKETS IN LAST number time-unit THEN action
IF FAILED PING[4|6]
    [COUNT number]
    [SIZE number]
    [TIMEOUT number SECONDS]
    [ADDRESS string]
THEN action

# process/host
## TCP/UDP
    IF FAILED
    [HOST string]
    <PORT number>
    [ADDRESS string]
    [IPV4 | IPV6]
    [TYPE <TCP|UDP>]
    [<SSL|TLS> [with options {...}]
    [CERTIFICATE CHECKSUM [MD5|SHA1] string]
    [CERTIFICATE VALID for number DAYS]
    [PROTOCOL protocol | <SEND|EXPECT> "string",...]
    [TIMEOUT number SECONDS]
    [RETRY number]
THEN action
## SOCKET
IF FAILED
    <UNIXSOCKET path>
    [TYPE <TCP|UDP>]
    [PROTOCOL protocol | <SEND|EXPECT> "string",...]
    [TIMEOUT number SECONDS]
    [RETRY number]
THEN action
## Specific protocol test options
[<SEND|EXPECT> "string"]+
PROTO(COL) HTTP
    [USERNAME "string"]
    [PASSWORD "string"]
    [REQUEST "string"]
    [STATUS operator number]
    [CHECKSUM checksum]
    [HTTP HEADERS list of headers]
    [CONTENT < "=" | "!=" > STRING]
## MySQL
PROTOCOL MYSQL [USERNAME string PASSWORD string]
## SIP
PROTOCOL SIP [TARGET valid@uri] [MAXFORWARD n]
## SMTP
PROTOCOL SMTP[S] [USERNAME string PASSWORD string]
PROTOCOL WEBSOCKET
[REQUEST string]
    [HOST string]
    [ORIGIN string]
    [VERSION number]

3.3.4 include 配置

INCLUDE <globstring>

<globstring> 按照 glob(7) 规范, 若是匹配到目录而不是文件, 会忽略
被 include 的文件也能够 include 其余文件
若是 <globstring> 能匹配到多个, 引入没有特定的顺序, 若是你真的须要按照某些顺序, 请按顺序 include 每一条记录

3.4 高级用法

3.4.1 环境变量

你本身实现 shell 扩展的时候, 能够经过如下环境变量获取当前 Monit 监控到的问题的详细信息

- MONIT_SERVICE

# only available for service

- MONIT_DESCRIPTION
- MONIT_DATE
- MONIT_HOST

# only available for process

- MONIT_PROCESS_PID
- MONIT_PROCESS_MEMORY
- MONIT_PROCESS_CHILDREN
- MONIT_PROCESS_CPU_PERCENT

# only available for program

- MONIT_PROGRAM_STATUS

3.4.2 信号量

  • SIGUSR1 唤醒并检查全部检查项目
  • SIGTERM/SIGINT 平滑关闭守护进程
  • SIGHUP 从新初始化 -从新读取配置文件, 关闭并重开日志

4 更多

小礼物走一走,来简书关注我

相关文章
相关标签/搜索