这两天针对Influxdb有些不爽,主要还是体现在的他性能方面。下面的内容是我这两天总结,应该对大家有些帮助,那么需要说明的是,我用influxdb做时序数据库的应用场景很小,也就是一百多个爬虫节点和数据抽取平台的,加起来不到150个节点的。 当然还没有在线上跑,这段时间一直在做关于metric方面的测试,influxdb已经达到了我的对于业务的各种需求,逻辑存储,各种时间段数据的计算,及前端的展现。 我个人对于grafana的页面不是太关注,因为自己写起来,也就那回事。 只是没有grafana那么绚丽而已。 不扯淡了,开始正题… …

嗯哼,原文的地址是 http://xiaorui.cc/2014/12/15/%E5%85%B3%E4%BA%8Einfluxdb%E7%9A%84%E9%85%8D%E7%BD%AE%E8%B0%83%E6%95%B4%E5%8F%8A%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/

Influxdb已经有了lru缓存,不需要咱们自己在做一个数据缓存了,如果你的内存够大,完全可以把Lru的内存设置大点, 我是16g的内存,默认是200m ,我调节到4G,性能优势相当的明显。  下面是我在函数执行前加了一组timeit统计,第一次没有缓存前是5s左右,第二次访问的时候,直接命中缓存。 


Influxdb是支持udp协议的,有些类似graphite的接受模式。也可以直接把给graphite server的sender指向给Influxdb,collectd也可以这么搞。因为Influxdb为了更大程度的让自己牛逼起来,做了针对别人收集系统的格式解析,他倒是省事呀。 

数据库的引擎默认的rocksdb就行,别在折腾用leveldb了,速度确实和官方的介绍一样,比leveldb要快。一些论坛说hyperleveldb更加的厉害,相比leveldb增加了并行和压缩调整吞吐量,说实话,我切换了引擎测试了下,真的不咋地。 write-buffer-size这是的buffer的值,也可以适当的配置大一点。 

Influxdb在并发的情况,他自己会实现一组batch的批量刷新策略。 

那么我们再来看Influxdb的文件存储的目录结构。 

对于select查询语句的优化,尽量不要一次性的把一段时间的value都取出来,我个人经验是,你自己经过influxdb计算后,再返回前端能更好点。 

下面这个语句是,查询haproxy_33代理的数据,按照10m合并计算,计算的策略是用mean,也就是平均值的函数,后面紧接着时间间隔和limit 500 。 

一句话,尽量找计算,如果有可以,一定要加时间限制或者是limit的限制。 

group by time(30m) 



group by time(10m)

group by time(5m)

 


Q&A:

1.  influxdb是否可以限制内存大小的使用限制. 

据我所知是不行,配置文件没有关于内存限制配置参数,提交过issue,得到的答案也没听懂.  大家可以尝试用docker,cgroup限制内存.    当然在外层进行控制不太合理.  

https://groups.google.com/forum/#!topic/influxdb/jURMcIM5xBs 

2.  有朋友说,他的insert插入数据的速度过慢.

尝试使用他的批量接口,性能提升很是明显,influxdb集群的环境下QPS可以到近1W.



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品
  1. 你好,我在单机上测试插入性能,用http接口每秒只能写入400+次,由于无法完全使用批量插入,所以这性能有点接受不能,请问这是正常的吗?

  2. 我也对Influxdb的读写性能做了测试,结果还是符合需求的,只是内存测试的时候发现它直到渐渐把空余内存吃光了才会主动释放一些内存。看文中提到设置lru大小什么的,请问能设置influxdb使用内存的上限吗?

  3. 最近用的一个场景每秒1000条写入。写入的性能是很不错了,查询时候就不行了,非常慢。对当日的数据查询,group by time(1m) 怎么也得有个10秒才能返回。

  4. 官方貌似说 : 副本数量 × 分片数量 = 集群数量,我看你副本数量是2,但是你的集群是3?是因为这问题吗?http://influxdb.com/docs/v0.8/advanced_topics/sharding_and_storage.html#databases-and-shard-spacesThe replicationFactor setting tells the InfluxDB cluster how many servers should have a copy of each shard in the given shard space. Finally, split tells the cluster how many shards to create for a given interval of time. Data for that interval will be distributed across the shards. This setting is how you achieve write scalability. You may want to have replicationFactor * split == number of servers. That will ensure that every server in the cluster will be hot for writes at any given time.

  5. 我现在是通过zabbix 的api 从zaxbbix 把一些数据 抓取出来写入 influxdb ,然后前端由 grafana,暂时,influxdb 集群 是不是和es 一样没有中心节点,有这方面的介绍吗?

    • 应该是,但是集群貌似有出一些奇怪的问题 ,正常情况下还是很美好的。replication-factor = 2seed-servers = ["node1:8090", "node2:8090", "node3:8090"]