- 指标监控
- 可观测性
- 告警
- 运维
【免费下载链接】zabbix
Real-time monitoring of IT components and services, such as networks, servers, VMs, applications and the cloud.
导读
本文以官方模板 templates/app/memcached/README.md 为骨架,结合仓库内 Zabbix agent 2 的 Memcached 插件源码,完整讲解如何零脚本地接入并监控 Memcached 服务。你将掌握模板的宏与监控项设计、memcached.ping/memcached.stats两类键的底层机制、连接会话配置方法,以及全部 8 条内置触发器的告警含义,可直接落地到生产环境。
模板概述:零外部脚本的 Memcached 监控
该模板专为通过Zabbix agent 2监控 Memcached 设计,官方定位是"effortless deployment"——即部署过程不依赖任何外部脚本,所有数据采集均由 agent 2 内建的 Memcached 插件完成(参见插件文档 src/go/plugins/memcached/README.md)。
适用版本要求:
- Zabbix 版本:8.0 及以上(模板 YAML 头部的
zabbix_export: version: '8.0'同样印证这一点,见 template_app_memcached.yaml); - 已测试的 Memcached 版本:1.4、1.5、1.6。插件侧对支持的版本描述为 "Memcached, version 1.4+",与模板测试范围一致。
模板使用前,请先按照 Zabbix 官方手册中 "Templates out of the box"(开箱即用模板)章节的流程完成模板导入、链接到主机等前置配置。本文其余章节将围绕模板内部设计与插件实现展开。
工作原理:agent 2 与 Memcached 插件如何协作
模板的所有数据都来自插件注册的两个指标键。这两个键在 metrics.go 中定义:
| 键 | 作用 | 返回 |
|---|---|---|
memcached.ping[<通用参数>] | 探测连接是否存活 | 存活返回1,任何错误(含认证失败、配置错误)返回0 |
memcached.stats[<通用参数>[,type]] | 执行 Memcached 的stats命令并序列化为 JSON | JSON 字符串 |
其中memcached.stats的type参数支持items、sizes、slabs、settings四种取值,默认为空(即通用统计)。模板中的"Get status"监控项正是以memcached.stats["{$MEMCACHED.CONN.URI}"]作为主监控项(master item),其余全部监控项作为依赖项(Dependent item),通过 JSON Path 预处理从主项返回的 JSON 中抽取各自字段。这就是模板整体数据流的核心:一次stats请求,喂给二十多个派生监控项。
从实现上看,请求链路为:Export(memcached.go)→ 参数解析与默认值填充 →getHandlerFunc分发到pingHandler或statsHandler(handler_ping.go、handler_stats.go)。statsHandler调用连接层conn.Stats(params["Type"])拿到mc.McStats后json.Marshal输出;pingHandler通过conn.NoOp()探测连接,失败即返回0。
值得注意的底层设计(conn.go):
- 连接复用:插件按
uri.URI维护连接池(ConnManager),连接保持打开状态以降低网络抖动、延迟、CPU 与内存开销; - 连接保活(KeepAlive):默认 300 秒内未被访问的连接会被关闭;后台 housekeeper 每 10 秒巡检一次;
- 连接参数:
Retries: 2、Failover: true、PoolSize: 1、启用 TCP keepalive 与TcpNoDelay。
这些机制决定了模板拉取数据开销极低,适合高频轮询场景。
部署准备与连通性验证
1. 确认 agent 2 已编译 Memcached 插件
插件随 Zabbix agent 2 一同发布,无需单独安装步骤(插件 README)。部署时确保 agent 2 二进制包含 Memcached 插件,并在 agent 配置文件中按需调整以下选项:
| 配置项 | 说明 | 默认值 | 取值范围 |
|---|---|---|---|
Plugins.Memcached.KeepAlive | 空闲连接关闭前等待时间 | 300 秒 | 60–900 |
Plugins.Memcached.Timeout | 单次请求最大等待时间 | 等于全局Timeout | 1–30 |
注意:
Plugins.Memcached.Timeout已被标记为deprecated,仅用于兼容 7.0 版本之前的 Zabbix 服务器请求。在 config.go 中可以看到,若设置了该旧选项,其值会回填到Default.ConnectionTimeout。新环境请通过全局Timeout或会话级ConnectionTimeout控制超时。
2. 测试连通性
模板 README 给出的标准验证命令:
zabbix_get -s memcached-host -k memcached.ping返回1表示连接正常;返回0则说明 agent 无法与 Memcached 实例建立连接(可能原因包括网络不通、认证失败、配置错误等,详见插件pingHandler的实现 handler_ping.go)。
3. 连接串(URI)格式约束
连接既可通过键参数直接指定,也可通过命名会话(named sessions)配置。URI 语法约束如下(插件 README):
- 仅支持
tcp与unix两种网络 schema(metrics.go中AllowedSchemes: []string{"tcp", "unix"}硬性校验); - 默认 URI 为
tcp://localhost:11211(uriDefaults中Scheme: "tcp", Port: "11211"); - 禁止在 URI 内嵌用户名密码(userinfo 会被忽略并报错),正确做法是把用户名密码作为独立参数传入:
- 错误写法:
memcached.ping[tcp://user:password@127.0.0.1] - 正确写法:
memcached.ping[tcp://127.0.0.1,user,password]
- 错误写法:
- 合法 URI 示例:
tcp://127.0.0.1:11211、tcp://localhost、localhost、unix:/var/run/memcached.sock、/var/run/memcached.sock; - 凭据长度上限为 252 字符(
maxEntryLen = 252)。
4. 使用命名会话管理多实例
当需要同时监控多个 Memcached 实例(如 Prod 与 Test)时,推荐在 agent 配置文件中定义会话:
Plugins.Memcached.Sessions.Prod.Uri=tcp://192.168.1.1:11211 Plugins.Memcached.Sessions.Prod.User=<UserForProd> Plugins.Memcached.Sessions.Prod.Password=<PasswordForProd> Plugins.Memcached.Sessions.Prod.ConnectionTimeout=10 Plugins.Memcached.Sessions.Test.Uri=tcp://192.168.0.1:11211 Plugins.Memcached.Sessions.Test.User=<UserForTest> Plugins.Memcached.Sessions.Test.Password=<PasswordForTest> Plugins.Memcached.Sessions.Test.ConnectionTimeout=30随后在键的第一个参数位置直接使用会话名代替 URI:
memcached.ping[Prod] memcached.ping[Test]会话参数由 config.go 中的session结构定义,支持Uri、User、Password、ConnectionTimeout四项,其中ConnectionTimeout仅能作为会话参数或全局默认值设置。会话名区分大小写。相比把凭据写进监控项键或宏,命名会话是更安全的凭据存放方式。
宏(Macros)详解
模板共定义 5 个宏(与 YAML 中macros段一一对应,template_app_memcached.yaml):
| 宏名 | 描述 | 默认值 |
|---|---|---|
{$MEMCACHED.CONN.URI} | URI 格式连接串(不使用密码)。若已设置,将覆盖配置文件Plugins.Memcached.Uri选项;否则使用插件默认值tcp://localhost:11211 | tcp://localhost:11211 |
{$MEMCACHED.CONN.THROTTLED.MAX.WARN} | 每秒被节流(throttled)连接数的告警上限 | 1 |
{$MEMCACHED.CONN.QUEUED.MAX.WARN} | 每秒排队连接数的告警上限 | 1 |
{$MEMCACHED.CONN.PRC.MAX.WARN} | 已连接客户端占比(百分比)告警上限 | 80 |
{$MEMCACHED.MEM.PUSED.MAX.WARN} | 内存使用率(百分比)告警上限 | 90 |
在 YAML 宏定义中,{$MEMCACHED.CONN.URI}被标记为required: YES,即部署时必须显式填写实际 Memcached 地址;其余阈值类宏均附带了数字正则校验(^-?([0-9]+|(([0-9]+)\.([0-9]+)))$),其中两个百分比宏的合法范围为 0–100 闭区间。多实例场景可借助主机级宏覆盖实现同一模板监控不同目标。
监控项(Items)完整清单
模板由 1 个主监控项 + 25 个依赖监控项组成。主监控项Get status(memcached.stats["{$MEMCACHED.CONN.URI}"])不保存历史(history: '0'),仅作为 JSON 数据源;其余依赖项通过 JSON Path 抽取字段,并按需叠加"每秒变化率(Change per second)"或"心跳去重(Discard unchanged with heartbeat)"预处理。
连接类(connections)
| 监控项名称 | 键 | JSON Path / 预处理 | 说明 |
|---|---|---|---|
| Max connections | memcached.connections.max | $.max_connections,30m 去重 | 最大并发连接数 |
| Open connections | memcached.connections.current | $.curr_connections | 当前已连接客户端数 |
| Connection structures | memcached.connections.structures | $.connection_structures | 服务端分配的连接结构数量 |
| New connections per second | memcached.connections.rate | $.total_connections+ Change per second | 每秒新建连接数 |
| Queued connections per second | memcached.connections.queued.rate | $.listen_disabled_num+ Change per second | 达到连接上限后监听器被禁用、连接进入队列的次数 |
| Throttled connections | memcached.connections.throttled.rate | $.conn_yields+ Change per second | 客户端连接被节流的次数(批量 GET 且单连接请求数超过-R参数限制时,为防饥饿会节流) |
缓存与内存类(cache / memory / keyspace)
| 监控项名称 | 键 | JSON Path / 预处理 | 说明 |
|---|---|---|---|
| Maximum number of bytes | memcached.config.limit_maxbytes | $.limit_maxbytes,30m 去重 | 缓存允许的最大字节数(可在配置文件或启动命令行调整) |
| Bytes used | memcached.stats.bytes | $.bytes | 当前存储条目占用的字节数 |
| Current number of items stored | memcached.stats.curr_items | $.curr_items | 当前实例存储的条目总数 |
| New items per second | memcached.stats.total_items.rate | $.total_items+ Change per second | 每秒新增存储条目数 |
| Evictions per second | memcached.stats.evictions.rate | $.evictions+ Change per second | 每秒淘汰条目数。当条目仍存活却被移除以为新条目腾空间时发生,采用伪 LRU 机制;高淘汰率伴随低命中率通常意味着应用写入了大量不再使用的键 |
命令类(commands)
| 监控项名称 | 键 | JSON Path / 预处理 | 说明 |
|---|---|---|---|
| Commands: GET per second | memcached.commands.get.rate | $.cmd_get+ Change per second | 每秒收到的 GET 请求数 |
| Commands: SET per second | memcached.commands.set.rate | $.cmd_set+ Change per second | 每秒收到的 SET 请求数 |
| Commands: FLUSH per second | memcached.commands.flush.rate | $.cmd_flush+ Change per second | flush_all命令会使数据库中所有条目失效,带来性能惩罚,生产环境不应出现,可用于发现调试脚本 |
请求命中类(requests)
| 监控项名称 | 键 | JSON Path / 预处理 | 说明 |
|---|---|---|---|
| Hits per second | memcached.stats.hits.rate | $.get_hits+ Change per second | 每秒成功命中(请求且找到)的 GET 数 |
| Misses per second | memcached.stats.misses.rate | $.get_misses+ Change per second | 每秒未命中(请求但未找到)的 GET 数 |
网络类(network)
| 监控项名称 | 键 | JSON Path / 预处理 | 说明 |
|---|---|---|---|
| Read bytes per second | memcached.stats.bytes_read.rate | $.bytes_read+ Change per second | 网络读速率(B/sec) |
| Written bytes per second | memcached.stats.bytes_written.rate | $.bytes_written+ Change per second | 网络写速率(B/sec) |
CPU / 应用信息类(cpu / application / threads)
| 监控项名称 | 键 | JSON Path / 预处理 | 说明 |
|---|---|---|---|
| CPU user | memcached.cpu.user | $.rusage_user | Memcached 服务消耗的用户态 CPU(秒) |
| CPU sys | memcached.cpu.sys | $.rusage_system | Memcached 服务消耗的系统态 CPU(秒) |
| Process id | memcached.process_id | $.pid,1d 去重 | 服务进程 PID |
| Memcached version | memcached.version | $.version,1d 去重 | 服务版本号 |
| Uptime | memcached.uptime | $.uptime | 服务启动以来的秒数 |
| Threads | memcached.stats.threads | $.threads | 请求的工作线程数 |
补充:Ping 监控项
memcached.ping["{$MEMCACHED.CONN.URI}"]属于 agent 直采项,带有 10m 心跳去重预处理,并通过值映射 "Service state"(0=Down,1=Up)将数值转为可读状态。
YAML 中每个依赖项还带有component标签(如connections、commands、cpu、network、keyspace、memory、requests、application、threads、health、raw),便于后续在 Zabbix 中进行标签过滤与分类管理。
触发器(Triggers)与告警语义
模板内置 8 条触发器,覆盖可用性、容量、性能与变更通知四类场景,完整如下:
| 触发器名称 | 表达式 | 严重级别 | 说明 |
|---|---|---|---|
| Memcached: Service is down | last(/Memcached by Zabbix agent 2/memcached.ping["{$MEMCACHED.CONN.URI}"])=0 | Average | 服务不可达;需手动关闭 |
| Memcached: Failed to fetch info data | nodata(/Memcached by Zabbix agent 2/memcached.cpu.sys,30m)=1 | Warning | 30 分钟未收到数据;依赖"Service is down";需手动关闭 |
| Memcached: Too many queued connections | min(/Memcached by Zabbix agent 2/memcached.connections.queued.rate,5m)>{$MEMCACHED.CONN.QUEUED.MAX.WARN} | Warning | 连接数达上限,新连接被迫排队等待 |
| Memcached: Too many throttled connections | min(/Memcached by Zabbix agent 2/memcached.connections.throttled.rate,5m)>{$MEMCACHED.CONN.THROTTLED.MAX.WARN} | Warning | 节流连接数过高,需关注批量 GET 场景的-R限制 |
| Memcached: Total number of connected clients is too high | min(/Memcached by Zabbix agent 2/memcached.connections.current,5m)/last(/Memcached by Zabbix agent 2/memcached.connections.max)*100>{$MEMCACHED.CONN.PRC.MAX.WARN} | Warning | 当前连接数占上限百分比超阈值;达到max_connections后新连接会被拒绝 |
| Memcached: Memory usage is too high | min(/Memcached by Zabbix agent 2/memcached.stats.bytes,5m)/last(/Memcached by Zabbix agent 2/memcached.config.limit_maxbytes)*100>{$MEMCACHED.MEM.PUSED.MAX.WARN} | Warning | 内存使用率超过宏阈值 |
| Memcached: Version has changed | last(...memcached.version,#1)<>last(...memcached.version,#2) and length(last(...memcached.version))>0 | Info | 服务版本变更,需确认后手动关闭 |
| Memcached: Service has been restarted | last(/Memcached by Zabbix agent 2/memcached.uptime)<10m | Info | 运行时长小于 10 分钟,判定服务刚重启;需手动关闭 |
使用建议:容量类触发器(队列、节流、连接占比、内存占比)的阈值宏建议按业务压测结果调整,避免误报;"Failed to fetch info data" 因依赖关系仅在 "Service is down" 未触发时才独立告警,可有效抑制故障风暴。
开箱自带的图表与仪表盘
模板 YAML 中同时定义了 6 张内建图形与 1 个仪表盘,导入模板后即可直接查看:
- 图形:Memcached: Commands(get/set/flush 速率)、Memcached: Connections(max/current/structures)、Memcached: Connections rate(新建/节流/排队连接速率)、Memcached: Keyspace(命中/未命中速率)、Memcached: Network(读写速率)、Memcached: Uptime;
- 仪表盘:Memcached: Overview,包含上述 6 张图形的单页布局。
这些可视化直接复用依赖监控项的数据,无需额外配置,可在前端"仪表盘"中按需调整。
部署落地步骤(小结)
- 确认 Zabbix Server/前端版本为8.0+,agent 2 已包含 Memcached 插件;
- 在 agent 配置文件中按需设置
Plugins.Memcached.*选项或命名会话,重启 agent 2; - 执行
zabbix_get -s memcached-host -k memcached.ping验证返回1; - 在 Zabbix 前端导入 template_app_memcached.yaml,将其链接到目标主机;
- 将主机级宏
{$MEMCACHED.CONN.URI}覆盖为真实连接串(如tcp://127.0.0.1:11211或unix:/var/run/memcached.sock),并按需调整 4 个阈值宏; - 等待数个采集周期后,检查监控项是否产出数据、触发器是否正常复位。
故障排查
memcached.ping返回0:检查网络连通性、URI 格式(仅支持tcp/unix)、认证凭据(禁止 URI 内嵌凭据,长度 ≤ 252 字符);- 依赖监控项无数据:确认主监控项 "Get status" 是否在采集,必要时在监控项预处理中核对 JSON Path 字段名与 Memcached 版本输出是否一致;
- 需要更多细节时,提高 agent 的调试级别(DebugLevel),插件日志会随 agent 日志输出,包括连接创建与关闭记录(
conn.go中均有log.Debugf埋点); - 模板问题反馈渠道:Zabbix 官方支持站点与官方论坛(模板 README 的 Feedback 章节)。
- 指标监控
- 可观测性
- 告警
- 运维
【免费下载链接】zabbix
Real-time monitoring of IT components and services, such as networks, servers, VMs, applications and the cloud.
相关推荐
后端微服务分层架构实践:Routes → Controllers → Services → Repositories 全链路权威指南
后端微服务分层架构实践:Routes → Controllers → Services → Repositories 全链路权威指南 本篇技术指南源自仓库内 b
指标监控可观测性告警运维Zabbix 监控模板集合使用指南
Zabbix 监控模板集合使用指南 项目概览 Zabbix 监控模板集合是一个专为 Zabbix 监控系统设计的模板库,包含多种设备和服务的监控模板。该项目旨在
用一句自然语言指挥100+安全工具:AI安全测试平台CyberStrikeAI实战全解
用一句自然语言指挥100+安全工具:AI安全测试平台CyberStrikeAI实战全解 想象一下:这个季度有50个系统等着做安全评估,每一个都要过一遍信息收集、
指标监控可观测性告警运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考