天天看點

InfluxDB學習筆記

【測試環境】

伺服器: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

【資料模型】

參考圖一:

InfluxDB學習筆記

參考圖二:

InfluxDB學習筆記

參考圖三:

InfluxDB學習筆記

參考圖四:與傳統資料庫的名詞比較

InfluxDB學習筆記

1、database

資料庫名。在 InfluxDB 中可以建立多個資料庫,不同資料庫中的資料檔案是隔離存放的,存放在磁盤上的不同目錄。

2、measurement

測量名額名。例如 cpu_usage 表示 cpu 的使用率。

3、point

由時間戳(time)、資料(field)、标簽(tags)組成。相當于傳統資料庫裡的一行資料,如下表所示:

InfluxDB學習筆記

【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的函數結構:

InfluxDB學習筆記

【實體模型】

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模型類似)

InfluxDB學習筆記

資料寫入過程:

InfluxDB學習筆記

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

檔案。

InfluxDB學習筆記
[root@vm1 influxdb]# tree meta
meta
└── meta.db      

2、wal

存放預寫日志檔案,以

.wal

結尾。

InfluxDB學習筆記
[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

InfluxDB學習筆記
[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

InfluxDB學習筆記

可以從結果中還可以看到一個有意思的關鍵字: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

InfluxDB學習筆記

==顯示資料庫==

指令:show databases

InfluxDB學習筆記

==建立資料庫==

指令:create database testdb

InfluxDB學習筆記

==檢視retention policy(資料儲存政策)==

Retention是基于資料庫的。如果沒有自定義,那麼都有一個預設的值。

指令:show retention policies on test1

InfluxDB學習筆記

==建立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

InfluxDB學習筆記

==修改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

InfluxDB學習筆記

2)隻更新儲存時間。如:将政策test1_rp的儲存時間變更為31天(31d×24h=744h0m0s)

指令:alter retention policy "test1_rp" on "test1" duration 31d

InfluxDB學習筆記

3)至更新備份數。如:将政策test1_rp的資料被分數變更為1。

指令:alter retention policy test1_rp on test1 replication 1 default

InfluxDB學習筆記

==删除retention policy==

DROPRETENTIONPOLICY <retention_policy_name> ON <database>

如删除資料庫test1中名字叫做test1_rp的政策。

指令:drop retention policy test1_rp on test1

InfluxDB學習筆記

==删除資料庫==

指令:drop database testdb

InfluxDB學習筆記

==使用資料庫==

指令:use testdb

InfluxDB學習筆記

==顯示所有表==

指令:show measurements

InfluxDB學習筆記

==建立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)>  <時間戳>

InfluxDB學習筆記
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

InfluxDB學習筆記

==檢視資料庫中所有記錄==

通過”/.*/”表示所有的表。

指令:select * from /.*/

InfluxDB學習筆記

==根據tag-key查詢==

查詢資料時,都是按照tag-key進行查詢,因為tag-key是存在索引的。

指令:select * from device where deviceName = 'sensor_1'

InfluxDB學習筆記

==更新資料==

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

InfluxDB學習筆記

==查詢所有tag key==

指令:show tag keys from device_property

InfluxDB學習筆記

==查詢tag value==

指令:show tag values from device_property with key="deviceName" limit 30;

InfluxDB學習筆記

==查詢所有field key== 

指令:show field keys

指令:show field keys from device_property

InfluxDB學習筆記

==建立連續查詢==

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

InfluxDB學習筆記

==删除連續查詢==

DROP CONTINUOUS QUERY <cq_name> ON <database_name>

指令:DROP CONTINUOUS QUERY query_1m ON test1

InfluxDB學習筆記

==顯示使用者==

指令:show users

InfluxDB學習筆記

==建立使用者==

指令:create user "user1" with password 'P@ssw0rd'

InfluxDB學習筆記

==建立管理者權限使用者==

指令:create user "admin" with password 'P@ssw0rd' with all privileges

InfluxDB學習筆記

==删除使用者==

指令:drop user "user1"

InfluxDB學習筆記

==設定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

InfluxDB學習筆記

方式2:

指令:select AR_TEST_VAR1 from device_property where time >= now() - 1m order by time desc tz('Asia/Shanghai')

InfluxDB學習筆記

==其他條件查詢==

查詢資料大于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

InfluxDB學習筆記

其中-format可以為csv、json、column(預設)

==常用函數==

InfluxDB學習筆記

推薦幾個網友整理的部落格:

https://blog.csdn.net/zx711166/article/details/84541198

http://www.haodaquan.com/121

==幾個典型語句樣例==

資料準備:

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      

[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學習筆記

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

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所持有權限的路徑隻有一下這些,我自己建的路徑根本就沒有權限。

InfluxDB學習筆記

2、檢視一下InfluxDB的啟動資訊

指令:cat /usr/lib/influxdb/scripts/influxdb.service

可以看到,InfluxDB是的啟動使用者是influxdb,我這邊是用root賬戶操作的。

InfluxDB學習筆記

3、修改一下目标檔案夾及子檔案夾的權限。

指令:chown -R influxdb:influxdb influx

InfluxDB學習筆記

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