InfluxDB簡介與php用法

SanXiao發表於2021-12-01

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 協議》,轉載必須註明作者和本文連結
過去心不可得,現在心不可得,未來心不可得

相關文章