InfluxDB 原理与实践(笔记)

InfluxDB

InfluxDB是开源的、高性能的时序型数据库。

什么是时序型数据?
按照时间顺序记录系统、设备状态变化的数据被称为"时序数据(Time Series Data)"

时序数据三个特点:
1、抵达的数据几乎总是作为新条目被记录,无更新操作
2、数据通常按照时间顺序抵达
3、时间是一个主坐标轴

InfluxDB是作为TICK的存储系统进行设计和开发的。TICK(Telegraf+InfluxDB+Chronograf+Kapacitor)
1、Telegraf是用于采集和上报指标的数据采集程序,采用灵活的,可配置的插件实现。
2、InfluxDB是专注于时序数据场景,如DEVOPS监控,IoT监控,实时分析等,支持灵活的自定义保留策略和类SQL操作接口。
3、Chronograf是可视化的、BS架构的管理系统,可用于配置和管理接收到的监控数据、告警
4、Kapacitor是从零构建的原生数据处理引擎,支持流式处理和批量处理。

InfluxDB优势、特点:
InfluxDB是支持时序数据高效读写、压缩存储、实时计算能力的数据库服务,还有如下:
1、无系统环境依赖,部署方便
2、无模式的数据模型,灵活强大
3、原生HTTP管理接口,免插件配置和免第三方依赖
4、强大的类SQL查询语句
5、丰富的权限管理功能,精细到"表"级别
6、丰富的时效管理功能:自动删除过期数据,自定义删除指标数据
7、低成本存储,采样时序数据,压缩存储
8、丰富的聚合函数:支持AVG,SUM,MAX,MIN等聚合函数

InfluxDB默认监听两个端口:8086和8088
8086:是InfluxDB服务端HTTP RESTful API接入服务的监听端口
8088:是InfluxDB RPC服务的监听端口,主要用于数据的备份和还原等
配置文件默认在/etc/influxdb/influxdb.conf
InfluxDB使用本地的UTC时间作为数据的时间戳

检查防火墙是否开启8086和8088端口:
# iptables -L -nv --line | grep 8086
# iptables -L -nv --line | grep 8088

开启8086和8088的端口:
# iptables -I INPUT -p tcp --dport 8086 -j ACCEPT
# iptables -I INPUT -p tcp --dport 8088 -j ACCEPT

influx 命令支持的参数:
1.--version 显示程序版本信息
2.-host 'host name' 指定要连接的主机的主机名
3.-port 'port' 指定要连接的主机端口号
4.-socket 'unix domain socket' 以UNIX或socket 方式连接InfluxDB
5.-database 'database name' 指定要连接的数据库名
6.-password 'password' 连接时用于认证的密码
7.-username 'username' 连接时用于认证的用户名
8.-ssl 启动HTTPS连接
9.-unsafeSsl 当使用HTTPS连接到集群时不使用SSL验证
10.-execute 'command' 执行命令
11.-type 'influx|flux' 指定调用 REPL 时使用的查询语言
12.-format 'json|csv|column' 指定服务器响应内容的格式,支持json、cvs、column
13.-precision 'rfc3339|h|m|s|ms|u|ns' 指定时间戳的格式,默认格式为rfc3339
14.-consistency 'any|one|quorum|all' 指定写入一致性级别
15.-pretty 以阅读友好的方式显示JSON格式的内容
16.import 从之前的备份文件中还原备份数据
17.-pps 设置数据导入时每秒允许导入多少条时序数据,默认为0,不限制速率
18.-path 需要还原的备份文件的路径
19.compressed 设置为true时,表示支持导入压缩格式的备份文件

influxd 是InfluxDB的守护进程,命令支持的参数:
1.backup 数据备份
2.config 显示InlfuxDB的默认配置信息
3.help 显示帮助
4.restore 还原之前通过backup命令备份的数据
5.run 运行程序,默认参数,可忽略
6.version 显示程序版本信息

influx_inspect 是InfluxDB的数据检查工具,可通过influx_inspect查看InfluxDB的TSM格式文件的内容
influx_inspect dumptsm -all /var/lib/influxdb/data/monitor/autogen/6/0000000001-0000000001.tsm

influx_inspect 命令支持的参数:
1.deletetsm 批量删除原始TSM文件
2.dumptsi 显示tsi 1 文件的底层细节信息
3.dumptsm 显示tsm 1 文件的底层细节信息
4.buildtsi 从tsm 1 数据中生成tsi 1 索引信息
5.help 显示帮助
6.export 导出数据
7.report 显示分片级别的数据信息
8.verify 验证TSM文件的完整性
9.verify-seriesfile 验证时序文件的完整性

