InfluxDB安装部署(CentOS)

InfluxDB简介

InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。

主要功能:

  • 基于时间序列(Time Series),支持与时间有关的相关函数(如最大,最小,求和等)
  • 可度量性(Metrics):你可以实时对大量数据进行计算
  • 基于事件(Eevents):它支持任意的事件数据

主要特点:

  • 无结构(无模式):可以是任意数量的列
    可拓展的
  • 支持min, max, sum, count, mean, median 等一系列函数,方便统计
  • 原生的HTTP支持,内置HTTP API
  • 强大的类SQL语法
  • 自带管理界面,方便使用

安装部署

官网

目前最新版本为1.6.x,但1.2.x之后的版本将后台web功能关闭了,所以我们此次还是选择1.2.x的版本进行安装。

在讲解具体的安装步骤之前,先说说influxdb的两个http端口:8083和8086

  • port 8083:管理页面端口,访问localhost:8083可以进入你本机的influxdb管理页面;
  • port 8086:http连接influxdb client端口,一般使用该端口往本机的influxdb读写数据。

安装环境

  • 本次安装的系统环境为CentOS 7.6,其他系统的安装基本上也类似, IP:192.168.56.32 (此处为虚拟机)
  • influxdb 1.2.4

YUM包安装

1
2
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.2.4.x86_64.rpm
sudo yum localinstall influxdb-1.2.4.x86_64.rpm
启动服务
1
service influxdb start
非服务方式启动 influxd

安装后,在/usr/bin下面有如下文件:

1
2
3
4
5
influxd    influxdb服务器
influx influxdb命令行客户端
influx_inspect 查看工具
influx_stress 压力测试工具
influx_tsm 数据库转换工具(将数据库从b1或bz1格式转换为tsm1格式)

在/var/lib/influxdb/下面会有如下文件夹:

1
2
3
data  存放最终存储的数据,文件以.tsm结尾
meta 存放数据库元数据
wal 存放预写日志文件

在/var/log/influxdb下面有如下文件:

1
influxd.log  日志文件

在/etc/influxdb下面有如下文件:

1
influxdb.conf  配置文件

在/var/run/influxdb/下面有如下文件:

1
influxd.pid  PID文件

web管理页面

  1. 配置/etc/influxdb/influxdb.conf如下:

    1
    2
    3
    [admin]
    enabled = true
    bind-address = ":8083"
  2. 访问http://192.168.56.32:8083/

源码编译安装

  • 下载解压

    1
    2
    wget https://github.com/influxdata/influxdb/archive/v1.2.4.tar.gz
    tar -zxvf v1.2.4.tar.gz /home/influxdb[目标目录]
  • 启动服务

    1
    $: ./home/influxdb/usr/bin/influxd # 启动服务时要确保8080端口没有被占用
  • 启动客户端

    1
    $: ./home/influxdb/usr/bin/influx
  • 端口设定

    1
    2
    firewall-cmd --permanent --add-port=8083/tcp
    firewall-cmd --permanent --add-port=8086/tcp

influxdb.conf说明

