【測試環境】
服務器:Linux Centos7.2
InfluxDB版本:influxdb-1.7.1.x86_64.rpm
【相關網址】
influxdb官網:https://www.influxdata.com/
相關API官網:https://docs.influxdata.com/influxdb/v1.7/
推薦博客:https://www.jianshu.com/p/f0905f36e9c3
【相關特點】
1)基於時間序列,支持與時間有關的相關函數(如最大,最小,求和等);
2)可度量性:你可以實時對大量數據進行計算;
3)基於事件:它支持任意的事件數據;
4)無結構(無模式):可以是任意數量的列;
5)支持min, max, sum, count, mean, median 等一系列函數;
6)內置http支持,使用http讀寫;
7)強大的類SQL語法;
8)自帶管理界面,方便使用(新版本需要通過Chronograf)
【對比OpenTSDB】
| 特性 | InfluxDB | OpentsDB |
|---|---|---|
| 單機部署 | 部署簡單、無依賴 | 需要搭建 Hbase,創建 TSD 數據表,配置 JAVA 等 |
| 集群 | 開源版本沒有集群功能 | 集群方案成熟 |
| 資源占用 | cpu 消耗更小,磁盤占用更小 | 資源消耗相比更多 |
| 存儲模型 | TSM | 基於HBase存儲時序數據(LSM) |
| 存儲特點 | 同一數據源的tags不再冗余存儲 ;列式存儲,獨立壓縮 | 存在很多無用的字段;無法有效的壓縮;聚合能力弱 |
| 性能 | 查詢更快,數據匯聚分析較快 | 數據寫入和存儲較快,但查詢和分析能力略有不足 |
| 開發 | 版本升級快,但架構簡單,類SQL語言(InfluxQL)易開發 | API較為豐富,版本較為穩定 |
【安裝部署 】
1、安裝epel源
epel (Extra Packages for Enterprise Linux)是基於Fedora的一個項目,為“紅帽系”的操作系統提供額外的軟件包,適用於RHEL、CentOS和Scientific Linux.
命令:yum install epel-release
2、安裝go環境
命令:yum install golang
3、下載influxdb安裝包
命令:wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.1.x86_64.rpm
4、安裝influxdb
命令:rpm -ivh influxdb-1.7.1.x86_64.rpm
【啟停命令】
啟動命令:service influxdb start
停止服務:service influxdb stop
重啟服務:service influxdb restart
嘗試重啟服務:service influxdb try-restart
重新加載服務:service influxdb reload
強制重新加載服務:service influxdb force-reload
查看服務狀態:service influxdb status
【web界面】
按照上面的操作安裝完畢之后,嘗試着打開InfluxDB自帶的Web頁面,結果是打不開的。因為從1.3版開始InfluxDB官方就把web界面給取消了。
嘗試了大家推薦的Grafna,安裝及使用方法參考我的另一篇學習筆記。
https://www.cnblogs.com/quchunhui/p/12381080.html
【數據模型】
參考圖一:

參考圖二:

參考圖三:

參考圖四:與傳統數據庫的名詞比較
1、database
數據庫名。在 InfluxDB 中可以創建多個數據庫,不同數據庫中的數據文件是隔離存放的,存放在磁盤上的不同目錄。
2、measurement
測量指標名。例如 cpu_usage 表示 cpu 的使用率。
3、point
由時間戳(time)、數據(field)、標簽(tags)組成。相當於傳統數據庫里的一行數據,如下表所示:

【timestamp】:
時間戳,ns單位,每個記錄都必然有這個屬性,沒有顯示添加時,默認給一個
【tag】:
標簽,kv結構,在database中,tag + measurement 一起構建索引。
tag參與索引創建,因此適合作為查詢的過濾條件。
tag數據量不宜過多,最好能有典型的辨別性(和mysql的建立索引的原則差不多)。
tag是可選的,在measurement不設置tag也是ok的。
【field】:
存儲數據,kv結構。數據類型為: long, String, boolean, float
【series】:
tag key與tag value的唯一組合。
所有在數據庫中的數據,都需要通過圖表來表示,series表示這個表里面的所有的數據可以在圖表上畫成幾條線(注:線條的個數由tags排列組合計算出來)
同一個 series 的數據在物理上會按照時間順序排列存儲在一起。
在程序中debug查看了一下series的函數結構:

