说说 influxdb 的坑

前面有两篇 blog 说了一下 influxdb,但是在实际使用过程中还是遇到了很多问题.

首先说说我使用的版本,最开始使用的是0.9.5.1-1,后面由于数据库卡死罢工了,重启 N 次无效后升级到0.10.x, 但使用了半天还是乖乖回到0.9版本,为什么会出现这种情况呢,我不知道,没那么多时间去看代码, boss 还盯着我干活呢,我只能把表象说出来,反正 influxdb 现在无法支撑我的业务,马上就要被砍掉了,接下来我会寻找新的Time Series Databases,在这篇 blog 最后我会简短的说一下我现在的面临的问题,如果有兴趣可以一起探讨.

坑1:并发效率不高

实测可以支撑500TPS 的 put 请求,再高的话,基本上到1000TPS 就开始不稳定了,话说这样一来小的监控,或者纯粹的 IDC 监控,用用倒也能满足要求,不过这里说的是纯插入,还没有说插的时候查询呢,那么往下看

坑2:查询会导致数据库假死

这不是耸人听闻,一般我对接 grafana 的时候我的默认时间跨度是三小时,这个时间段既能满足查询的效率,又能满足对指标的观测,但是这个是时候你手贱了一下,把时间跨度调整到了1d or 7d,那么数据库还是抽风,你能看到的是插入几乎全部超时, CPU 使用率只有5%不到,我看过 pprof, 全部 block 在storage 上, wal 也会被 block, 但这个时候的磁盘IOPS几乎也没有,就像大家都在等什么一样,反正就不工作了,所有请求都会超时,

接下来你去重启 influxdb, 你就发现这个时间段的数据都是一截一截的,不是连续的,我现在是跑单机的,最开始的时候跑集群的,集群问题更大,继续看下一个坑

坑3:分布式异步同步导致数据丢失

最开始的时候我设计的是3节点集群,都是物理机,高性能物理机,但在 leader 不重启的情况下好像每隔一段时间 Leader 就会换一个节点,我记得 raft 协议没有这一条啊,那么我只能怀疑在我睡觉的时候, influxdb 实现的 raft 也会打盹,但这个不影响我的数据,我倒也不在意,关键是出现坑2的时候, leader 的资源消耗一点都没有,但是去看两个 follower, CPU 都到了1000%多了,没错,那是一千,20core 的机器硬生生的被吃掉了一半,我还不知道它在干嘛,磁盘的 IOPS 也没什么,就是跑 CPU

接着我就重启 Leader 那个服务器,然后就开始选举,运气好,原来的 leader 启动起来了,被当选 leader, 数据就和坑2一样,间歇性丢失,运气不好,以前的 follower 当选了 leader, 结果丢的数据几乎要从异常时间开始再往前至少一刻钟,简直无法容忍了

使用建议

  1. 不要随便使用大跨度时间区间来查询
  2. 不要用集群,不要用集群,不要用集群,数据量太大,你可以选择部署多个实例,然后分别把不同的 datapoint 存储到不同的实例里面去
  3. 建立了database 以后,记得一定要修改RETENTION POLICY,具体怎么改,这里给你一个传送门,自己看文档
  4. 如有可能最好在前端加上 nginx 做一层代理,缓存查询数据
  5. 做一个好人,线上程序出问题的可能就会降低很多,比如看完文章后点个赞赏,这玩意我整了好几天,还指着帮我分担一点云服务器的租金呢.

现在的实际情况

我现在是做了 nginx 的实时监控,在每个nginx 节点上安装了自己写的 agent. 然后在汇总到一个单点的 Server 下,现在每秒聚合的日志量在1w 条,用的是我早先开源的网络库,性能非常好,已经平稳运行了快一年了,没有宕机,没有异常,这个我还是非常满意的,

但是这么多的日子要全塞到 influxdb 里面,当然是做不到的,更何况公司的业务还在增长,所以我但是在 Server 端做了一个聚合,每5秒钟把聚合的数据再发到 influxdb, 就这样,有的时候 influxdb 还挂,但总体来说基本上还算可用,可以监控到线上业务或者 EndPoint 的异常,但是粒度非常粗,出了问题大家能看到是什么地方出了问题,然后再细致的去查.

接着,大家开始不满足了,需要我提供更详细的数据,例如哪个 URL 出错了(PS: 我们是 RESTFUL 的 API, 鬼知道有多少种,而且业务部门太多,我不可能知道每个线上 API 的 Style),所以现在需要考虑找一个更强悍的 Time Series Databases ,现在候选的 OpenTSDB, 但是初步试了一下,好像问题挺多的,如果大家有更好的时序数据库也可以介绍

今天说了挺多的,大概也就这样吧,写 blog 还是挺费时间的.

坚持原创技术分享,您的支持将鼓励我继续创作!