全局配置
1
2
reporting-disabled = false  # 该选项用于上报influxdb的使用信息给InfluxData公司,默认值为false
bind-address = ":8088" # 备份恢复时使用,默认值为8088
meta相关配置
1
2
3
4
[meta]
dir = "/var/lib/influxdb/meta" # meta数据存放目录
retention-autocreate = true # 用于控制默认存储策略,数据库创建时,会自动生成autogen的存储策略,默认值:true
logging-enabled = true # 是否开启meta日志,默认值:true
data相关配置
1
2
3
4
5
6
7
8
9
10
[data]
dir = "/var/lib/influxdb/data" # 最终数据(TSM文件)存储目录
wal-dir = "/var/lib/influxdb/wal" # 预写日志存储目录
query-log-enabled = true # 是否开启tsm引擎查询日志,默认值: true
cache-max-memory-size = 1048576000 # 用于限定shard最大值,大于该值时会拒绝写入,默认值:1000MB,单位:byte
cache-snapshot-memory-size = 26214400 # 用于设置快照大小,大于该值时数据会刷新到tsm文件,默认值:25MB,单位:byte
cache-snapshot-write-cold-duration = "10m" # tsm引擎 snapshot写盘延迟,默认值:10Minute
compact-full-write-cold-duration = "4h" # tsm文件在压缩前可以存储的最大时间,默认值:4Hour
max-series-per-database = 1000000 # 限制数据库的级数,该值为0时取消限制,默认值:1000000
max-values-per-tag = 100000 # 一个tag最大的value数,0取消限制,默认值:100000
coordinator查询管理的配置选项
1
2
3
4
5
6
7
8
[coordinator]
write-timeout = "10s" # 写操作超时时间,默认值: 10s
max-concurrent-queries = 0 # 最大并发查询数,0无限制,默认值: 0
query-timeout = "0s # 查询操作超时时间,0无限制,默认值:0s
log-queries-after = "0s" # 慢查询超时时间,0无限制,默认值:0s
max-select-point = 0 # SELECT语句可以处理的最大点数(points),0无限制,默认值:0
max-select-series = 0 # SELECT语句可以处理的最大级数(series),0无限制,默认值:0
max-select-buckets = 0 # SELECT语句可以处理的最大"GROUP BY time()"的时间周期,0无限制,默认值:0
retention旧数据的保留策略
1
2
3
[retention]
enabled = true # 是否启用该模块,默认值 : true
check-interval = "30m" # 检查时间间隔,默认值 :"30m"
shard-precreation分区预创建
1
2
3
4
[monitor]
store-enabled = true # 是否启用该模块,默认值 :true
store-database = "_internal" # 默认数据库:"_internal"
store-interval = "10s # 统计间隔,默认值:"10s"
admin web管理页面
1
2
3
4
5
[admin]
enabled = true # 是否启用该模块,默认值 : false
bind-address = ":8083" # 绑定地址,默认值 :":8083"
https-enabled = false # 是否开启https ,默认值 :false
https-certificate = "/etc/ssl/influxdb.pem" # https证书路径,默认值:"/etc/ssl/influxdb.pem"
Restful API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[http]
enabled = true # 是否启用该模块,默认值 :true
bind-address = ":8086" # 绑定地址,默认值:":8086"
auth-enabled = false # 是否开启认证,默认值:false
realm = "InfluxDB" # 配置JWT realm,默认值: "InfluxDB"
log-enabled = true # 是否开启日志,默认值:true
write-tracing = false # 是否开启写操作日志,如果置成true,每一次写操作都会打日志,默认值:false
pprof-enabled = true # 是否开启pprof,默认值:true
https-enabled = false # 是否开启https,默认值:false
https-certificate = "/etc/ssl/influxdb.pem" # 设置https证书路径,默认值:"/etc/ssl/influxdb.pem"
https-private-key = "" # 设置https私钥,无默认值
shared-secret = "" # 用于JWT签名的共享密钥,无默认值
max-row-limit = 0 # 配置查询返回最大行数,0无限制,默认值:0
max-connection-limit = 0 # 配置最大连接数,0无限制,默认值:0
unix-socket-enabled = false # 是否使用unix-socket,默认值:false
bind-socket = "/var/run/influxdb.sock" # unix-socket路径,默认值:"/var/run/influxdb.sock"
subscriber 控制Kapacitor接受数据的配置
1
2
3
4
5
6
7
[subscriber]
enabled = true # 是否启用该模块,默认值 :true
http-timeout = "30s" # http超时时间,默认值:"30s"
insecure-skip-verify = false # 是否允许不安全的证书
ca-certs = "" # 设置CA证书
write-concurrency = 40 # 设置并发数目,默认值:40
write-buffer-size = 1000 # 设置buffer大小,默认值:1000
graphite 相关配置
1
2
3
4
5
6
7
8
9
10
11
12
[[graphite]]
enabled = false # 是否启用该模块,默认值 :false
database = "graphite" # 数据库名称,默认值:"graphite"
retention-policy = "" # 存储策略,无默认值
bind-address = ":2003" # 绑定地址,默认值:":2003"
protocol = "tcp" # 协议,默认值:"tcp"
consistency-level = "one" # 一致性级别,默认值:"one
batch-size = 5000 # 批量size,默认值:5000
batch-pending = 10 # 配置在内存中等待的batch数,默认值:10
batch-timeout = "1s" # 超时时间,默认值:"1s"
udp-read-buffer = 0 # udp读取buffer的大小,0表示使用操作系统提供的值,如果超过操作系统的默认配置则会出错。 该配置的默认值:0
separator = "." # 多个measurement间的连接符,默认值: "."
collectd
1
2
3
4
5
6
7
8
9
10
11
[[collectd]]
enabled = false # 是否启用该模块,默认值 :false
bind-address = ":25826" # 绑定地址,默认值: ":25826"
database = "collectd" # 数据库名称,默认值:"collectd"
retention-policy = "" # 存储策略,无默认值
typesdb = "/usr/local/share/collectd" # 路径,默认值:"/usr/share/collectd/types.db"
auth-file = "/etc/collectd/auth_file"
batch-size = 5000
batch-pending = 10
batch-timeout = "10s"
read-buffer = 0 # udp读取buffer的大小,0表示使用操作系统提供的值,如果超过操作系统的默认配置则会出错。默认值:0
opentsdb
1
2
3
4
5
6
7
8
9
10
11
12
[[opentsdb]]
enabled = false # 是否启用该模块,默认值:false
bind-address = ":4242" # 绑定地址,默认值:":4242"
database = "opentsdb" # 默认数据库:"opentsdb"
retention-policy = "" # 存储策略,无默认值
consistency-level = "one" # 一致性级别,默认值:"one"
tls-enabled = false # 是否开启tls,默认值:false
certificate= "/etc/ssl/influxdb.pem" # 证书路径,默认值:"/etc/ssl/influxdb.pem"
log-point-errors = true # 出错时是否记录日志,默认值:true
batch-size = 1000
batch-pending = 5
batch-timeout = "1s"
udp
1
2
3
4
5
6
7
8
9
[[udp]]
enabled = false # 是否启用该模块,默认值:false
bind-address = ":8089" # 绑定地址,默认值:":8089"
database = "udp" # 数据库名称,默认值:"udp"
retention-policy = "" # 存储策略,无默认值
batch-size = 5000
batch-pending = 10
batch-timeout = "1s"
read-buffer = 0 # udp读取buffer的大小,0表示使用操作系统提供的值,如果超过操作系统的默认配置则会出错。 该配置的默认值:0
continuous_queries
1
2
3
4
[continuous_queries]
enabled = true # enabled 是否开启CQs,默认值:true
log-enabled = true # 是否开启日志,默认值:true
run-interval = "1s" # 时间间隔,默认值:"1s"