【物理模型】
1、Shard
Shard在InfluxDB中是一個比較重要的概念,它和retention policy(數據保留策略)相關聯。
每一個存儲策略下會存在許多shard,每一個shard存儲一個指定時間段內的數據,並且不重復,
例如:7點-8點的數據落入shard0中,8點-9點的數據則落入shard1中。
每一個 shard 都對應一個底層的 tsm 存儲引擎,有獨立的 cache、wal、tsm file。
這樣做的目的就是為了可以通過時間來快速定位到要查詢數據的相關資源,加速查詢的過程,並且也讓之后的批量刪除數據的操作變得非常簡單且高效。
2、TSM存儲引擎
部分組成:cache、wal、tsm file、compactor。(與HBase的LSM模型類似)

數據寫入過程:

1)Cache:
cache相當於是LSM Tree中的memtabl。
插入數據時,實際上是同時往cache與wal中寫入數據,可以認為cache是wal文件中的數據在內存中的緩存。
當InfluxDB啟動時,會遍歷所有的wal文件,重新構造cache,這樣即使系統出現故障,也不會導致數據的丟失。
cache中的數據並不是無限增長的,有一個maxSize參數用於控制當cache中的數據占用多少內存后就會將數據寫入tsm文件。
每當cache中的數據達到閥值后,會將當前的cache進行一次快照,之后清空當前cache中的內容,再創建一個新的wal文件用於寫入,
剩下的wal文件最后會被刪除,快照中的數據會經過排序寫入一個新的tsm文件中。
如果不配置的話,默認上限為25MB。
2)WAL:
wal文件的內容與內存中的cache相同,其作用就是為了持久化數據,當系統崩潰后可以通過wal文件恢復還沒有寫入到tsm文件中的數據。
3)TSM File:
單個tsm file大小最大為2GB,用於存放數據。
4)Compactor:
compactor組件在后台持續運行,每隔1秒會檢查一次是否有需要壓縮合並的數據。
主要進行兩種操作,一種是cache中的數據大小達到閥值后,進行快照,之后轉存到一個新的tsm文件中。
另外一種就是合並當前的tsm文件,將多個小的tsm文件合並成一個,使每一個文件盡量達到單個文件的最大大小,減少文件的數量,並且一些數據的刪除操作也是在這個時候完成。
【存儲目錄】
InfluxDB的數據存儲主要有三個目錄。默認情況下是meta、wal以及data三個目錄。
InfluxDB安裝之后的路徑為:/var/lib/influxdb
存儲路徑可以通過/etc/influxdb/influxdb.conf里面修改,詳細請參考后面的配置文件章節。
(可以通過tree命令查看結構,使用yum install tree命令來安裝)
1、meta
存儲數據庫的一些元數據,meta目錄下有一個meta.db文件。

[root@vm1 influxdb]# tree meta
meta
└── meta.db
2、wal
存放預寫日志文件,以.wal結尾。

[root@vm1 influxdb]# tree wal
wal
├── _internal
│ └── monitor
│ ├── 1
│ │ └── _00004.wal
│ └── 3
│ ├── _00005.wal
│ └── _00006.wal
├── test1
│ ├── autogen
│ │ └── 4
│ │ └── _00002.wal
│ └── test1_rp
│ ├── 5
│ │ └── _00002.wal
│ ├── 6
│ │ └── _00002.wal
│ ├── 7
│ │ └── _00002.wal
│ ├── 8
│ │ └── _00002.wal
│ └── 9
│ └── _00002.wal
└── testdb
└── autogen
└── 2
16 directories, 9 files
3、data
存放實際存儲的數據文件,以.tsm結尾。

