学习Influxdb

最近要实现接口监控, 准备用主流的时序数据库influxdb.

基本概念

influxdb的库也 database, 概念和mysql一样
influxdb的表叫 MEASUREMENTS, 意义更贴切, 测量的复数形式.
influxdb的一行数据叫 point, 就像做物理实验的打点, 每个点有其值和属性
influxdb的字段分类为 tag 和 field, field就是值, tag是其属性. 拿接口来说, 字段有 service_name, instance_id, method, handler_name, method, request_url, response_code, content_length, response_size, duration. 显然, 前面7个字段是tag, 特点是一般不是数值变量, 可枚举的, 所以influxdb对tag加了索引. 后面3个是field, 是数值变量, 是范围变化的, 不需要加索引.

插入数据

对于插入数据, influxdb同时提供了单条和批量插入的API. 开始不知道有批量方式, 来一条插一条, influxdb CPU巨高. 后面在官网文档找到了办法, 改用批量插入, 大大降低了CPU占用, 官方推荐是5k~1w条数据一批.

https://docs.influxdata.com/influxdb/v1.7/concepts/glossary/#batch

InfluxData recommends batch sizes of 5,000-10,000 points,
although different use cases may be better served by significantly smaller or larger batches.

influxdb同时提供了HTTP接口和UDP接口. UDP的好处在于减少了HTTP头部的开销, 性能更好

常用命令

  1. # 创建数据库
    CREATE DATABASE "db_name"
    # 显示所有数据库
    SHOW DATABASES
    # 删除数据库
    DROP DATABASE "db_name"
    # 使用数据库
    USE mydb
  2. # 显示该数据库中的表
    SHOW MEASUREMENTS
    # 创建表, 插入数据时会自动创建
    # 删除表
    DROP MEASUREMENT "measurementName"
  3. 查看数据保留策略 retention polices

    SHOW RETENTION POLICIES ON "testDB"
  4. 创建新的Retention Policies并设置为默认值

    	# DURATION 保留多少天
    # REPLICATION 副本数
    CREATE RETENTION POLICY "rp_name" ON "db_name" DURATION 30d REPLICATION 1 DEFAULT

连续查询

# 创建一个连续查询, 每10秒计算一个接口响应耗时平均值到新表
CREATE CONTINUOUS QUERY cq_http_handler_stats_duration ON statsdb BEGIN SELECT mean("duration") INTO http_handler_stats_average_duraion_10s FROM http_handler_stats GROUP BY time(10s) END

# 如果成功创建, 那么过了第一个周期后, SHOW MEASUREMENTS 能看到多了一张表

# 显示创建的连续查询
SHOW CONTINUOUS QUERIES

# 删除
DROP CONTINUOUS QUERY cq_http_handler_stats_duration ON statsdb

图表

grafana 是 influxdb 的良好伴侣, 写个query语句就能得到很炫酷的图形. 比如接口请求量图表按handler_name, response_code, time(10s) group by就得到了.