InfluxDB(時序資料庫),常用的一種使用場景:監控資料統計。每毫秒記錄一下電腦記憶體的使用情況,然後就可以根據統計的資料,利用圖形化介面(InfluxDB V1一般配合Grafana)製作記憶體使用情況的折線圖;
這裡輸入引用文字可以理解為按時間記錄一些資料(常用的監控資料、埋點統計資料等),然後製作圖表做統計。
InfluxDB是一個由InfluxData開發的開源時序型資料。它由Go寫成,著力於高效能地查詢與儲存時序型資料。InfluxDB被廣泛應用於儲存系統的監控資料,IoT行業的實時資料等場景。在操作頻繁且易併發的情況下使用它來儲存很nice.例如螞蟻森林收取能量業務。
概念 | MySQL | InfluxDB |
---|---|---|
資料庫(同) | database | database |
表(不同) | table | measurement |
列(不同) | column | tag(帶索引的,非必須)、field(不帶索引)、timestemp(唯一主鍵) |
- tag set:不同的每組tag key和tag value的集合;
- field set:每組field key和field value的集合;
- retention policy:資料儲存策略(預設策略為autogen)InfluxDB沒有刪除資料操作,規定資料的保留時間達到清除資料的目的;
- series:共同retention policy,measurement和tag set的集合;
示例資料如下: 其中census是measurement,butterflies和honeybees是field key,location和scientist是tag key
name: census
————————————
time butterflies honeybees location scientist
2015-08-18T00:00:00Z 12 23 1 langstroth
2015-08-18T00:00:00Z 1 30 1 perpetua
2015-08-18T00:06:00Z 11 28 1 langstroth
2015-08-18T00:06:00Z 11 28 2 langstroth
示例中有三個tag set
- tag 只能為字串型別
- field 型別無限制
- 不支援join
- 支援連續查詢操作(彙總統計資料):CONTINUOUS QUERY
- 配合Telegraf服務(Telegraf可以監控系統CPU、記憶體、網路等資料)
- 配合Grafana服務(資料展現的影像介面,將influxdb中的資料視覺化)
-- 檢視所有的資料庫
show databases;
-- 使用特定的資料庫
use database_name;
-- 檢視所有的measurement
show measurements;
-- 查詢10條資料
select * from measurement_name limit 10;
-- 資料中的時間欄位預設顯示的是一個納秒時間戳,改成可讀格式
precision rfc3339; -- 之後再查詢,時間就是rfc3339標準格式
-- 或可以在連線資料庫的時候,直接帶該引數
influx -precision rfc3339
-- 檢視一個measurement中所有的tag key
show tag keys
-- 檢視一個measurement中所有的field key
show field keys
-- 檢視一個measurement中所有的儲存策略(可以有多個,一個標識為default)
show retention policies;
--刪除資料庫
drop database "db_name";
--刪除資料表
drop measurement "measurement_name"
一、InfluxDB的windows(64-bit)
1、專案中直接安裝依賴
composer require influxdb/influxdb-php
下載地址為:dl.influxdata.com/influxdb/release...
2、修改influxdb.conf檔案,修改meta, wal 以及 data 路徑
建立三個對應資料夾。
解壓完成之後分別雙擊influxd.exe、influx.exe 進入命令列。
當然你也可以去官方下載 選擇適合自己的包
InfluxDB、Telegraf、Chronograf、Kapacitor可到下方官網下載各平臺版本
下載官網:portal.influxdata.com/downloads/
二、虛擬機器安裝(執行命令,完成安裝)
1、透過ubuntu 安裝influxdb
sudo apt install influxdb
sudo apt install influxdb-client
2、檢視influxdb狀態,q退出。設定開機啟動
//檢視狀態
sudo service influxdb status
//設定開機自啟
sudo service influxdb start
3、啟動
influxd
4、進入
influx
封裝的插入方法
public static function insert(string $table,
array $tags = [],
array $fields = [],
$value = null,
$timestamp = null)
{
$point = new Point($table, $value, $tags, $fields, $timestamp);
dispatch(function () use ($point) {
InfluxDB::writePayload((string)$point);
});
}
使用方式: 當然前提是你得先use
InfluxDB::insert(InfluxDBTableConstants::FT, compact('user_id', 'behavior'), compact('amount', 'balance'));
//獲取資訊方法
public static function getPoints(string $table, array $where = [], string $order = 'time desc', int $limit = 20): array
{
$query_where = [];
foreach ($where as $field => $item) {
if (is_numeric($field)) {
if (is_string($item) || is_numeric($item)) {
$query_where[] = $item;
} else if (is_array($item)) {
if (count($item) === 2) {
$query_where[] = "{$item[0]} = '{$item[1]}'";
} else if (count($item) === 3) {
$query_where[] = "{$item[0]} {$item[1]} '{$item[2]}'";
} else {
throw new \InvalidArgumentException('where');
}
} else {
throw new \InvalidArgumentException('where');
}
} else if (is_string($field)) {
$str_where = "$field";
if (is_string($item) || is_numeric($item)) {
$str_where .= " = '$item'";
} else if (is_array($item) && count($item) === 2) {
$str_where .= " {$item[0]} '{$item[1]}'";
} else {
throw new \InvalidArgumentException('where');
}
$query_where[] = $str_where;
} else {
throw new \InvalidArgumentException('where');
}
}
$res = InfluxDB::getBuilder()->from($table)
->where($query_where)
->orderBy($order, '')
->limit($limit)
->getResultSet()
->getPoints();
return $res;
}
public static function getData(string $table_name, array $where = []): array
{
$ret = [];
$list = InfluxDB::getPoints($table_name, $where);
if ($list) {
$ret[] = collect($list)->map(function ($item) {
$time = $item['time'];
$time = explode('.', $time)[0] . '+00:00';
$item['time'] = Carbon::parse($time)
->setTimezone(config('app.timezone'))
->format('Y-m-d H:i:s');
return $item;
})->toArray();
$ret[] = [
'last_time' => $list[count($list) - 1]['time']
];
} else {
$ret = [[], []];
}
return $ret;
}
//以及使用方法
$wt = InfluxDB::getData(InfluxDBTableConstants::WT,$where);
本作品採用《CC 協議》,轉載必須註明作者和本文連結