influx_stress 是InfluxDB的压力测试工具,但从v1.2.0开始弃用,推荐使influx-stress和influxdb-comparisons进行压测

influx_tsm 是InfluxDB的数据库格式转换工具,可以将数据库从b1或bz1格式转换为tsm 1格式,b1和bz1为InfluxDB之前版本支持的格式。
influx_tsm 命令支持的参数:
1.-backup string 备份文件的存放位置,但是不能再当前数据的存储目录中备份
2.-dbs string 以逗号分隔的要转换的数据库列表,默认转换所有数据库的数据
3.debug string 在给定的HTTP地址上开启debug功能
4.-interval duration 打印状态更新的频率,默认为5秒
5.-nobackup 禁用数据库备份(不推荐)
6.-parallel 启用并行转换
7.-profile string CPU profile文件的存储位置
8.-sz uint 单个TSM文件的大小(默认为2147483648)
9.-y 不询问,直接转换

基础操作命令:
1.show databases 查看数据库
2.create database dbname 创建数据库
3.use dbname 选择数据库
4.show measurements 查看当前数据库的表信息
5.select * from tablename 查询表信息内容
6.show continuous queries 查看连续查询
7.show retention plicies on dbname
insert cpu_usage,host=server01,region=us-west value=0.64 (inlfuxdb不需要创建表,写入时序时会自动创建表)

-----------------------------------------------------------------------------------------------------------------------------
写入和查询

一、操作模式:
1.
# influx
Connected to http://localhost:8086 version 1.7.3
InfluxDB shell version: 1.7.3
Enter an InfluxQL query
> help # 查看支持的内置命令和信息
Usage:
connect <host:port> connects to another node specified by host:port
auth prompts for username and password
pretty toggles pretty print for the json format
chunked turns on chunked responses from server
chunk size <size> sets the size of the chunked responses. Set to 0 to reset to the default chunked size
use <db_name> sets current database
format <format> specifies the format of the server responses: json, csv, or column
precision <format> specifies the format of the timestamp: rfc3339, h, m, s, ms, u or ns
consistency <level> sets write consistency level: any, one, quorum, or all
history displays command history
settings outputs the current settings for the shell
clear clears settings such as database or retention policy. run 'clear' for help
exit/quit/ctrl+d quits the influx shell

show databases show database names
show series show series information
show measurements show measurement information
show tag keys show tag key information
show field keys show field key information

A full list of influxql commands can be found at:
https://docs.influxdata.com/influxdb/latest/query_language/spec/

2.auth 提示输入用户名和密码,然后再执行操作influx命令行操作
> auth
username:
password:

3.connect命令,在不退出命令行shell的情况,连接到指定主机名和端口的influxDB服务器
> connect <host:port>

4.consistency命令,用于配置写一致性级别,目前支持any、one、quorum、all
any:任何一个节点写入成功后,后者接收节点已将数据写入 Hinted-handoff缓存后,就会返回成功给客户端
one:任何一个节点写入成功后,立即返回成功给客户端,不包括成功写入Hinted-handoff缓存
quorum:当大多数节点写入成功后,就会返回成功给客户端。此选项仅在副本数大于2时才有意义,否则等效于all
all:仅在所有节点都写入成功后返回成功
语法:
> consistency <level>

4.format 设置服务器响应数据的格式,支持JSON、CSV、COLUMN
> format <format>

5.history 显示历史操作的命令

6.insert 命令,写入行协议格式的时序数据

7.precision命令,指定查询和写入的时间戳格式,支持rfc3339(YYYY-MM-DDTHH:MM:SS.nnnnnnnnZ)精度默认为纳秒
> precision <format>

8.pretty命令,开始JSON格式的漂亮打印
$ inlfux -format=json
> pretty
> show databases

9.settings 命令,输出当前设置信息,包括host、username、database、pretty设置、format格式、Write consistency设置等。

HTTP 状态码:
1.204 No Conent 执行成功
2.400 Bad Request 请求错误,可能是由于行协议语法错误或写入了一个错误的字段类型
3.401 Unauthorized 请求错误,可能是由于认证问题
4.404 Note Found 请求错误,可能是由于写入了一个不存在的数据库
5.Internal Server Error 系统过载或核心信息不匹配,可能是由于写入了一个不存在的保留策略

