n9e-server的高可用(分布式)部署

Viewed 163

请问n9e-server的高可用部署有最佳实践吗?

我能想到的其中一个问题是:

  • 在做告警判定的时候,由n9e-server主动查询PromQL的值,若存在N个n9e-server,会不会出现重复告警的问题?
  • N个n9e-server是否需要对告警做shard,还是类似Prometheus+Alertmanager的结构,由alertmanager做去重?
2 Answers

翻了下alert/naming/的源码,大概明白了:

  • 每个n9e-server实例,会向alerting_engines表,通过hearbeat定期的注册自己;
  • 某个n9e-server实例,对某个datasource(比如prometheus001),发现有N个n9e-server对应,则将其组成一致性hash环;
  • 某个n9e-server实例,在对alertrule进行告警判定时,根据rule.id + 一致性hash,判断该告警规则是否由自己负责;

高可用的实现:

  • 定期的heartbeat过程中,发现serverList有变化,则进行rehash;
  • 也就是说,一致性hash环,在节点退出heartbeat停掉后,由n9e-server进行rehash,这样就保证了总有实例会负责alertrule。

我理解是这样,存在N个n9e-server会把告警均分,每个告警引擎集群都会管理一部分告警。具体实现上还有待研究。你可以看看这篇https://mp.weixin.qq.com/s/TctM_kosBZesKj6i0oEZew

夜莺的告警规则会配置对哪个数据源进行告警,每个数据源都可以关联一个告警引擎集群,如下图,这样每个告警引擎就会知道自己需要纳管哪个告警规则。

均分后的n9e-server实例,是否需要高可用部署(比如3个副本),若只有一个实例,宕机怎么办?

嗯嗯,我觉得应该多部署,我印象是有单独协程去专门同步实例变换,更新哈希环