实操笔记:为 NSQ 配置监控服务的心路历程
在 Go 语言实现的实时消息队列中, NSQ 的热度可以排第一。
NSQ 这款消息中间件简单易用,其设计目标是为在分布式环境下运行,为去中心化服务提供一个强大的基础架构。它具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。
NSQ 以分布式架构, 能够处理数亿级别的消息能力俘获了众多 gopher 的心。 我司也不例外,较多的业务都依赖 NSQ 做消息推送。今天我想和大家唠一唠关于 NSQ 监控的问题。
为什么要部署监控?
监控的重要性大家应该都清楚。没有监控的服务就是 “盲人骑瞎马,夜半临深池”。 这样讲可能有些抽象,我来给大家分享一个亲历的真实案例吧。
还记得那天,我正吃着火锅唱着歌,心里甭提有多美了,突然手机响了,打开一看,发现有客户反馈 CDN 刷新成功后未生效的问题。
火锅是不可能继续愉快地吃了,我抱起电脑一顿操作猛如虎,可惜结果不靠谱: 我查了系统调用链路上相关服务的日志,但是客户需要刷新的 URL 却没在日志中查到任务蛛丝马迹。那问题出在哪呢?

这块业务涉及到的服务调用示意图如上图所示。因为客户需求的紧急,我也把视线从沸腾的火锅收了回来,对着服务链路图沉思起来:
如图所示,用户成功提交了刷新请求说明请求流转到了 ohm 服务层,并且 ohm 成功处理了这个请求。
ohm 服务是刷新预热相关业务的 gateway,记录的是 ERROR 级的 log。没有在 ohm 的日志中查到 该请求的相关的记录,表明 ohm 向下游的 NSQ 推送消息的动作是成功的。
NSQ 对应的消费者是 purge 和 preheat 组件。purge 负责执行刷新动作,它记录的日志是 INFO 级,每一条刷新的 URL 它都会记录到日志中。 但是为什么在 purge 中却查不到相关日志?
刚才我就卡在了这里。问题的症结在于哪些情况下会在 purge 服务中查不到对应的日志。我大致列举了如下几种情况:
服务变更。purge 服务如果最近更新的代码如果有 Bug 可能导致了异常。但是我很快排除了这点,因为发布记录中,这个服务最近几个月都没人动过。
NSQ 坏了。这个更不靠谱,NSQ 是集群部署的,单点故障可以避免,全局故障的话恐怕公司群现在已经炸翻了天。
NSQ 没把消息发过来。但是 NSQ 是实时消息队列,消息投递应该很快,而且客户的刷新操作是在几个小时前了。
会不会因为 NSQ 消息堆积了,才没及时把消息投递过来呢?之前在测试环境没有发现此类问题,因为测试的量级与线上环境相比远远不够 ... 想到这,有点茅塞顿开的感觉。登录 NSQ 的控制台看对应的 Topic,果然问题出现在这,NSQ 上未投递的消息已经堆积了几亿条!
问题定位了,后续先通过内部工具先替客户解决问题就属于常规操作了,这里就不展开了。
监控部署落地
工单处理完了,我松了一口气,但是事情并没有告一段落。这个故障算是敲响了警钟:不能觉得 NSQ 性能不错就认为消息不会堆积了,必要的监控报警还是得安排上。
因为我司已经存在的基础设施,所以我决定使用 Prometheus 来监控 NSQ 服务。(Prometheus 的相关背景知识就不在这里科普了, 想看的请留言。)
Prometheus 通过 exporter 去采集第三方服务的数据,也就是说 NSQ 必须配置一个 exporter 才能接入 Prometheus。
Prometheus 的官方文档[https://prometheus.io/docs/instrumenting/exporters/]上对 exporter 有推荐,我顺着链接找到了官方推荐的 NSQ exporter[https://github.com/lovoo/nsq_exporter]。NSQ exporter 这个项目年久失修,最近的一次提交已经在 4 年前。

于是,我把这个项目拿到了本地,做了一些简单的改造, 使它支持 go mod。(PR 在这里[https://github.com/lovoo/nsq_exporter/pull/29])
NSQ exporter 部署完成后,接下来的问题是哪些指标需要监控?
参考官网[https://nsq.io/components/nsqadmin.html]我认为这些指标需要重点关注:
Depth:当前 NSQ 堆积的消息。NSQ 在内存中默认只保存 8000 消息,超过的消息会持久化到磁盘中。
Requeued:消息 requeue 的次数。
Timed Out:处理超时的消息。
Prometheus 建议配置 Grafana 更加直观地查看指标的变动情况,我配置大体的效果如下:

超时消息对应着 Timed Out 指标
堆积消息对应着 Depth 指标
负载是根据公式 sum(irate(NSQ_topic_message_count{}[5m])) 生成的。
探测服务是探测 NSQ exporter 服务是否正常。 因为该服务经常会因为 NSQ 压力过来导致 exporter 自身服务不可用。
自从 NSQ 配置监控服务后,我们能迅速感知 NSQ 当前状况,在报警发出后及时人工处理跟进。相关业务的稳定性有明显提升,此类问题引起的工单变少了;此外监控收集到的相关数据,让我们在接下来的性能优化工作中的思路更加清晰,方向更加明显。
实操笔记:为 NSQ 配置监控服务的心路历程的更多相关文章
- harbor安装实操笔记
纸上得来终觉浅,实操一遍吧! 把所有开发的后端服务先在打成镜像,传到私有镜像仓库: 然后在任意的远程机器拉取镜像,然后可采用docker或者docker-compose的方式运行,本节先按照docke ...
- SNMP学习笔记之Centos7配置SNMP服务
0x00 安装yum源安装SNMP软件包 1.yum源安装SNMP服务: yum -y install net-snmp net-snmp-utils 2.查看SNMP版本号: snmpd -v 0x ...
- 【实操笔记】MySQL主从同步功能实现
写在前边: 这两天来了个需求,配置部署两台服务器的MySQL数据同步,折腾了两天查了很多相关资料,一直连不上,后来发现其实是数据库授权的ip有问题,我们用的服务器是机房中的虚拟机加上反向代理出来的,坑 ...
- Hadoop1.2.1 全然分布式集群搭建实操笔记
前期准备工作: 1.改动Linux主机名:/etc/hostname ubuntu系统:vi /etc/hostname ...
- lightweight openpose 入门实操笔记(pytorch环境)
最近有个小项目要搞姿态识别,简单调研了一下2D的识别: 基本上是下面几种 (单人)single person 直接关键点回归 heatmap,感觉其实就是把一个点的标签弄成一个高斯分布 (多人)mul ...
- mysql数据库实操笔记20170418
一.建立商品分类表和价格表: 1.分类表`sankeq``sankeq`CREATE TABLE cs_mysql11(id INT(11) NOT NULL AUTO_INCREMENT,categ ...
- mysql数据库实操笔记20170419
一.insert与replace区别: insert:当表里有字段设置了主键或者唯一时,插入重复的唯一或主键字段值是不能执行的: replase:当表里有字段设置了主键或者唯一时,插入重复的唯一或主键 ...
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
前言 Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘. SpringClou ...
- 6.3 Pandora 实操 - 数据立方
简介 数据立方是适用于大规模实时数据(每天百亿条,10TB+ 级别数据)查询与分析的数据库系统,提供交互式的访问数据的能力,支持数据过滤.分组.聚合,实现亚秒级以内对亿行级别的数据表进行多维探索分析. ...
随机推荐
- 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数
摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...
- linux-shell 判断当前用户是否是root用户
环境变量UID中保存的是用户ID. root用户的UID是0. #! /bin/bash if [ $UID -ne 0 ]; then echo Non root user. Please run ...
- Go-31-杂序
标识符: 在go语言里,标识符要么从包里公开,要么不从包里公开. 当代码导入一个包时,程序可以直接访问这个包中任意一个公开的标识符.这些标识符以大写字母开头.以小写字母开头的标识符是不公开的,不能被其 ...
- Vue入门学习
目录 Vue 简介 第一个Vue程序 Vue基本语法 双向绑定 组件 Axios异步通信 计算属性 Slot 自定义事件 第一个Vue-cli程序 webpack学习使用 Vue-Router路由 v ...
- new word
strategy: a plan of action or policy designed to achieve a major or overall aim.
- VScode 使用提示
vscode 配置xdebug参考 vscode配置phpxdebug 未完,待续!
- Python 使用xlsxwriter绘制Excel表格
最近在统计资产,正好看到了xlsxwriter这个表格生成模块,借此机会,熟悉一下,写点有趣的小案例,一开始想使用C++ QT图形化开发一套自动化运维平台,但后来发现不仅消耗时间而且需要解决QT Qs ...
- Android trap攻防思路整理
Android trap攻防 图/文 h_one 0x01 反 ...
- Win64 驱动内核编程-4.内核里操作字符串
内核里操作字符串 字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花 样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*.WCHAR*.ANSI_STRIN ...
- 8.PHP图像处理
PHP图像处理 GD2 Jpgraph 创建一个画布: <?php header('content-type:image/gif'); //echo "你好"; ...