继续上一篇文章讲讲prometheus和influxdb。
我不讲太多内部结构,简单点说说使用方面的区别:
prometheus是pull模型,influxdb是push
意思是prometheus server启动的时候,你需要告诉它你想它监听哪些节点,每次增加或者减少节点,得重启prometheus server的。
而influxdb则是,每个监控的节点自己配置好influxdb server的地址, 发就可以了。
相应地,用prometheus的话,每个节点不需要知道prometheus server在哪里,是死是活。即使prometheus的server挂了,只是监控数据收集不到而已,对被监控节点本身没啥影响。 而influxdb server要是挂了,所有节点发过去的请求都会出错,总归对性能稍微有点影响吧(我这么理解的)。
不过,这都是可以转化的。prometheus可以通过push gateway转换成push模型(这样可以解决prometheus server因网络隔离等没法访问监控节点的问题), influxdb可以通过collector转化成pull模型(influxdb+collector看成一整个系统,它们自动获取每个节点的监控数据)。prometheus有官方的alert集成,influxdb之前是没有的,我不知道现在有没有官方的以及好用不好用。
prometheus用的存储空间小,但是现在硬盘并没那么值钱,我觉得这点差别是可以忽略的。
influxdb的查询很像SQL,prometheus的我只能呵呵哒(学习曲线略陡,而且容易掉坑里)
prometheus的干爹是google, 这我还能说什么呢?(产品推广靠干爹啊,你看看angular和react)
说了这么多,其实它们都是牛逼的产品。除了第一点和第四点区别需要好好根据具体情况斟酌外,其他的就是看个人喜好了。
上面这些,很多地方都有分析过(但没这么直白说具体情况),如果看到这里,你就断定这篇文章没有干货, 那我谢谢你大爷,请继续往下看~
其实下面这点,才是我主要想说的,一个使用上的小的注意点,挽救你的内存,其他文档有提到,但是新手真的很难发现呀!掉到坑里扣都扣不出来的,请往下看:
使用它们作监控的时候,内存是吃得很快的。但是在api数量很少的时候,如果老是出现内存严重不足的状态, 那很可能是用法有问题。
它们的数据格式,(从调用者的角度看)都是类似(省去了时间戳):
job name(label1=value1, label2=value2, label3=value3) = value
在influxdb里job name应该是指db name, label是tag。注意了, label的不同值不要太多!比如label1对应的value1的不同的值,不能太多,否则查询非常非常吃内存。
我举个实际例子:
api_count(method=POST, userID=1) = 100
method的值是有限的,无非就是get, post,head, patch之类。但是userID,呵呵呵,它的值是非常多的, 监控的时候,在内存有限的情况下,尽量不要统计它。(要看英文方面的解释说明的,请搜关键词 high cardinality)
简而言之:
别用prometheus或者influxdb统计userID或者IP。
别用prometheus或者influxdb统计userID或者IP。
别用prometheus或者influxdb统计userID或者IP。
重要的事说三遍。
可是,万一真的有需求要统计这些,怎么办?
- 撕逼需求方,一哭二闹三上吊,让他们取消这个需求
- 用另外一个神器呀, Elasticsearch, 你值得拥有
- 可能有更好的,免费的,容易维护的解决方法。请留言指教,感激不尽