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 查看分片復制狀態