关于监控一些问题根因的追溯

Viewed 81

关于监控的一些故障,有些已经尝试解决,但是特别想知道其中真正的原因。

场景一:批量加入10台机器,其中一台机器有时间同步问题,服务端只能采集到故障的那一台信息,其余的机器信息采集不到。我觉得应该是九台正常机器信息可采集,异常的节点数据采集不到。
解决方法,把故障节点和其他正常节点机器的时间校准一致可解决。
问题一这种场景n9e 是不是没法判断哪一台机器是正常,哪台是异常?是不是这样的异常数据会影响所有其他时间正常的categraf提交数据?

场景二:现有存量的监控中有1000台机器,新加一台监控机器时间同步有问题。整个web端都出现了down,看影响范围是整个存量机器都受影响了,所有机器的数据都不上报。

问题二:一旦有一台机器或者时序数据库某个时间点遇到问题,对整体系统都会有影响,只能把整个数据目录删除&给prometheus换个数据目录解决吗?这是prometheus数据库本身的原因还是n9e的特性决定的?
因为目前我监控的机器还有另外一套监控系统(prometheus自身的exporter监控体系,使用到的是thanos),某台机器有问题的时候,整个系统不会影响,最多是问题节点采集的数据异常,所以想知道是不是只有n9e会这样。
这种情况挺常见应该,就算不是新加入的机器有问题,存量集群中机器数量多时,很有可能就会出现某台机器ntp有问题,这样如何保证n9e的高可用?

解决方法:
因为整体的数据不上报了,所以无法确定是哪个客户端出现的问题,只能批量关闭客户端,然后清理数据排查,挺耗时的。排查的过程中,prometheus数据库写入十分钟就无法再写入数据了。还有种方式就是全量关闭客户端,再逐台开放。

2 Answers

你的 WriteOpt 是怎么配置的?

这个问题根本上是因为 n9e 转发数据给后端时序库,是批量发的,比如发 cpu_usage_idle 的数据,是1000台机器的cpu_usage_idle数据一起发给了后端时序库,如果后端时序库是 Prometheus,Prometheus有个逻辑是,如果发现任一条数据时间有问题,就会拒绝整个 batch,所以就影响了正常的数据。如果后端时序库选择 VictoriaMetrics,则不会有这个问题。

另外,夜莺的 ShardingKey 和队列数量可以设置,我看你是 v5,需要v5的较高版本,以 5.15.0 举例,ShardingKey 设置为 metric,即根据指标名字来做 hash,相同的指标的监控数据放到一个 batch 里发送,就类似上面举的 cpu_usage_idle 的例子,就会有问题。更好的方式是设置 ShardingKey 为 ident,相同的 ident 会放到一个 batch 发送,可以缓解,但是也不能根除,因为QueueCount是固定大小,不同的机器有可能会有哈希碰撞到一个队列里,就会放到一个batch里发送,导致有问题的机器和好的机器放到一个batch里,然后,就还是会出问题,只不过影响范围会变好。

Thanos Prometheus 自身不会出问题,是因为他们是 pull 模型,每次pull一台机器,不会和其他机器的时序数据混在一起写时序库。

建议:升级到 v6.0.0.ga.8,写逻辑做了调整,理论上不会出现不同的机器的 指标 混杂在一个 batch 中。

就是系统里面默认的配置,没有变更。如下贴图

非常感谢这么详细的答疑,最新版本的已在试用,之前对n9e转发数据这块完全黑盒,现在明白点了。 还想知道下v6.0.0.ga.8,写逻辑做了调整,这个版本中n9e的转发就是理论上可以实现某台机器有问题是不会影响整个系统的数据采集了是吧