InfluxDB时间序列数据库

时间序列数据(Time Series Data),简称时序,时间序列数据包含三个重要部分,分别是 时间,主体,测量数值.
由于时间序列数据的特点,一般关系型数据库可能无法满足对时间序列数据高效的写入和查询性能。
InfluxDB带有web界面。并且拥有Dashboard,Data Explorer,Alerts等功能.可以不用额外添加监控可视化工具了。
但InfluxDB2.0目前好像并没有开源集群版本
网上对InfluxDB的概述非常多,但对我这种不熟悉时序数据处理,也是第一次接触时序数据库的用户还是有一定上手难度。
本文章使用docker部署InfluxDB2.7.1

参考博客:
https://www.cnblogs.com/xi-jie/p/17141891.html

https://blog.csdn.net/vincentxiaob/article/details/123580679

使用docker-compose部署InfluxDB2.7.1

仓库 https://github.com/NaZawsze/docker-influxdb/

1.配置docker-compose.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
version: "3.1"

x-shared-influxdb-variables: &shared-influxdb-variables
# InfluxDB will create the specified database and an admin account with the specified credentials.
# More info: https://github.com/influxdata/influxdata-docker/pull/102
INFLUXDB_DB: ${INFLUXDB_DB}
INFLUXDB_ADMIN_USER: ${INFLUXDB_ADMIN_USER}
INFLUXDB_ADMIN_PASSWORD: ${INFLUXDB_ADMIN_PASSWORD}

services:
influxdb:
container_name: $INFLUXDB_DOCKER_CONTAINER_NAME
image: influxdb:2.7.1
volumes:
- /data/docker/database/influxdb2_1/config:/etc/influxdb2:rw
- /data/docker/database/influxdb2_1/data:/var/lib/influxdb2:rw
- /etc/localtime:/etc/localtime:ro

- type: bind
source: ./influxdb/docker-entrypoint-initdb.d
target: /docker-entrypoint-initdb.d
read_only: true
ports:
- "8086:8086"
- "8083:8083"
env_file:
- ./.env
environment:
INFLUXDB_META_DIR: /var/lib/influxdb/meta

INFLUXDB_DATA_DIR: /var/lib/influxdb/data
INFLUXDB_DATA_WAL_DIR: /var/lib/influxdb/data
INFLUXDB_DATA_MAX_SERIES_PER_DATABASE: 0
INFLUXDB_DATA_MAX_VALUES_PER_TAG: 0
INFLUXDB_DATA_SERIES_ID_SET_CACHE_SIZE: 100

INFLUXDB_HTTP_BIND_ADDRES: :${INFLUXDB_PORT}
INFLUXDB_HTTP_ENABLED: "true"
INFLUXDB_HTTP_AUTH_ENABLED: "true"

<< : *shared-influxdb-variables
networks:
- database
# restart: always

networks:
database:
driver: bridge

2. 配置.env环境

1
2
3
4
5
6
# InfluxDB
INFLUXDB_DOCKER_CONTAINER_NAME=influxdb2.7.1
INFLUXDB_PORT=8086
INFLUXDB_DB=default
INFLUXDB_ADMIN_USER=admin
INFLUXDB_ADMIN_PASSWORD=password

3.运行容器

运行容器

1
sudo docker-compose up -d

4.配置数据库

这里我是用web访问配置数据库
访问8086端口,配置好用户名密码,组织名以及存储桶名后保留token.
如果需要修改密码

1
2
3
influx user password -n admin -t xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
# -t 后面跟的是初始化数据库时的token
# 如果没有保存token需要在/var/lib/influxdb2/influxd.bolt里找到对应的用户

1.创建存储桶

Load Data -> BUCKETS -> Create Bucket
NAME: testdatabase
Delete Data
OLDER THAN 30 days

2.创建token

官方文档: https://docs.influxdata.com/influxdb/cloud/security/tokens/create-token/
Load Data -> API TOKENS -> GENERATE API TOKEN -> Custom API Token
Buckets选择我们刚刚创建的testdatabase,勾上读写权限,点击生成令牌(注意保存!!!)
下面Telegrafs大概就是模板的意思,可以在Load Data -> TELEGRAF -> CREATE CONFIGURATION
-xWpdSthLiSOMFsSxBk-sTNwPZF9MHvWas7ICka3stXyZo2rORBrT5bHT_H2cY1qG32qylw1oXfGSgbpJUOigw==

部署Telegraf

Telegraf 是一个用 Go 编写的代理程序,可收集系统和服务的统计数据,并写入到 InfluxDB 数据库。

1.配置Telegraf

获取配置文件

1
docker run --rm telegraf telegraf:1.27.4-alpine config > telegraf.conf

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[global_tags]

[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = "0s"
hostname = ""
omit_hostname = false
[[outputs.influxdb_v2]]
urls = ["http://10.20.10.4:8086"]
token = "-xWpdSthLiSOMFsSxBk-sTNwPZF9MHvWas7ICka3stXyZo2rORBrT5bHT_H2cY1qG32qylw1oXfGSgbpJUOigw=="
organization = "SHELTER"
bucket = "testdatabase"

2.将Telegraf加入docker-compose.yaml中

在influxdb容器配置的后面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
telegraf:
container_name: telegraf01
image: telegraf:1.27.4-alpine
volumes:
- /data/docker/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /:/hostfs:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8125:8125/udp"
- "8092:8092/udp"
- "8094:8094/tcp"
environment:
HOST_ETC: /hostfs/etc
HOST_PROC: /hostfs/proc
HOST_SYS: /hostfs/sys
HOST_VAR: /hostfs/var
HOST_RUN: /hostfs/run
HOST_MOUNT_PREFIX: /hostfs
networks:
- database

3.添加对docker容器的性能监控(存疑)

添加在/data/docker/telegraf/telegraf.conf的最后

1
2
3
4
[[inputs.docker]]
#指定docker启动的api接口,并指定需要采集那些容器指标
endpoint = "unix:///var/run/docker.sock"
container_names = []

保存修改后重启telegraf容器,查看容器log发现报错,提示没有权限

1
E! [inputs.docker] Error in plugin: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?filters=%7B%22status%22%3A%7B%22running%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

docker daemon socket是docker远程访问的api之一,分别是unix套接字文件、tcp监听端口和fd文件描述符。尝试打开docker daemon的tcp监听端口。
编辑/etc/default/docker,添加一条

1
DOCKER_OPTS="-H tcp://0.0.0.0:2375"

注意这里是没有加密的,也没有身份认证,即可控制docker
重启docker查看2375端口是否起来
使用docker -H 10.20.10.4 version测试
最后修改/data/docker/telegraf/telegraf.conf

1
2
3
4
5
6
7
8
[[inputs.docker]]
#指定docker启动的api接口,并指定需要采集那些容器指标
endpoint = "tcp://10.20.10.4:2375"
#Deprecated (1.4.0), use container_name_include
#container_names = [] 在1.4.0中已经抛弃,2.0中已经删除,更改如下
## Containers to include and exclude. Collect all if empty. Globs accepted.
container_name_include = []
#container_name_exclude = []

部署完成

之前一直都是简单部署Prometheus+Node Exporter+Grafana,第一次接触Telegraf+InfluxDB2
InfluxDB2相比较InfluxDB1变化了很多,本文章也只是简单的部署了一下,可能有其他缺陷。后面深入了解后还会更新本文章。
效果如本文章封面