InfluxDB学习笔记
简介
InfluxDB是一个用于存储和分析时间序列数据的开源数据库。它的特性包括:
- 支持HTTP接口
- 支持类SQL的查询 —— InfluxQL
- 高效的数据读写
InfluxDB默认使用两个端口:8086用于HTTP接口,8088用于备份/恢复数据的RPC服务。
安装
Ubuntu
1 2 3 4 5 6 7 |
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add - source /etc/lsb-release echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list sudo apt-get update sudo apt-get install influxdb sudo service influxdb start |
K8S
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: influxdb-pvc namespace: dev spec: storageClassName: rook-block accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Pod metadata: namespace: dev name: influxdb labels: app: influxdb annotations: "cni.projectcalico.org/ipAddrs": "[\"172.27.0.20\"]" spec: terminationGracePeriodSeconds: 10 containers: - name: influxdb image: docker.gmem.cc/influxdb ports: - containerPort: 8086 name: http - containerPort: 8082 name: ifql volumeMounts: - name: influxdb-pv mountPath: /var/lib/influxdb volumes: - name: influxdb-pv persistentVolumeClaim: claimName: influxdb-pvc --- apiVersion: v1 kind: Service metadata: name: influxdb namespace: dev spec: ports: - name: http port: 8086 protocol: TCP targetPort: 8086 selector: app: influxdb sessionAffinity: None type: ClusterIP |
执行下面命令进入CLI:
1 |
kubectl -n dev exec -it influxdb influx -- -precision rfc3339 |
入门
CLI
创建数据库
命令格式类似于MySQL:
1 2 3 4 5 6 7 8 |
CREATE DATABASE metrics SHOW DATABASES # name: databases # name # ---- # _internal # metrics USE metrics |
读写数据
InfluxDB中存放的是时间序列数据,包括0-N个数据点。数据点由以下部分组成:
- time,时间戳
- measurement,此指标的名字。例如CPU_LOAD
- field,至少一个,KV对,V为数值例如value=6.12
- tag,0-N个,指标的元数据。 host=zircon
指标的模式(Schema)是自由的,你可以任意添加字段、Tag。但是字段类型不可以改变,如果你第一次写入host的值类型是字符串,就不能在以后写入数字。
写入数据点时,你需要遵守如下格式的行协议:
1 2 3 |
<measurement>[,<tag-key>=<tag-value>...] <f1-key>=<f1-val>[,<f2-key>=<f2-val>...] [unix-nano-timestamp] # 示例: load,host=xenial-100,group=k8s value=3.1 |
通过CLI差入数据的InfluxQL语法为:
1 |
INSERT load,host=xenial-100,group=k8s value=3.1 |
类似的,可以用SELECT查询指标数据:
1 2 3 4 5 6 7 8 |
SELECT * FROM load # name: load # time group host value # ---- ----- ---- ----- # 1522746924735704773 k8s xenial-100 3.1 # 每个Tag、字段都可以作为列名 SELECT "group", host,value FROM "load" |
FROM子句中,支持使用正则式来匹配指标名:
1 |
SELECT * FROM /.*/ LIMIT 1 |
WHERE子句也是支持的。
HTTP API
数据库管理
1 2 3 4 5 |
export URL=http://influxdb.dev.svc.k8s.gmem.cc:8086 # 执行InfluxQL 格式化响应JSON 查询语句 curl -i -XPOST $URL/query?pretty=true --data-urlencode "q=SHOW DATABASES" curl -i -XPOST $URL/query?pretty=true --data-urlencode "q=CREATE DATABASE metrics" |
写入操作
1 2 3 4 5 6 7 8 |
# 写入操作,响应码204,数据正常写入 # 时间戳(纳秒)可以不传,这样自动使用InfluxDB本地时间 curl -i -XPOST $URL/write?db=metrics --data-binary 'host=xenial-100,group=k8s value=3.1 1434055562000000000' # 可以同时写入多个数据点,使用换行符分隔 # 导入文件中的数据点、 curl -i -XPOST $URL/write?db=metrics --data-binary @load.txt |
查询操作
1 |
curl -G $URL/query?pretty=true --data-urlencode "db=metrics" --data-urlencode "q=SELECT * FROM load" |
结果同样以JSON形式返回。要同时执行多个查询,只需要用分号分开InfluxQL语句。
使用请求参数chunked/chunk_size可以发起分块(Chunked)请求,数据流式返回:
1 |
--data-urlencode "chunked=true" --data-urlencode "chunk_size=20000 |
持续查询
Influx提供了持续查询(Continuous Queries,CQ)来处理数据采样。CQ是按照时间进行聚合的InfluxQL语句,周期性的在Influx数据库内部运行。示例:
1 2 3 4 5 6 7 8 9 |
-- 查询数据库metrics的指标network的inbound、outbuound字段,对两者取平均值 -- 每30分钟分组聚合一次 -- 聚合结果存放到RP为one_year的指标sampled_load中,该指标具有字段mean_inbound、mean_outbound CREATE CONTINUOUS QUERY "cq_30m" ON "metrics" BEGIN SELECT mean("inbound") AS "mean_inbound",mean("outbound") AS "mean_outbound" INTO "one_year"."sampled_load" FROM "network" GROUP BY time(30m) END |
配合使用CQ和RP,可以实现近期数据高精度保留,远期数据低精度保留甚至删除。
驻留策略
Retention Policy(RP)定义了InfluxDB保留历史数据的时长。示例:
1 2 3 |
# 为指标load定义一个驻留策略,时长2小时 # REPLICATION为数据复制的份数,对于单节点InfluxDB,必须设置为1 CREATE RETENTION POLICY "two_hours" ON "load" DURATION 2h REPLICATION 1 DEFAULT |
配置
配置文件默认位于/etc/influxdb/influxdb.conf。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# 禁止向usage.influxdata.com发送使用情况信息 reporting-disabled = false # 数据备份/恢复服务绑定地址 bind-address = "127.0.0.1:8088" [meta] # metadata/raft数据库的存放位置 dir = "/var/lib/influxdb/meta" # 创建数据库时,自动创建默认的驻留策略 retention-autocreate = true # 为meta service打印日志 logging-enabled = true [data] # TSM存储引擎在何处存储TSM文件 dir = "/var/lib/influxdb/data" # TSM存储引擎在何处存储TWAL文件 wal-dir = "/var/lib/influxdb/wal" # 写操作fsync到磁盘的延迟,大于0的值可以用于慢速磁盘,以及WML写出现竞态的情况 # 对于非SSD磁盘,推荐取值范围0-100ms wal-fsync-delay = "0s" # 新分片使用的分片索引(Shard index)类型,默认是内存索引,重启后会重新创建 # 取值tsi1使用基于磁盘的索引,支持大cardinality数据集 index-version = "inmem" # 是否启用tsm引擎的冗长日志 trace-logging-enabled = false # 是否启用查询日志 query-log-enabled = true ### TSM引擎配置 ### # 在拒绝写入操作之前,分片缓存占用的内存最大量 cache-max-memory-size = "1g" # 当缓存达到多大时,引擎产生其快照,并写入到TSM文件,以释放内存空间 cache-snapshot-memory-size = "25m" # 如果分片持续多久没有接收到新的写入/删除操作,则引擎产生缓存的快照,并写入到新的TSM文件 cache-snapshot-write-cold-duration = "10m" # 如果引擎持续多久没有接收到分片的新的写入/删除操作,它将压缩分片的所有TSM文件 compact-full-write-cold-duration = "4h" # 压缩并行度 max-concurrent-compactions = 0 # 在丢弃写操作之前,每个数据库允许的最大序列(Series)数量 # 可以在数据库级别解决高Cardinality问题,设置为0则禁用 max-series-per-database = 1000000 # 在丢弃写操作之前,每个Tag的最大值数量 # 可以解决Tag值的高Cardinality问题,设置为0则禁用 max-values-per-tag = 100000 # 集群服务配置 [coordinator] # 写操作超时时间 write-timeout = "10s" # 同时执行的查询的最大数量 max-concurrent-queries = 0 # 查询超时:在查询被系统杀掉之前,经过的最大时间 query-timeout = "0s" # 缓慢查询阈值,超过此阈值的被记录到缓慢日志 log-queries-after = "0s" # 一个SELECT最多能处理的数据点数量 max-select-point = 0 # 一个SELECT可以处理的Series的最大数量 max-select-series = 0 # 一个SELECT最多创建的Group by 时间桶(Time Bucket)数量 max-select-buckets = 0 # 驻留策略配置,驻留策略决定了如何清除老旧数据 [retention] # 是否启用驻留策略,也就是说是否清除老旧数据 enabled = true # 每隔多久进行运行驻留策略 check-interval = "30m" # 控制分配的预创建,这样在数据到达前分片即可用 [shard-precreation] # 是否启用分片预创建服务 enabled = true # 预创建服务运行间隔 check-interval = "10m" advance-period = "30m" # 系统自我监控、统计和诊断 [monitor] # 是否在内部进行统计信息 store-enabled = true # 存储统计信息的目标数据库 store-database = "_internal" # 每隔多久记录一次统计信息 store-interval = "10s" [http] # 是否启用HTTP端点 enabled = true # HTTP服务的绑定地址 bind-address = ":8086" # 是否启用用户身份验证 auth-enabled = false # 基于HTTP基本认证时,发送给客户端的Realm信息 realm = "InfluxDB" # 是否记录HTTP请求日志 log-enabled = true # 访问日志路径 access-log-path = "" # 是否启用详细的写日志 write-tracing = false # 是否启用pprof端点,用于调试和诊断 pprof-enabled = true # 是否启用HTTPS https-enabled = false # SSL整数路径 https-certificate = "/etc/ssl/influxdb.pem" # 可以指定单独的私钥路径 https-private-key = "" # SON web token共享密钥 shared-secret = "" # 结果集大小限制,防止查询耗尽InfluxDB内存 # 仅仅限制非分块的HTTP API请求,分块请求不受限制 max-row-limit = 0 # 最大连接数 max-connection-limit = 0 # 是否使用UNIX域套接字 unix-socket-enabled = false # UNIX域套接字路径 bind-socket = "/var/run/influxdb.sock" # 客户端请求体大小 max-body-size = 25000000 [ifql] # 是否启用RPC服务 enabled = true # 是否进行额外的日志记录 log-enabled = true # 绑定地址 bind-address = ":8082" [logging] # 日志格式 format = "auto" # 日志级别 level = "info" # 是否禁止显示LOGO suppress-logo = false # 控制订阅,订阅可以用于获取整个数据集的拷贝 [subscriber] # 是否启用订阅者服务 enabled = true # 写到订阅者的HTTP请求的超时 http-timeout = "30s" # 是否允许到订阅者的不安全连接 insecure-skip-verify = false # 数字证书位置 ca-certs = "" # Goroutine数量 write-concurrency = 40 # 写缓冲区大小 write-buffer-size = 1000 [continuous_queries] # 是否启用持续查询服务 enabled = true # 是否记录CQ日志 log-enabled = true # 是否记录统计信息 query-stats-enabled = false # 多久检查CQ服务是否需要运行 run-interval = "1s" |
Leave a Reply