InfluxDB数据写入流程

InfluxDB主要模块架构

InfluxDB数据写入流程_第1张图片

  • Client: 这边的Client指能与influxDB服务器交互的客户端,如influx,influx-java,chronograf等。
  • Server
    • Httpd: 接收处理http请求。InfluxDB是RESTful服务器,所有的客户端请求都会被封装成http请求发送给服务器端进行处理
    • Influxql: 用于解析SQL,生成AST等
    • Coordinator:协调模块
      • StatementExecutor: 将SQL statement发送给Meta和Store模块进行处理
      • PointsWriter:将实际数据写入交由Store模块进行处理
    • Store: Shard管理模块
      • Shard: 实际写入查询模块
        • Engine:执行引擎
        • Index: 倒排索引管理模块

写入流程

  1. client发送写入请求给server端
  2. httpd模块接收到写入请求,从http body中提取写入的数据并解析成point(注意tagValue中“\n”换行符需要转义,否则会将\n后的内容当成下一个point进行解析)
  3. pointsWriter模块接收到httpd模块解析的points后与meta模块进行交互获得points -> shardGroup之间的映射关系,如下图所示:
    InfluxDB数据写入流程_第2张图片每个point都会有相应的时间戳,根据时间戳会划分到不同的shard group(每个shard group根据retention policy配置的shard duration管理相应长度的时间区间),每个shard group中有多个shard(单机版中只有1个shard),shard是InfluxDB中数据分片管理基本单元,待写入的points会根据SeriesKey hash到不同的shard中交由shard模块进行写入
  4. shard模块进行point数据的写入分为两部分:(1)构建索引(2)时序数据的写入:
  • 构建索引:Index子模块负责构建索引。
    • 首先会提取出写入point的SeriesKey,将SeriesKey进行hash从SeriesIndex文件的KeyIDMapBlock对应的hash桶中得到该SeriesKey对应的SeriesID,SeriesID的高32位表示series segment文件id,通过高32为可以找到存储该SeriesKey所在的series segment文件,低32位表示在series segment文件中的偏移量,从而找到SeriesID对应的SeriesKey,如果从series segment中找到的SeriesKey与待写入point的SeriesKey相同,则该SeriesKey的索引已经存在,不用再新建索引,如果不相同,则需要将该新的SeriesKey追加写入series segment文件中(写入新的series segment entry),同时在series index中也插入该series segment entry的索引项,series index的内容暂时存放在内存中,当series index中的索引项达到128K时,series index会发生compact,将内存中的数据写入到磁盘中生成series index文件。
    • 当有新的SeriesKey生成时,该SeriesKey对应的SeriesID也要写入TSL文件中(后续查询数据都是先从TSL和TSI文件中获取SeriesID,通过SeriesID在去查找对应的SeriesKey),当TSL文件大小达到配置项max-index-log-file-size时,TSL文件会compact成TSI文件。除此之外,还需要在保存在内存中的LogFile结构中构建SeriesKey的倒排索引,该倒排索引可以理解为形同Map>>>的多级Map结构(该多级Map结构方便后续在进行查询where过滤时能够快速查到对应的SeriesID)
    • 将新写入的field写入fields.idx文件,field.idx文件主要在select时判断该field是否存在以及获取field的类型
  • 时序数据的写入:engine模块负责数据写入
    • 将point中的SeriesKey和各个field提取出来组成Key(SeriesKey + 单个field)得到Map>,写入memory cache中(可以理解成memtable)
    • 将point插入记录写入WAL文件中
    • 当memory cache大小达到配置文件中cache-snapshot-memory-size或在WAL写入后经过cache-snapshot-write-cold-duration时间后,将cache compact成TSM文件落盘
    • 删除已经落盘的数据所对应的WAL文件

你可能感兴趣的:(influxDB,InfluxDB,数据写入,时序数据库)