[root@vm1 influxdb]# tree data
data
├── _internal
│ ├── monitor
│ │ ├── 1
│ │ │ ├── 000000001-000000001.tsm
│ │ │ └── fields.idx
│ │ └── 3
│ │ ├── 000000001-000000001.tsm
│ │ └── fields.idx
│ └── _series
│ ├── 00
│ │ └── 0000
│ ├── 01
│ │ └── 0000
│ ├── 02
│ │ └── 0000
│ ├── 03
│ │ └── 0000
│ ├── 04
│ │ └── 0000
│ ├── 05
│ │ └── 0000
│ ├── 06
│ │ └── 0000
│ └── 07
│ └── 0000
├── test1
│ ├── autogen
│ │ └── 4
│ │ ├── 000000001-000000001.tsm
│ │ └── fields.idx
│ ├── _series
│ │ ├── 00
│ │ │ └── 0000
│ │ ├── 01
│ │ │ └── 0000
│ │ ├── 02
│ │ │ └── 0000
│ │ ├── 03
│ │ │ └── 0000
│ │ ├── 04
│ │ │ └── 0000
│ │ ├── 05
│ │ │ └── 0000
│ │ ├── 06
│ │ │ └── 0000
│ │ └── 07
│ │ └── 0000
│ └── test1_rp
│ ├── 5
│ │ ├── 000000001-000000001.tsm
│ │ └── fields.idx
│ ├── 6
│ │ ├── 000000001-000000001.tsm
│ │ └── fields.idx
│ ├── 7
│ │ ├── 000000001-000000001.tsm
│ │ └── fields.idx
│ ├── 8
│ │ ├── 000000001-000000001.tsm
│ │ └── fields.idx
│ └── 9
│ ├── 000000001-000000001.tsm
│ └── fields.idx
└── testdb
├── autogen
│ └── 2
│ ├── 000000001-000000001.tsm
│ └── fields.idx
└── _series
├── 00
│ └── 0000
├── 01
│ └── 0000
├── 02
│ └── 0000
├── 03
│ └── 0000
├── 04
│ └── 0000
├── 05
│ └── 0000
├── 06
│ └── 0000
└── 07
└── 0000
43 directories, 42 files
上面幾張圖中,_internal為數據庫名,monitor為存儲策略名稱,再下一層目錄中的以數字命名的目錄是shard的ID值。
【Retention Policy(保留策略)】
主要包括數據保留時間和備份個數兩個信息,
但是,備份個數只針對於集群機器,對於單點模式不起作用,需要設置為1。
每個數據庫剛開始會自動創建一個默認的存儲策略,策略名為autogen,數據保留時間為永久(0s)。
在集群中的副本個數為1,之后用戶可以自己設置(查看、新建、修改、刪除),例如保留最近2小時的數據。
插入和查詢數據時如果不指定存儲策略,則使用默認存儲策略,且默認存儲策略可以修改。
InfluxDB會定期清除過期的數據。每個數據庫可以有多個過期策略。
建議在數據庫建立的時候設置存儲策略,不建議設置過多且隨意切換。
我們嘗試通過命令行查看一下retnetion policy。命令:show retention policies on test1

可以從結果中還可以看到一個有意思的關鍵字:ShardGroup
假設保留1個月數據,ShardGroup作用就是按某一個時間間隔來歸檔這些數據,
比如按日歸檔,就是1號數據是一個ShardGroup1,2號數據是ShardGroup2。
| RP Duration | Shard Group Duration |
| <2days | 1 hour |
| >=2days and <= 6 months | 1 day |
| >6 months | 7 days |
Shard是真正存儲數據的,對於ShardGroup還需要按照series來划分,每一個Shard負責存儲一些Series的信息,
比如ShardGroup1下面有個Shard1,負責存儲seriesA和seriesB的數據,那么此時Shard1里面數據就是seriesA和seriesB在1號的數據。
【SQL語句】
==進入命令行==
命令:influx

==顯示數據庫==
命令:show databases

==新建數據庫==
命令:create database testdb

==查看retention policy(數據保存策略)==
Retention是基於數據庫的。如果沒有自定義,那么都有一個默認的值。
命令:show retention policies on test1

==創建retention policy==
CREATE RETENTION POLICY <retention_policy_name> ON <database> DURATION <duration> REPLICATION <n> [DEFAULT]
1)<retention_policy_name>:策略名稱。
2)<datbase>:數據庫名稱。 retention策略是基於數據庫的。此屬性為必填項,所以Retention policy只針對某一個數據庫進行創建的,不支持對全量的配置(對所有數據庫都生效)。
3)<duration>:時間長度。
- m:分鍾
- h:小時
- d:天數
- w:周
4)<n>:備份的份數。
5)DEFAULT:用來把當前策略設置為默認策略。
如:對數據庫test1增加一個留存策略,策略名叫test1_rp3,數據保存10天,數據備份1份
命令:create retention policy test1_rp3 on test1 duration 10d replication 1 default

==修改retention policy==
ALTERRETENTIONPOLICY <retention_policy_name> ON <database> DURATION <duration> REPLICATION <n> [DEFAULT]
1)只更新是否為默認策略。如:將策略test1_rp作為庫test1的默認策略
命令:alter retention policy "test1_rp" on "test1" DEFAULT