二、写入
1.行协议的单行文本表示一条时序数据,由表、标签集、指标集合时间戳组成。
语法:
<measurement>[<tag-key>=<tag-value>....] <filed-key>=<filed-value>[,<filed2-key>=<filed2-value>] [timestamp]

标签对"tag-key=tag-value"分别是标签键和标签值,用于创建索引提高查询性能,标签键和标签值要求是字符串,该数据保存在META节点中。

指标对"filed-key=filed-value"分别是指标键和指标值,不会被索引,一般存放的是具体的时序数据,随着时间戳的变化而变化的数据。指标键要求是字符串,指标
值可以为字符串类型、浮点型、整型或者布尔型数据。

timestamp可选参数,纳秒级精度

2.特殊符号需要用()进行转移处理,如下:
双引号 ""
反斜杠
逗号 ,
等号 =
空格
注意:
1.航协议对空格敏感,标签集和指标集中间必须有空格
2.时间戳参数不可以加引号,否则会报错
3.指标值支持字符串类型,要使用双引号将字符串类型的指标值括起来,非字符串不能加引号,否则会被当成字符串来处理

除了时间戳字段,其他字段如表、标签键、标签值、指标键、指标值是大小写敏感。

3.inlfux -import导入
$ inlfux -import -path=cpu_usage.txt

三、查询
1.select
2.where
3.group by
4.order by [desc|asc]
5.limit
6.slimit
7.offset
8.soffset

四、聚合函数
1.count() 返回非空指标值的数量,支持嵌套DISTINCT()子句
2.DISTINCT() 对指定指标值进行去重,并返回去重后的指标值数量
3.INTEGRAL() 返回指标值曲线下的面积,即积分
4.MEAN() 返回指标值的平均值,支持int64和float64两种数据类型
5.MEDIAN() 返回排好序的指标值的中位数
6.MODE() 返回出现频率最高的指标值
7.SPREAD() 返回最大指标值和最小指标值的差值
8.STDDEV() 返回指标值的标准差
9.SUM() 返回指标值的和

五、选择函数
1.BOTTOM() 返回最小的N个指标值
2.FIRST() 返回时间戳最早的值
3.LAST() 返回时间戳最新的值
4.MAX() 返回最大的指标值
5.MIN() 返回最小的指标值
6.PERCENTILE() 返回百分位数为N的指标值
7.SAMPLE() 返回N个随机抽样的指标值
8.TOP() 返回最大的N个filed值
-----------------------------------------------------------------------------------------------------------------------------
连续查询和保留策略

一、连续查询
语法:
CREATE CONTINUOUS QUERY <cq_name> ON <database name>
BEGIN
<cq_name>
END

高级连续查询语法:
CREATE CONTINUOUS QUERY <cq_name> ON <database name>
RESAMPLE EVERY <interval> FOR <interval>
BEGIN
<cq_name>
END

二、管理连续查询
1.系统中已创建的连续查询
show continuous queries
2.删除连续查询
DROP CONTINUOUS QUERY <cq_name> ON <database name>
3.目前InfluxDB不支持修改连续查询,只能删除再修改后创建

三、保留策略
InfluxDB会计算本地服务器时间和存储数据的时间戳的差值,如果该差值大于保留策略设置的保留市场,则会将这些数据删除。

1.创建保留策略
CREATE RETENTION POLICY <retention_policy_name> ON <database name>
DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>]
[DEFAULT]
[SHARD DURATION <duration>]和[DEFAULT]为可选项,其他为必选设置项

DURATION子句指定了inlfuxDB需要保留数据的时长:
(1).DURATION <duration>为保留时间长度或者INF(代表infinite:无限长),最小保留时间是一个小时
(2).REPLICATION子句指定了集群中每条数据有多少个不相关的副本,<n>表示指定的副本数,副本数的最大值为DATA节点的节点个数
注意:InfluxDB开源版DATA节点的节点数为1,该子句不生效,该子句主要用于集群版
(3).SHARD DURATION子句决定了一个分片组对应的时间范围,它设置的<duration>值也是一个时间长度,不支持无限长
例如:创建一个保留策略,数据以 1 个副本的形式保留一天:
create retention policy "rp_one_day" on "rp_test_database" duration 1d replication 1

2.查询保留策略
SHOW RETENTION POLICIES ON <database name>

3.管理保留策略
(1).修改保留策略
ALTER RETENTION POLICY <retention_policy_name> ON <database name>
DURATION <duration> REPLICATION <n> SHARD DURATION <duration> [DEFAULT]

(2).删除保留策略
DROP RETENTION POLICY <retention_policy_name> ON <database name>

