一、基本概念
influxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
influxDB提供了类似SQL的查询语言,并且可以设置数据保存时间,支持基于http的数据插入和查询,逻辑上由database(数据库),measurement(一个字符串表示该条记录对应的含义),tag(索引字段,按照字典序排序,比如类型或者渠道),field(字段,比如条数或者金额等字段)已经time(时间戳)组成;
influxDB除了这些基本的概念还包括point,series,shard这些概念;
1、point
influxDB中单条插入语句的数据结构,series+time可以用于区别一个point,point可以有多个filed name 和field value.
2、Series
Series 相当于influxDB中的一些数据集合,在同一个数据库中,retention policy、measurement、tag sets完全相同的数据同属于一个series,同一个series的数据在物理上会按照时间顺序排列存储在一起
series的key为measurement+ 所有的tags的序列化字符串
Go中定义的结构
type Series struct {
mu sync.RWMutex
Key string // series key
Tags map[string]string // tags
id uint64 // id
measurement *Measurement // measurement
}
3、Shard
Shard 与retention policy 相关联,通过它设置数据保留时间,当检测到一个share中数据过期后,只需要将这个share的资源释放,相关文件删除即可,每个存储策略下会存多个share,每个share存储一个指定时间段内的不重复数据,每个share都对应一个底层的tsm存储引擎,有独立的cache、wal、tsm file.
二、存储引擎 -TSM Tree
从LevelDB(LSM Tree)到BoltDB(mmap B+树),现在influxDB使用的是自己实现的TSM Tree的算法,类似LSM Tree,针对InfluxDB的使用做了特殊优化,TSM Tree 是 InfluxDB 根据实际需求在 LSM Tree 的基础上稍作修改优化而来。TSM 存储引擎主要由几个部分组成: cache、wal、tsm file、compactor。
1、cache
cache 相当于是 LSM Tree 中的 memtable,在内存中是一个简单的 map 结构,这里的 key 为 seriesKey + 分隔符 + filedName,目前代码中的分隔符为 #!~#,entry 相当于是一个按照时间排序的存放实际值的数组,具体结构如下:
type Cache struct {
commit sync.Mutex
mu sync.RWMutex
store map[string]*entry
size uint64 // 当前使用内存的大小
maxSize uint64 // 缓存最大值
// memtable 快照,用于写入 tsm 文件,只读
snapshot *Cache
snapshotSize uint64
snapshotting bool
snapshotAttempts int
stats *CacheStatistics
lastSnapshot time.Time
}
插入数据时,实际上是同时往 cache 与 wal 中写入数据,可以认为 cache 是 wal 文件中的数据在内存中的缓存。当 InfluxDB 启动时,会遍历所有的 wal 文件,重新构造 cache,这样即使系统出现故障,也不会导致数据的丢失。cache默认最大是25M,每当