为了账号安全,请及时绑定邮箱和手机立即绑定

prometheus的高可用

标签:
Go

prometheus作为一个监控的一套方案,他的集群方案确实不好想的。因为他是无状态的。

opentsdb

opentsdb的后台是hbase,他的集群方案可以依赖hbase的集群方案,hbase依赖hdfs,从而做到了他的存储的考可用性。
hbase有hmaster和region,他们是通过zk来互相做交互通知的,zk里有region的切割情况的信息,hmaster可以通过zk的数据,知道存储的情况,及时的做切分,做到压力的分散。region的存活也是通过zk的session的机制做的,zkclient创建临时节点,只要watch临时节点的事件,就可以在进程死掉后获取到或者的状态。
通过上面的简单叙说,我们大概理解了他的集群的实现方式。
首先是最上层是zk,做一些基本信息和存活信息的保存。
然后是管理节点hmaster,可以通过和zk的交互,得到活着的region的信息,并且可以根据状态做故障的处理。
最后是regionserver,其实层次上hmaster和regionserver是同一层,都是在zk配置中心的下面,只是两个的职责有不同,regionserver主要是用来接收数据并且做数据交互的。他会受到hmaster的管理。

prometheus

prometheus自身并没有这样的概念,也就是无人管理的状态,作为一个无状态的存在,我们应该考虑他的特点,那就是进程的能力都是一样的,虽然给的抓取配置是不同的,但是进程都是存储和抓取的能力。
如果做一下类比,相当于regionserver的角色,regionserver每个进程管理的region是不同的,但是他们的主要功能都一样。
如果没有管理者, 那么大家都不知道每个prometheus的状态。其实很麻烦了。我们大概率会想到数据库,数据库的集群也是一样的。他每个进程的能力都是一样的,当然他也有代理的中间件做分库分别。但是从集群的角度看,他做的主要是主备的方案,就是每一台数据库有主和备,备是同步主的信息的,当主宕机后,切换到从库,依旧可以获取到数据。

主备的prometheus

我们的思路也慢慢偏向了数据库的集群方式,毕竟在无状态的进程上开发状态其实开发量还是蛮大的。
选择了主备的方向,那我们的继续考虑数据的问题,数据库的数据是推送的,是客户端推送给数据库的。prometheus则是拉取的,二期是监控数据,我前一篇文章特别讲过,拉取的数据都必须是有不可变性的或者采样性质的。
这里我们也立马想到一个点,例如cpu使用率,一台prometheus采集的时候是50%,另外一台采集的时间不同,延迟1秒,变成了49%。这个对我们有影响吗?没有,因为他反应的都是真实的情况,时间相差不大,这就是好处,我们可以把数据抓取两份,而不是搞同步。

为什么数据库可以同步

数据库一般不会说数据推送到两个库,都是同一个库同步到另外一个库。大家肯定可以想到,如果主宕机了,备启用以后,肯定还少一部分数据,数据的一致性如何保证呢?一般是加缓存。查询的时候先看缓存,没有再看数据库,只要缓存的数据有最新的一部分,那么整体运行是正常的。
这个对业务是可以的,但是对prometheus就不适用了,因为他是采集程序,都是时序的数据。这个数据量太大了,不是说加个redis就能解决的。
而且查询的时候,缓存部分的运算是有限的,时序数据库有丰富的运算,这个是缓存达不到的,这也是为什么不用缓存区补数据的原因。

小结

  • prometheus是主备方案
  • 多次抓取而不是同步数据
  • 时序数据库的能力和缓存不一样,但是数据库的能力和缓存是类似的。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.6万
获赞与收藏
380

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消