注意:如果修改了默认数据保留策略,还想查询之前策略的数据,则需要在查询表之前加上策略的名称:"autogen.tablename" 或 新策略:"rp_one_day.tablename"
-----------------------------------------------------------------------------------------------------------------------------
认证与授权

一、认证
1.HTTP 基本认证:
$ curl -G http://localhost:8086/query -u admin:123456 --data-urlencode "q=show databases"
-G 表示HTTP GET的方式发送数据
-u 表示用户名密码
--data-urlencode 表示请求采用URL彪马
q= 表示最终传给influxdb服务器的查询语句

2.将用户凭证放在URL中认证:
$ curl -G "http://localhost:8086/query?u=admin&p=123456" --data-urlencode "q=show databases"

3.将用户凭证放在HTTP请求中认证:
$ curl -G http://localhost:8086/query --data-urlencode "u=admin" --data-urlencode "p=123456" --data-urlencode "q=show databases"

二、inlfux 认证
1.通过环境变量进行认证:
$ export INFLUX_USERNAME yoon
$ export INFLUX_PASSWORD influx_yoon_passwd
$ yoon influx_yoon_passwd
$ influx

2.influx 参数认证:
$ influx -username yoon -password influx_yoon_passwd

3.auth 命令认证:
$ influx
>auth
username:
password:

三、权限
1.数据库管理:
CREATE DATABASE
DROP DATABASE
DROP SERIES
DROP measurement
CREATE RETENTION POLICY
ALTER RETENTION POLICY
DROP RETENTION POLICY
CREATE CONTINUOUS QUERY
DROP CONTINUOUS QUERY

2.账户管理
CREATE USER
CRANT ALL PRIVILEGES
REVOKE ALL PRIVILEGES
SHOW USERS
GRANT [READ,WRITE,ALL]
REVOKE [READ,WRITE,ALL]
SHOW GRANTS
SET PASSWORD
DROP USER

3.非管理账户
READ
WRITE
ALL (包含READ和WRITE)

四、账户管理命令
1.创建账户
语法:
CREATE USER <username> WITH PASSWORD '<password>' ["WITH ALL PRIVILEGES"]
注意:
(1).["WITH ALL PRIVILEGES"] 是给管理员账号授权时指定,否则不需要指定
(2).如果以数字开头或者关键字,或者包含特殊字符,必须用双引号引起来
(3).密码字符串必须用单引号引起来
(4).如果密码包含单引号或者换行符,提交认证请求时应该用反斜杠进行转义

2.授权账户
语法:
GRANT [READ,WRITE,ALL,ALL PRIVILEGES] [ON <database name>] TO <username>

3.取消授权
语法:
REVOKE [READ,WRITE,ALL,ALL PRIVILEGES] [ON <database name>] FROM <username>

4.修改密码
语法:
SET PASSWORD FOR <username> = '<password>'

5.删除账户
DROP USER <username>
-----------------------------------------------------------------------------------------------------------------------------
集群和高可用

一、在influxdb开源版中,一个完整的InfluxDB是由META节点和DATA节点两个逻辑单元组成的。

1.DATA节点
DATA节点存储具体的时序数据,并接收和处理时序数据的写入与查询请求,高可用必须安装两个DATA节点

2.META节点
META节点存储集群运行的关键元信息,包括各节点的服务器信息、数据库信息、用户信息、连续查询信息、保留策略信息、订阅信息等
注意:为实现高可用,必须安装至少三个META节点(META节点数量必须是奇数)

3.复制因子
复制因子属于保留策略的属性,用于确定在集群中存储数据的副本数(复制因子小于或等于META节点数)
任何大于2的复制因子都会在集群中提供额外的容错和查询容量

二、集群架构

META-0 <--------> META-1
^ ^
| |
|---->META-2<---|
^ ^
| |
ˇ ˇ
DATA-0 <--> DATA-1

1.META节点间通过默认的端口为8089的TCP协议和 raft 容错分布式一致性协议进行通信,并通过默认的8091的端口提供HTTP RESETful API接口。
2.DATA节点间通过默认的端口为8088的TCP协议通信,DATA节点通过访问META节点的端口为8091的HTTP RESETful API与META节点通信。
3.所有META节点能够互相通信,且DATA节点能够与所有META节点进行通信。
4.META节点集群使用HashiCorp的实现作为容错分布式一致性协议,与Consul中使用的raft实现相同,DATA节点基于TCP的ProtoBuf协议进行数据复制,数据查询。