2)只更新保存時間。如:將策略test1_rp的保存時間變更為31天(31d×24h=744h0m0s)
命令:alter retention policy "test1_rp" on "test1" duration 31d

3)至更新備份數。如:將策略test1_rp的數據被分數變更為1。
命令:alter retention policy test1_rp on test1 replication 1 default

==刪除retention policy==
DROPRETENTIONPOLICY <retention_policy_name> ON <database>
如刪除數據庫test1中名字叫做test1_rp的策略。
命令:drop retention policy test1_rp on test1

==刪除數據庫==
命令:drop database testdb

==使用數據庫==
命令:use testdb

==顯示所有表==
命令:show measurements

==創建measurement==
insert myapp,host=127.0.0.1,service=app.service.index qps=1340,rt=1313,cpu=45.23,mem="4145m",load=1.21
insert <表名>,hostname=<索引(tag)>,value=<記錄值(field)> <時間戳>

insert + measurement + "," + tag=value,tag=value + + field=value,field=value tag與tag之間用逗號分隔;field與field之間用逗號分隔 tag與field之間用空格分隔 tag都是string類型,不需要引號將value包裹 field如果是string類型,需要加引號
==刪除表==
命令:drop measurement myapp
==查詢一個表中所有數據==
查詢語句格式:
select * from measurement_name [WHERE <tag_key> <operator>] [limit xx] 查看數據
show series [on dbname] [from measurement] [WHERE <tag_key> <operator>] [limit xx] 查看series信息
show tag keys [on dbname] [from measurement] [WHERE <tag_key> <operator>] [limit xx] 查看tag keys信息
show field keys [on dbname] [from measurement] 查看field keys
select <fields> from <tbname> [ into_clause ] [ where_clause ] [ group_by_clause ] [ order_by_clause ] [ limit_clause ] [ offset_clause ] [ slimit_clause ] [ soffset_clause ]
fields : 要查詢的字段,查詢全部可以用*
tbname : 數據表名稱
into_clause : select ... into (可選)
where_clause : where條件域(可選)
group_by_clause : group by相關(可選)
order_by_clause : order by相關(可選)
limit_clause : limit相關(可選)
offset_clause : offset相關(可選)
slimit_clause : slimit相關(可選)
soffset_clause : soffset相關(可選)
命令:select * from myapp

==查看數據庫中所有記錄==
通過”/.*/”表示所有的表。
命令:select * from /.*/

==根據tag-key查詢==
查詢數據時,都是按照tag-key進行查詢,因為tag-key是存在索引的。
命令:select * from device where deviceName = 'sensor_1'

==更新數據==
tags 和 timestamp相同時數據會執行覆蓋操作,相當於InfluxDB的更新操作。
==刪除數據==
可以按照tag刪也可以按照time刪除,我這里實驗了按照time刪
delete from device_status where time >= '2020-08-22T02:19:23.379Z' and time <= '2020-08-22T02:19:28.645Z'
==根據field-key進行查詢==
命令:select * from device where BatteryLevel > 50

==查詢所有tag key==
命令:show tag keys from device_property

==查詢tag value==
命令:show tag values from device_property with key="deviceName" limit 30;

==查詢所有field key==
命令:show field keys
命令:show field keys from device_property

==創建連續查詢==
Continuous Queries叫做“連續查詢“”
influxDB的連續查詢是在數據庫中自動定時啟動的一組語句,
InfluxDB的連續查詢是在數據庫中自動定時啟動的一組語句,語句中必須包含 SELECT關鍵詞和GROUP BY,time()關鍵詞。
使用連續查詢是最優的降低采樣率的方式,連續查詢和存儲策略搭配使用將會大大降低 InfluxDB 的系統占用量。
而且使用連續查詢后,數據會存放到指定的數據表中,這樣就為以后統計不同精度的數據提供了方便。
當數據超過保存策略里指定的時間之后就會被刪除,但是這時候可能並不想數據被完全刪掉,可以使用連續查詢將數據聚合儲存。
/*
* 在test1庫中新建了一個名為query_1m的連續查詢, * 每1分鍾取一個CarportCode字段的MEAN平均值、MEDIAN中位值、MAX最大值、MIN最小值
* 並將結果存儲到divece_1m表中,使用的數據保留策略都是default
*/ CREATE CONTINUOUS QUERY query_1m ON test1 BEGIN SELECT MEAN(CarportCode), MEDIAN(CarportCode), MAX(CarportCode), MIN(CarportCode) INTO device_1m FROM device GROUP BY productKey,deviceName,time(1m) END
==查看連續查詢==
命令:SHOW CONTINUOUS QUERIES