连接influxdb

用默认的配置文件启动后,输入 influx 命令即可直接连接到本地的influxdb服务

1
2
3
4
$ influx
Connected to http://localhost:8086 version 1.2.4
InfluxDB shell 1.2.4
>

InfluxQL语言介绍

InfluxDB使用的是一种SQL like的查询语言,叫做InfluxQL。与标准SQL的语法类似,但也有为InfluxDB定制的语法,比较容易上手。比如接下来先创建用户:

1
2
3
4
5
6
7
8
-- 创建一个管理员用户
CREATE USER "admin" WITH PASSWORD '111111' WITH ALL PRIVILEGES
-- 创建一个普通用户
CREATE USER "user" WITH PASSWORD '111111'
-- 为用户授权读权限
GRANT READ ON [database] to "user"
-- 为用户授权写权限
GRANT WRITE ON [database] to "user"

修改InfluxDB的配置文件,设置http下的auth-enabled = true,重启后,使用influx命令登录数据库就需要用户名和密码了。(Influx命令实际上也是使用API来操作InfluxDB的,InfluxDB只提供了API接口)

1
2
3
4
$ influx -username admin -password ''
Connected to http://localhost:8086 version 1.2.x
InfluxDB shell 1.2.x
>

在-password后接空字符串回车后输入密码可以屏蔽掉密码显示,不要直接在-password后跟上密码。

接下来是一系列的创建操作

1
2
3
4
5
6
7
8
-- 创建数据库,默认设置
CREATE DATABASE "foo"
-- 创建数据库,同时创建一个Retention Policy,这个东西不知道怎么翻译,可以认为是一个DATABASE的属性描述
-- Retention Policy各部分描述:DURATION为数据存储时长,下面的1d即只存1天的数据;REPLICATION为数据副本,一般在使用集群的时候才会设置为>1;SHARD DURATION为分区间隔,InfluxDB默认对数据分区,下面的30m即对数据每隔30分钟做一个新的分区;Name是RP的名字。
CREATE DATABASE "bar" WITH DURATION 1d REPLICATION 1 SHARD DURATION 30m NAME "myrp"
 
-- 可以单独创建RP,加在已经创建的DB上
CREATE RETENTION POLICY "events" ON "somedb" DURATION 60m REPLICATION 2 SHARD DURATION 30m

InfluxDB还支持其他DDL,具体可猛击https://docs.influxdata.com/influxdb/v1.2/query_language/spec/#queries 查看Influx Reference。

由于InfluxDB的无结构(schemeless)特性,我们不需要预先建表,直接use [ database ]后就可以写入数据了。举个栗子。

1
2
3
INSERT cpu,host=serverA,region=us_west value=0.64

INSERT temperature,machine=unit42,type=assembly external=25,internal=37

面语句中的cpu, temperature为InfluxDB某个database的measurement;host,region,machine,type为对应measurement下的tags;value,external,internal为对应measurement下的field,是measurement的实际值;而INSERT的一行数据称为一个point

measurement,tags,fields,points与普通的关系型数据库的对应:

  • measurement类似于SQL中的table;
  • tags类似SQL中的被索引的列;
  • fields类似于SQL中没有被索引的列;
  • points对应SQL的table中的每行数据。

更详细的介绍猛戳https://docs.influxdata.com/influxdb/v1.2/concepts/glossary/

然后读数据:

1
2
3
4
5
6
SELECT "host", "region", "value" FROM "cpu"
SELECT * FROM "temperature"
-- measurement都可以用正则表示,下面表示读一个db下的所有measurement的数据
SELECT * FROM /.*/
-- 配上where条件
SELECT "region", "value" FROM "cpu" where "host" = "server1"

在select中使用tags的字段来作为where中的条件最好,因为tags都是有索引的,而field是没有索引的。select的列必须带有一个field,否则是查不出来的。

参考文档