生产上部署了一个单机influxdb, 很多应用的采集数据全部单压到这台influxdb存储, 最近时间新建了一个大量聊天数据持续写入, 经常发生内存消耗过高, 本文就此记录一次造成内存高耗的探索之旅
查询influxdb中内置的监控指标库, 定位到内存告警的时候
SELECT * FROM "database" WHERE time > '2021-12-12T00:00:00Z' and time< '2021-12-12T00:01:00Z'
发现telegraf这个库的series的数量在30多万以上, 对于这么一台4核8g的服务器也算很高了, 对比聊天监控这块24小时持续写入, series也才4万, 有必要看下telegraf到底写入什么数据.
打开telegraf这个库一看, 居然另外两个库的measurement同时也写进了这个库, 顿时心惊了一下. 其中有一张表可是日均100万的量, 当下不管三七二十一, 先把多余的两张表删了再说, 报错:
cannot delete data. DB contains shards using both inmem and tsi1 indexes. Please convert all shards to use the same index type to delete data
再查一下shard表
日了, 记得这个星期的星期三晚上明明把索引类型改成了"tsi1, 但是看到的还有很多shard保持着"inmem"的索引类型, influxdb官方建议如果要启用基于时间序列(TSI)磁盘的索引,一定要改成tsi1. 使用默认的inmen类型, 在retention policy的时候会有很大的内存消耗.
现在谷歌怎么解决上面的问题, 有一个答案令我恍然大悟
说的是我可能只是在某个时候将配置设置从 inmem 更改为 tsi1,但是没有运行实际创建 TSI 索引重建。意味着所有新的shard都在使用 TSI1,而旧的shard则没有。
想到这个influxdb中的数据保存策略还有永久的, 就是说改完以后到现在还有老的shard还保持着存活, 并且还有数据写入到那个shard中
influxdb官方文档教你重新构建TSI索引
1, kill掉influxd进程, 停止influxdb服务
2, 删除所有的_series和索引目录, 在/data/influxdb/data/<dbName>目录下
3, 重建TSI索引
influx_inspect buildtsi -datadir=/var/lib/influxdb/data -waldir=/var/lib/influxdb/wal
最后把那两张多出来的表给删掉了
但是下一秒,这两张表又自动恢复了,再删, 又恢复. 这显然是telegraf的配置问题. 因为数据来源是telegraf采集的日志, 打开telegraf.conf, 喵了许久才发现端倪
telegraf.conf中对于写入telegraf库的数据, 指定了库, 却没有指定表, 则默认采集到的数据全部在telegraf自动建表, 并且写入. 然后这两张表下面有自己的配置, 又写入了各自配置的数据库中, 那可不是一份数据重复存储了一遍.
在telegraf集成influxdb输出的官方配置, 并没有提供namepass, 解释一下namepass: Glob模式字符串的数组, 输出与该数组列表中匹配的measurement

搞定, 后面telegraf这个库就不会有无关的数据写进来了
最后看了一下数据保存策略, 还有很多默认的, 果断删除, 并且禁用. 再看一下内存, 平时35%的内存占用率竟然降到了15%, 这是从来没有过的. 观察了一段时间, 处在15%~20%中波动, 还是有片刻的时间突破了20%, 不过很快又下去了.
其实还有很多优化点, 在于现在滥用influxdb. 我查了下网上人家怎么用的, 对于单机版的influxdb, 他们都是存储单一业务数据的. 而且官方文档建议我们在生产环境, 应该禁用内置监控, 因为内置的监控会产生额外的开销, 他们给出的办法是外部观察模式: 通过telegraf采集influxdb暴露出来的/debug/vars端点捕获这些指标并将它们存储在外部 InfluxDB 监控实例中
[[inputs.influxdb]]# ...## Multiple URLs from which to read InfluxDB-formatted JSON## Default is "https://us-west-2-1.aws.cloud2.influxdata.com/debug/vars".urls = ["https://us-west-2-1.aws.cloud2.influxdata.com/debug/vars"]
还有很多很多性能优化的地方, 就这样吧