META节点包含以下所有元数据:
1.集群中的所有节点及其角色属性
2.及群众的数据库信息和保留策略信息
3.分片和分片组信息,以及分片对应的节点信息
4.账户及其权限信息
5.连续查询信息

META节点将上述数据保存在硬盘上的Raft数据库中,Raft数据库是通过BoltDB实现的。

DATA节点包含所有原始时序数据和相关的元数据:
1.表
2.标签键和标签值
3.指标键和指标值

Hinted-handoff是一种基于硬盘的持久化缓存队列机制,可以避免在写入过程中因DATA节点故障而导致的数据不一致。进行写操作时,写失败的时序数据记录会被缓存到
Hinted-handoff硬盘队列,接收节点会在硬盘上位每个无法到达的DATA节点创建单独的队列,缓存的数据会被周期性的重传到对应的DATA节点。

Anti-Entropy 是保证分片的一致性,并且能够自动修复分片不一致的问题,前期是分片副本足够用。
-----------------------------------------------------------------------------------------------------------------------------
备份管理和节点管理

一、完整备份
1.备份全局参数:
-auth-type [none|basic|jwt] 指定要使用的认证类型,默认是none
-bind <hostname>:<port> 指定要连接的META节点HTTP地址,默认是localhost:8091
-bind-tls 使用TLS,如果META节点已启用HTTPS,则必须使用此参数才能连接到META节点
-pwd <password> 密码
-k 跳过证书验证,如果-bind-tls未指定,忽略此参数
-secret 指定JSON WEB TOKEN共享秘钥
-user 用户名称

2.备份选项:
-db <string> 需要备份对应数据库名称
-from 要连接的DATA节点的TCP地址
-full 执行完整备份
-rp 需要备份的数据对应的保留策略名称,使用-rp参数,必须指定-db
-shard 需要备份的数据对应的分片ID

influxd-ctl backup -db monitor -full ./monitor-full-backup

二、还原备份
注意:
1.还原之前,需要禁用Anti-Entropy,集群中的每个DATA节点停止Anti-Entropy服务,还原完再启用
2.还原不会恢复Kapacitor订阅设置,还原到新集群时,会删除新集群 _internal数据库中的所有数据

语法:
influxd-ctl [global-options] restore [restore-options] <path-to-backup-directory>

1.还原命令选项:
-db 数据库名称
-full 还原完整备份
-list 显示备份的内容
-newdb 还原到新数据库的名称,必须指定-db
-newrf 还原备份时数据对应的新副本数,最大值为集群中的DATA节点数
-newrp 还原备份时数据对应的新保留策略名称
-rp 要还原的备份中数据对应的保留策略的名称
-shard 要还原的备份中数据对应的分片ID

influxd-ctl restore -db monitor -newdb restore_monitor monitor-full-backup

2.将数据从新数据库复制到现有数据库:
$ influx
$ use restore_telegraf
$ select * into telegraf..:measurement from /.*/ group by *

3.导出数据
influx_inspect export 支持参数:
(1).-compress 使用gzip压缩数据,默认不压缩数据
(2).-database 数据库名称
(3).-datadir DATA节点数据对应的存储目录
(4).-end 范围结束的时间戳,rfc3339格式
(5).-out 导出数据的存储目录
(6).-retention 导出数据对应的保留策略名称
(7).-start 范围开始的时间戳
(8).-waldir DATA节点WAL文件对应的存储目录

例如:导出telegraf中保留策略autogen对应的数据:
influx_inspect export -database telegraf -retention autogen -out telegraf.export

4.导入数据
influx -import 支持参数:
(1).-path 导入数据对应的存储目录
(2).-compressed 如果导入文件为压缩文件
(3).-pps 导入允许的速率
(4).-precision 'rfc3339|h|m|s|ms|u|ns' 指定时间戳的格式,默认格式为rfc3339,精度默认为ns

例如:
influx -import -path ./telegraf.export

三、节点管理
influx-ctl 是每个META节点中都包含的工具程序,用于管理企业版集群

META节点添加、删除、更新操作
1.添加新的META节点
Influxd-ctl add-meta cluster-meta-node03:8091
-bind 通过-bind选项可远程访问添加等操作

2.移除META节点
influxd-ctl remove-meta cluster-meta-node03:8091
-force 强制删除META节点
-tcpAddr 删除META节点对应的TCP地址
-y 确认提示

3.替换META节点
influxd-ctl update-data cluster-meta-node03:8091

influxd-ctl copy-shard-status 查看分片复制状态

原文地址:https://www.cnblogs.com/hankyoon/p/14540150.html