1、关闭上传报告给Influxdb
reporting-disabled = false
2、配置相关的
#wal日志落盘周期,官方建议0-100ms
#尝试了100ms,50ms,20ms之后,目前折中采用50ms
wal-fsync-delay = "50ms"
#使用tsi1索引
index-version = "tsi1"
#分片允许最大内存,当超过最大内存会拒绝写入
#内存越大,多个新老分片会占用更多的堆空间
cache-max-memory-size = "2g"
#当cache超过128m时,会进行快照落盘
cache-snapshot-memory-size = "128m"
#cache冷冻写入时间
cache-snapshot-write-cold-duration = "30m"
#进行全量压缩时间
#由于retention policy为72小时
#超过72小时,可以认为不进行全量压缩
compact-full-write-cold-duration = "80h"
#并行压缩处理器
max-concurrent-compactions = 8
#说明: 压缩TSM数据,一次落盘的吞吐量
#默认48m
#修改为64m
#[优化点]:增大写入量,减轻io压力
compact-throughput = "64m"
#压缩每秒最大落盘数据量
compact-throughput-burst = "16m"
#wal日志超过128m时会被压缩为索引文件,并删除
max-index-log-file-size = "128m"
3、查询超时时间要设置 默认一直等待 按实际需求设置 针对CPU高的
query-timeout = "60s"
4、Series 是占内存的大户,
influxdb中,series是一个很重要的概念,它是retentionPolicy、measurement、tag set雷同的汇合,蕴含了监控对象的元数据信息,series的数量=RP*measurement*tag set。
一般来讲,监控对象稳固后,series根本是固定的;influxdb将series放在内存作为索引,放慢了数据查问,这使得series的数量不能太大,否则influxdb内存会被撑爆,默认单个database内series限度为<100W个
第一,通过合理地规划,来减少不必要的tag。如果某个tag的值分布非常的多,可以考虑下它是否有必要作为tag,是不是作为field更合适。
第二,通过设置保留策略,保留更少的数据。influxdb是时序数据库,主要被用来存储监控数据,可以根据具体场景来保留更短的数据,这样的话会有一些旧数据由于过期而被清理掉,从而减少series的数量
查询命令语句
show series from measurements
influxdb本身提供了一些针对调试的支持,通过下面的接口返回的数据,可以分析出所有数据库的series数量
http://localhost:8086/debug/vars
在返回的数据中,每个数据库都会出现下面的数据,numSeries
就是series的数量
查阅了相关资料之后,整理了influxdb使用tsi索引时原理图:
说明:
写入influxdb时,会同时写wal文件及cache内存, wal用于宕机恢复cachecache在达到配置中的阈值时,会进行snapshot快照,进行落盘influxdb的series及index索引会在内存中全量保存,用于快速检索wal文件大小在达到配置中阈值时,会进行压缩转换到index索引influxdb会对磁盘数据文件{{index+data}}按照分片shard维度进行四次压缩(level1,2,3及full),以节约磁盘空间