Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

InfluxDB学习笔记

23
Mar
2018

InfluxDB学习笔记

By Alex
/ in Database
/ tags TSDB
0 Comments
简介

InfluxDB是一个用于存储和分析时间序列数据的开源数据库。它的特性包括:

  1. 支持HTTP接口
  2. 支持类SQL的查询 —— InfluxQL
  3. 高效的数据读写

InfluxDB默认使用两个端口:8086用于HTTP接口,8088用于备份/恢复数据的RPC服务。

安装
Ubuntu
Shell
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
YAML
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:

Shell
1
kubectl -n dev exec -it influxdb  influx -- -precision rfc3339
入门
CLI
创建数据库

命令格式类似于MySQL:

Shell
1
2
3
4
5
6
7
8
CREATE DATABASE metrics
SHOW DATABASES
# name: databases
# name
# ----
# _internal
# metrics
USE metrics
读写数据

InfluxDB中存放的是时间序列数据,包括0-N个数据点。数据点由以下部分组成:

  1. time,时间戳
  2. measurement,此指标的名字。例如CPU_LOAD
  3. field,至少一个,KV对,V为数值例如value=6.12
  4. tag,0-N个,指标的元数据。 host=zircon

指标的模式(Schema)是自由的,你可以任意添加字段、Tag。但是字段类型不可以改变,如果你第一次写入host的值类型是字符串,就不能在以后写入数字。

写入数据点时,你需要遵守如下格式的行协议:

Shell
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语法为:

SQL
1
INSERT load,host=xenial-100,group=k8s value=3.1

类似的,可以用SELECT查询指标数据:

Shell
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子句中,支持使用正则式来匹配指标名:

SQL
1
SELECT * FROM /.*/ LIMIT 1

WHERE子句也是支持的。

HTTP API
数据库管理
Shell
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" 
写入操作
Shell
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 
查询操作
Shell
1
curl -G $URL/query?pretty=true --data-urlencode "db=metrics" --data-urlencode "q=SELECT * FROM load"

结果同样以JSON形式返回。要同时执行多个查询,只需要用分号分开InfluxQL语句。

使用请求参数chunked/chunk_size可以发起分块(Chunked)请求,数据流式返回:

Shell
1
--data-urlencode "chunked=true" --data-urlencode "chunk_size=20000 
持续查询

Influx提供了持续查询(Continuous Queries,CQ)来处理数据采样。CQ是按照时间进行聚合的InfluxQL语句,周期性的在Influx数据库内部运行。示例:

SQL
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保留历史数据的时长。示例:

Shell
1
2
3
# 为指标load定义一个驻留策略,时长2小时
# REPLICATION为数据复制的份数,对于单节点InfluxDB,必须设置为1
CREATE RETENTION POLICY "two_hours" ON "load" DURATION 2h REPLICATION 1 DEFAULT 
配置

 配置文件默认位于/etc/influxdb/influxdb.conf。

/etc/influxdb/influxdb.conf
Shell
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"

 

← Logback学习笔记
Ansible学习笔记 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Prometheus学习笔记
  • OpenTSDB学习笔记
  • 使用Grafana展示时间序列数据
  • KeyDB学习笔记

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • Bazel学习笔记 38 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2