Influxdb v1.x 安装使用介绍,Influxdb 配置优化等
安装
步骤
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm
rpm -ivh influxdb-1.1.0.x86_64.rpm
启动:
systemctl enable influxdb
systemctl start influxdb
注:本示例是在 centos7
中配置的服务。
文件说明
安装后, 在/usr/bin
下面有如下文件:
influxd influxdb服务器
influx influxdb命令行客户端
influx_inspect 查看工具
influx_stress 压力测试工具
influx_tsm 数据库转换工具(将数据库从b1或bz1格式转换为tsm1格式)
在/var/lib/influxdb/
下面会有如下文件夹:
data 存放最终存储的数据,文件以.tsm结尾
meta 存放数据库元数据
wal 存放预写日志文件
配置文件路径 :/etc/influxdb/influxdb.conf
默认端口
influxdb使用的端口如下:
Enabled ports:
- 8086: Influxdb HTTP service 默认运行端口
- 8088: 备份和存储的 RPC service 运行端口
Disabled ports:
- 2003: Graphite service 默认运行端口
- 4242: 时间序列服务(OpenTSDB service)默认运行端口
- 8089: UDP service 默认运行端口
- 25826: Collectd service 默认运行端口
使用
InfluxDB
的操作语法 InfluxQL
与 SQL
基本一致,也提供了一个类似 mysql-client
的名为influx
的CLI。
登陆
登陆数据库命令:
influx -host 127.0.0.1 -port 8086
用户权限管理
关于用户的操作如下:
# 显示用户
SHOW USERS
# 创建用户
CREATE USER <username> WITH PASSWORD <password>
# 创建管理员权限的用户
CREATE USER <username> WITH PASSWORD <password> WITH ALL PRIVILEGES
# 删除用户
DROP USER <username>
influxdb的权限设置比较简单,只有读、写、ALL几种。更多用户权限设置可以参看官方文档。默认情况下,influxdb类似与mongodb,是不开启用户认证的,可以修改其 conf文件,配置http块内容如下:
[http]
enable = true
bind-address = ":8086"
auth-enabled = true # 开启认证
DATABASES
通过influx
命令进行管理,可以使用如下命令创建数据库:
# 创建数据库
create database <db_name>
# 查询所有数据库
> show databases
# 使用某个数据库
> use <db_name>
# 设置时间格式
> precision rfc3339
建库的操作可以发现非常类似于mysql下的操作。
MEASUREMENTS
而在influxdb下没有细分的表的概念,influxdb
下的表在插入数据库的时候自动会创建:
# SHOW measurements命令查看所有的表,这个类似于mysql下的 show tables;
SHOW MEASUREMENTS;
# 创建表,直接在插入数据的时候指定表名
INSERT <measurement_name>,host=server1,region=cn_east-1 value=0.68
# 删除表
DROP MEASUREMENT <measurement_name>
# 查询tag
show tag keys from <measurement_name>
# 查询field
show field keys from <measurement_name>
INSERT 插入说明:
<measurement_name>
:表名
host=server1,region=cn_east-1 tag
value=0.68 field
SELECT
# 查询全部数据
select * from <measurement_name> order by time desc
# 查询最近的三条数据
SELECT * FROM <measurement_name> ORDER BY time DESC LIMIT 3
# 正则表达式查询
SELECT * FROM /.*/ LIMIT 1
WHERE
# 指定条件查询,值要用单引号引上,否则有时候不能正常返回数据
select * from "86400"."abc.86400" where name = 'abc';
DELETE
# 删除某条数据
delete from <measurement_name> where time=1480235366557373922
ALTER
update
更新语句没有,不过有alter
命令,在influxdb
中,删除操作用和更新基本不用到。
- 当
insert
的 time
和 tags
跟原有的数据重复时,会覆盖掉原有数据的 field value
,实现类型更新的操作。
数据保存策略(Retention Policies)
influxDB是没有提供直接删除数据记录的方法,但是提供数据保存策略,主要用于指定数据保留时间,超过指定时间,就删除这部分数据。修改或创建,可能丢失历史数据。
SHOW
# 查看当前数据库的Retention Policies
SHOW RETENTION POLICIES ON <db_name>
CREATE
# 创建新的Retention Policies
CREATE RETENTION POLICY <retention_policies_name> ON <db_name> DURATION 30d REPLICATION 1 [SHARD DURATION <shardGroupDuration>] DEFAULT
说明如下:
- <retention_policies_name>:策略名
- <db_name>:具体的数据库名
- 30d:保存30天,30天之前的数据将被删除,它具有各种时间参数,比如:h(小时),w(星期)
- REPLICATION 1: 副本个数,这里填1就可以了
- DEFAULT:设为默认的策略
- shardGroupDuration:
ALTER
# 修改 Retention Policies
ALTER RETENTION POLICY <retention_policies_name> ON <db_name> DURATION 3w DEFAULT
DROP
# 删除 Retention Policies
DROP RETENTION POLICY <retention_policies_name> ON <db_name>
连续查询(Continuous Queries)
当数据超过保存策略里指定的时间之后,就会被删除。如果我们不想完全删除掉,比如做一个数据统计采样:把原先每秒的数据,存为每小时的数据,让数据占用的空间大大减少(以降低精度为代价)。这就需要InfluxDB提供的:连续查询(Continuous Queries)。
SHOW
# 查看数据库的Continous Queries
SHOW CONTINUOUS QUERIES
CREATE
# 创建新的 Continuous Queries
CREATE CONTINUOUS QUERY cq_30m ON testDB BEGIN SELECT mean(temperature) INTO weather30m FROM weather GROUP BY time(30m) END
说明如下:
- cq_30m:连续查询的名字
- testDB:具体的数据库名
- mean(temperature): 算平均温度
- weather: 当前表名
- weather30m: 存新数据的表名
- 30m:时间间隔为30分钟
当我们插入新数据之后,通过SHOW MEASUREMENTS
查询发现。可以发现数据库中多了一张名为weather30m
(里面已经存着计算好的数据了)。这一切都是通过Continuous Queries
自动完成的。
DROP
# 删除Continuous Queries
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
RESTful 接口操作
插入及查询操作:
now=$(date '+%FT%T.000Z')
tomorrow=$(date -v +1d '+%FT%T.000Z')
echo "creating database"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE DATABASE foo"
echo "creating retention policy"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION INF REPLICATION 1 DEFAULT"
echo "inserting data"
curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$now\",\"fields\": {\"value\": 100}}]}" -H "Content-Type: application/json" http://localhost:8086/write
echo "inserting data"
curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$tomorrow\",\"fields\": {\"value\": 200}}]}" -H "Content-Type: application/json" http://localhost:8086/write
sleep 1
echo "querying data"
curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu"
echo "querying data"
curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu where time < now() + 10d"
GZIP压缩数据插入及查询:
echo "inserting data"
curl -v -i -H "Content-encoding: gzip" -H "Content-Type: application/json" -X POST -T foo.json.gz http://localhost:8086/write
rm foo.json.gz
echo "querying data with gzip encoding"
curl -v -G --compressed http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT sum(value) FROM \"foo\".\"bar\".cpu GROUP BY time(1h)"
还可以指定数据保存策略及表的各关键值插入:
echo "creating retention policy"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION 300d REPLICATION 3 DEFAULT"
curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"uswest"},"time": "2015-02-26T22:01:11.703Z","fields": {"rx": 2342,"tx": 9804}}]}' -H "Content-Type: application/json" http://localhost:8086/write
curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"useast"},"time": "2015-02-27T22:01:11.703Z","fields": {"rx": 4324,"tx": 7930}}]}' -H "Content-Type: application/json" http://localhost:8086/write
无论是influx还是通过RESETful 参数进行查询,其还有pertty参数可以使输出的json格式更加美观 。除此之外,influx命令还有column、CSV等格式输出,influx命令支持通过import参数输入类csv类格式的数据。
influxdb 配置
配置
配置文件路径 :/etc/influxdb/influxdb.conf
,可以通过以下命令生成默认配置文件:
influxd config > default.conf
配置优先级
环境变量 > 文件配置 > 默认设置
全局选项
- reporting-disabled 发送数据统计给influxdb
- retention-autocreate 自动创建保留策略,默认永久保留
[data]
-
index-version = “inmem”
-
wal-fsync-delay 预写日志刷新延迟(非ssd磁盘建议0-100ms)
-
max-concurrent-compactions 配置 GOMAXPROCS
最大进程数,默认为CPU总数的一半,不能超过CPU总数。GOMAXPROCS is Go language environment variable can be used to set the maximum number of CPUs that can execute simultaneously.
-
cache-max-memory-size 最大缓存容量,占满会拒绝写入
-
cache-snapshot-memory-size 缓存快照大小。满后会将内存内容写入到TSM文件
-
max-series-per-database = 0
-
max-values-per-tag = 0
-
index-version = “tsi1”
max-index-log-file-size = "1m"
series-id-set-cache-size = 100
- max-index-log-file-size :预写日志的文件大小达到多大的阈值之后,将其压缩为索引文件,阈值越低,压缩越快,堆内存使用率越低,但会降低写入的吞吐量。
- series-id-set-cache-size :使用内存缓存的 series 集的大小,由于 TSI 索引存储在了磁盘文件中,因此使用时需要额外的计算工作,但如果将索引结果缓存起来的话就可以避免重复的计算,提高查询性能。默认缓存 100 个 series ,这个值越大则使用的堆内存越大,设置为 0 则不缓存。
[coordinator]
- write-timeout = “10s”
- query-timeout = “30s” # 若一次查询了非常多的数据,该查询就会执行很长时间;如果这种大的查询比较多的话,influxdb就会耗费几乎所有的CPU来做这些数据查询,并且影响其它小的查询
- max-concurrent-queries = 0
[shard-precreation]
Web 管理
默认 WEB 管理
当前版本的influxdb,默认情况下未开启web管理功能。可以通过修改influxdb.conf文件中admin项的配置开启web管理界面,具体如下:
[admin]
# Determines whether the admin service is enabled.
enabled = true
# The default bind address used by the admin service.
bind-address = ":8083"
backup and restore
- 备份指定时间段的数据
influxd backup -portable \
-host 127.0.0.1:8088 \
-database mon \
-start 2017-01-01T00:00:00Z \
-end 2019-12-31T23:59:59Z \
-retention 86400 \
/tmp/mon/
- 还原数据到新库
influxd restore -portable \
-host 127.0.0.1:8088 \
-db mon \
-newdb archive_mon \
/tmp/mon/
新特性
F&Q
partial write: points beyond retention policy dropped=1 service=udp
一般是由于时间不对导致的,比如数据库的 rp 是10天,而插入的数据点中有时间戳在此范围外,即引发该错误