==刪除連續查詢==
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
命令:DROP CONTINUOUS QUERY query_1m ON test1

==顯示用戶==
命令:show users

==創建用戶==
命令:create user "user1" with password 'P@ssw0rd'

==創建管理員權限用戶==
命令:create user "admin" with password 'P@ssw0rd' with all privileges

==刪除用戶==
命令:drop user "user1"

==設置time顯示格式==
在influxdb中默認會有time字段用utc形式保存,influxdb支持三種時間格式
1)epoch_time格式
就是時間戳表示,我們一般使用的10位和13位,在influxdb中使用的時間戳是19位,單位是ns(納秒)
2)rfc3339_date_time_string格式
這種格式為:
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
其中nnnnnnnnn是可選的,如果不寫則會被設置為000000000。
注意,如果使用這種時間格式,需要使用單引號 ’ 將時間括起來。
3)rfc3339_like_date_time_string
這種格式:
'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'
其中HH::MM:SS.nnnnnnnnn可以省略,必須用單引號包括起來。
可以通過以下命令修改客戶端命令顯示格式
方式1:
命令:precision rfc3339
方式2:
命令:select AR_TEST_VAR1 from device_property where time >= now() - 1m order by time desc tz('Asia/Shanghai')

==其他條件查詢==
查詢數據大於200的。 select * from device where CarportCode > 300 實現查詢以給定字段開始的數據 select fieldName from measurementName where fieldName=~/^給定字段/ 實現查詢以給定字段結束的數據 select fieldName from measurementName where fieldName=~/給定字段$/ 實現查詢包含給定字段數據 select fieldName from measurementName where fieldName=~/給定字段/ 按照30m分鍾進行聚合,時間范圍是大於昨天的 主機名是server1的。 select mean(value) from cpu_idle group by time(30m) where time > now() – 1d and hostName = ‘server1′ limit 1000
==influx -execute==
類似 mysql -e 的功能
命令:influx -execute 'show databases' -format=column

其中-format可以為csv、json、column(默認)
==常用函數==

推薦幾個網友整理的博客:
https://blog.csdn.net/zx711166/article/details/84541198
==幾個典型語句樣例==
數據准備:
time BatteryLevel CarportCode MagneticState ParkingEventType deviceName productKey ---- ------------ ----------- ------------- ---------------- ---------- ---------- 1581145848071000000 67 133 1 1 sensor_1 a15sAX7hPtt 1581145848537000000 36 149 1 1 sensor_1 a15sAX7hPtt 1581145848993000000 60 525 1 1 sensor_1 a15sAX7hPtt 1581145849387000000 87 129 0 1 sensor_1 a15sAX7hPtt 1581145849725000000 7 934 0 1 sensor_1 a15sAX7hPtt 1581145850103000000 97 165 0 1 sensor_1 a15sAX7hPtt 1581145850548000000 65 404 1 1 sensor_1 a15sAX7hPtt 1581145851141000000 26 737 0 1 sensor_1 a15sAX7hPtt 1581145851446000000 96 198 0 1 sensor_1 a15sAX7hPtt 1581145852001000000 21 389 1 1 sensor_1 a15sAX7hPtt 1581148921828000000 63 270 1 0 sensor_1 a15sAX7hPtt 1581148922471000000 60 983 0 0 sensor_1 a15sAX7hPtt 1581148922825000000 88 379 1 0 sensor_1 a15sAX7hPtt 1581148923502000000 27 144 0 0 sensor_1 a15sAX7hPtt 1581148947163000000 89 648 1 0 sensor_1 a15sAX7hPtt 1581149039657000000 19 172 1 0 sensor_1 a15sAX7hPtt 1581149040068000000 10 77 1 0 sensor_1 a15sAX7hPtt 1581149040340000000 89 158 1 0 sensor_1 a15sAX7hPtt 1581154727654000000 75 556 0 0 sensor_1 a15sAX7hPtt 1581154730202000000 64 782 0 0 sensor_1 a15sAX7hPtt 1581154730538000000 78 776 1 0 sensor_1 a15sAX7hPtt
1)返回從現在開始3小時以內數據中CarportCode字段的平均值
語句: select mean(CarportCode) from device where time >= now() - 180m
2)按照東八區的時間顯示
select * from device_data_up order by time desc limit 10 tz('Asia/Shanghai')
【配置文件】
配置文件路徑:/etc/influxdb/influxdb.conf
全局配置
reporting-disabled = false # 該選項用於上報influxdb的使用信息給InfluxData公司,默認值為false bind-address = ":8088" # 備份恢復時使用,默認值為8088
1、meta
[meta] dir = "/var/lib/influxdb/meta" # meta數據存放目錄 retention-autocreate = true # 用於控制默認存儲策略,數據庫創建時,會自動生成autogen的存儲策略,默認值:true logging-enabled = true # 是否開啟meta日志,默認值:true
2、data
[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
3、coordinator
查詢管理的配置選項
[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
4、retention
舊數據的保留策略
[retention] enabled = true # 是否啟用該模塊,默認值 : true check-interval = "30m" # 檢查時間間隔,默認值 :"30m"
5、shard-precreation
分區預創建
[shard-precreation] enabled = true # 是否啟用該模塊,默認值 : true check-interval = "10m" # 檢查時間間隔,默認值 :"10m" advance-period = "30m" # 預創建分區的最大提前時間,默認值 :"30m"
6、monitor
控制InfluxDB自有的監控系統。
默認情況下,InfluxDB把這些數據寫入_internal數據庫,如果這個庫不存在則自動創建。
_internal 庫默認的retention策略是7天,如果你想使用一個自己的retention策略,需要自己創建。
[monitor] store-enabled = true # 是否啟用該模塊,默認值 :true store-database = "_internal" # 默認數據庫:"_internal" store-interval = "10s # 統計間隔,默認值:"10s"
7、admin
web管理頁面(在1.3版本之后已經沒有這個配置了)
[admin] enabled = true # 是否啟用該模塊,默認值 : false bind-address = ":8083" # 綁定地址,默認值 :":8083" https-enabled = false # 是否開啟https ,默認值 :false https-certificate = "/etc/ssl/influxdb.pem" # https證書路徑,默認值:"/etc/ssl/influxdb.pem"
8、http
[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"
9、logging
[logging] format = "auto" # 確定要為日志使用哪個日志編碼器。可用選項auto、logfmt、json level = "info" # 確定將發出的日志級別。可用選項error、warn、info、debug suppress-logo = false # 取消啟動程序時打印logo輸出
10、subscriber
控制Kapacitor接受數據的配置
[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
11、graphite
[[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間的連接符,默認值: "."
12、collectd
[[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
13、opentsdb
[[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"
14、udp
[[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
15、continuous_queries
[continuous_queries] enabled = true # enabled 是否開啟CQs,默認值:true log-enabled = true # 是否開啟日志,默認值:true run-interval = "1s" # 時間間隔,默認值:"1s"
16、tls
# 確定可用的密碼套件集。 ciphers = [ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", ] min-version = "tls1.2" # tls協議的最小版本。 max-version = "tls1.2" # tls協議的最大版本。
【Java程序樣例】
我個人的樣例:
https://github.com/quchunhui/demo-macket/tree/master/influxdb
官方上的樣例:
https://github.com/influxdata/influxdb-client-java/tree/master/examples/src/main/java/example
https://github.com/influxdata/influxdb-java
【優化策略】
-
控制series的數量;
-
使用批量寫;
-
使用恰當的時間粒度;
-
存儲的時候盡量對Tag進行排序;
-
根據數據情況,調整shard的duration;
-
無關的數據寫不同的database;
-
控制Tag Key與Tag Value值的大小;
-
存儲分離,將wal目錄與data目錄分別映射到不同的磁盤上,以減少讀寫操作的相互影響。
【遇到的問題】
==問題1==
需要修改一下InfluxDB默認的存儲路徑,根據上面的配置文件,對/etc/influxdb/influxdb.conf文件修改了3個地方
命令:vim /etc/influxdb/influxdb.conf

結果InfluxDB重新啟動的時候,就報錯了:

查看一下錯誤日志
命令:less /var/log/messages
Feb 28 19:50:21 rexel-ids003 influxd[28635]: ts=2020-02-28T11:50:21.058077Z lvl=info msg="InfluxDB starting" log_id=0LEuyxWW000 version=1.7.1 branch=1.7 commit=cb03c542a4054f0f4d3dc13919d31c456bdb5c39 Feb 28 19:50:21 rexel-ids003 influxd[28635]: ts=2020-02-28T11:50:21.058101Z lvl=info msg="Go runtime" log_id=0LEuyxWW000 version=go1.11 maxprocs=4 Feb 28 19:50:21 rexel-ids003 influxd[28635]: run: create server: mkdir all: mkdir /home/radmin/data: permission denied Feb 28 19:50:21 rexel-ids003 systemd[1]: influxdb.service: Main process exited, code=exited, status=1/FAILURE Feb 28 19:50:21 rexel-ids003 systemd[1]: influxdb.service: Failed with result 'exit-code'. Feb 28 19:50:21 rexel-ids003 systemd[1]: influxdb.service: Service RestartSec=100ms expired, scheduling restart. Feb 28 19:50:21 rexel-ids003 systemd[1]: influxdb.service: Scheduled restart job, restart counter is at 5. Feb 28 19:50:21 rexel-ids003 systemd[1]: Stopped InfluxDB is an open-source, distributed, time series database. Feb 28 19:50:21 rexel-ids003 systemd[1]: influxdb.service: Start request repeated too quickly. Feb 28 19:50:21 rexel-ids003 systemd[1]: influxdb.service: Failed with result 'exit-code'. Feb 28 19:50:21 rexel-ids003 systemd[1]: Failed to start InfluxDB is an open-source, distributed, time series database.
從日志中可以看到關鍵字“permission denied”,證明是沒有這個目錄權限。
解決步驟:
1、先查看一下InfluxDB所屬的文件目錄及權限
命令:rpm -ql influxdb
可以看到InfluxDB所持有權限的路徑只有一下這些,我自己建的路徑根本就沒有權限。

2、查看一下InfluxDB的啟動信息
命令:cat /usr/lib/influxdb/scripts/influxdb.service
可以看到,InfluxDB是的啟動用戶是influxdb,我這邊是用root賬戶操作的。

3、修改一下目標文件夾及子文件夾的權限。
命令:chown -R influxdb:influxdb influx

2020年11月16日追記
在實際項目中,遇到了修改權限也不好使的場景,
原因是上級目錄的讀寫權限不夠,執行命令chmod 755 radmin之后,啟動才生效。
4、重新啟動就可以了。
【性能測試工具】
==influx_stress==
可以使用性能測試工具influx_stress進行性能測試。
如命令:influx_stress -addr http://XXX.XX.XXX.X:8086

【用戶權限管理】
我們的InfluxDB部署在阿里雲ECS服務器上,開放了公網地址,由於沒有做權限限制,阿里雲提示“InfluxDB未授權訪問漏洞”

所以需要為InfluxDB增加用戶權限
具體可以參考官網:
https://docs.influxdata.com/influxdb/v1.7/administration/authentication_and_authorization/
1、開啟HTTP訪問權限
編譯配置文件。命令:vim /etc/influxdb/influxdb.conf
我修改了3個配置,其中bind-address是順手修改了一下默認端口,提升一下安全。
記得修改之后,重啟一下InfluxDB,重啟命令:service influxdb restart
enabled = true auth-enabled = true bind-address = ":9100"

2、增加用戶權限
相關命令如下:
創建一個新的管理員用戶:CREATE USER <username> WITH PASSWORD '<password>' WITH ALL PRIVILEGES 為一個已有用戶授權管理員權限:GRANT ALL PRIVILEGES TO <username> 展示用戶及其權限:SHOW USERS 取消用戶權限:REVOKE ALL PRIVILEGES FROM <username> 創建一個新的普通用戶:CREATE USER <username> WITH PASSWORD '<password>' 為一個已有用戶授權:GRANT [READ,WRITE,ALL] ON <database_name> TO <username> 取消權限:REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username> 展示用戶在不同數據庫上的權限:SHOW GRANTS FOR <username> 重設密碼:SET PASSWORD FOR <username> = '<password>' 刪除用戶:DROP USER <username>
我這里設置了4個用戶,分別如下

3、修改相關客戶端代碼
修改訪問InfluxDB客戶端代碼的相關配置即可。
==END==
enabled = true

