LaravelによるInfluxDBにおける時系列データの蓄積


私は走っているLaravel application on a Raspberry Pi それは私の家の自動化とモニタリングの大部分を扱います.そして、私の家のまわりでセンサーから温度と湿気を追跡するように.もともと私はMySQLデータベースには、このすべてを格納していたが十分に良い仕事.しかし、2年連続データの後、それは少しかさばることを始めていました.
私は時系列データを保存している場合、それは人気を使用する意味があることを考えればopen-source solution それはそのために正確に最適化されています.この記事では、私がどのように私が既存のLaravelアプリケーションにxdbに流入する時系列データベースに接続したかをあなたに示すつもりです.この後、私の応答時間が大幅に改善されただけでなく、データベースのサイズもかなり縮小している.
始めましょう!

クイックノーツ


この記事では、次のように設定します.
  • Laravelの8 +アプリケーション
  • InventDBデータベース
  • データのためにIncluxDBで作成されたバケツ
  • 私は、これが達成されることができるいくつかの異なった方法があるように、InfluxDBインスタンスをセットアップする方法を経験していません.あなたが私がどのように(それがDockerとDocker構成を使用しているこの特定のケースで)働くことを得たかについての別々の記事でより深く飛び込むことを望むならば、コメントで、または、さえずりの上で私に知らせるために自由に感じてください!

    始める


    まず最初に、私たちがしなければならないことは、私たちのlaravelアプリケーションを通してデータベースに接続するために、EndoxDB PHPクライアントをインストールすることです.何か重要なことがここに注意してください.

    There are two completely different libraries depending on the version of InfluxDB that you're using.


    上記の前提条件リストに記載されているように、私はInfluxDBthis is the library インストールする予定です.かなり重要な構文の違いがあります、そして、あなたが古いV 1インスタンスに接続しようとするこのチュートリアルに従うならば、あなたはおそらく線の下で問題に走らせます.
    したがって、プロジェクトのルートでは、このような依存関係をインストールすることができます.
    composer require influxdata/influxdb-client-php
    
    その後ララヴァアプリケーションの.env ファイルには、いくつかの新しい値を追加し、EndoxDBインスタンスへの接続を処理します.
    INFLUXDB_HOST=
    INFLUXDB_TOKEN=
    INFLUXDB_BUCKET=
    INFLUXDB_ORG=
    

  • これは、インスタンスが存在するホスト名とポートです.あなたが自己ホスティングであるならば、これはそうであるでしょう127.0.0.1:8086

  • IncluxDBRankトークン:アクセストークン.これはInfluxDBインスタンスの作成に設定できます.データ>APIトークンのセクションの下のIncluxDBダッシュボードにあります.

  • IncluxRankバケツ:IncluxDBのバケツは基本的にデータベースです、そして、これはあなたのデータを格納するためにつくられたものの名前に対応しなければなりません.

  • InfluxDBRICE org :通常、セットアップ中に指定されたInfluxDBインスタンスのための組織名です.
  • 一度これらのすべてをあなたの.env ファイルは、我々の接続をテストするコードを追加するに移動することができます.我々のバケツで保存される必要がある入って来るデータ点を扱うルート、コントローラと方法をつくりましょう.
    routes/web.php ファイルは次のようになります.
    Route::post('/temperature', [\App\Http\Controllers\TemperatureController::class, 'store']);
    
    そしてそのコントローラクラスTemperatureController.php , 次のようになります.
    namespace App\Http\Controllers;
    
    class TemperatureController extends Controller
    {
        public function store(Request $request)
        {
            // store our data point in InfluxDB
        }
    }
    
    たった今、我々は実際に我々のデータベースを使用するコードを書き始める準備ができています!

    クライアントの設定


    まず、クライアントクラスを以前にインストールしたInfoXDB PHPライブラリからインスタンス化する必要があります.
    これがバージョン2であるので、主要な名前空間はそうですIndexDB2 . クライアントのコンストラクタには、インスタンスに接続し、バケツの精度を決定するために必要なデータを格納する配列が必要です.以下のようになります.
    $client = new \IndexDB2\Client([
        'url' => env('INFLUXDB_HOST'),
        'token' => env('INFLUXDB_TOKEN'),
        'bucket' => env('INFLUXDB_BUCKET'),
        'org' => env('INFLUXDB_ORG'),
        'precision' => \InfluxDB2\Model\WritePrecision::S
    ]);
    
    最初の4つの属性はかなり明白です、彼らは我々が我々に加えた値です.env 以前にファイルし、env() これらの値を引き出すヘルパー.しかし、最後のものは新しいです.
    精度は、あなたのバケツのデータに関連したタイムスタンプの形式と精度を決定します.使用可能な4つの値があります.


  • ミリ秒

  • マイクロ秒

  • ns:ナノ秒
  • The WritePrecision クラスは単にそれらの4つの可能な値のうちの1つを返すヘルパーenumです.私は2分ごとに1回データを書いているので、秒以上の精度は本当に私に必要ではありません.

    データの追加


    クライアントが初期化された後、write APIと呼ばれるものを作成するためのメソッドをコールしなければなりません.
    $writeApi = $client->createWriteApi();
    
    このwriteApi オブジェクトは、我々のバケツにデータを書くために使ういくつかのメソッドを公開します.
    その前に、まずポイントオブジェクトを作成しなければなりません.それから、メソッドのチェーンを使用して、我々のWrite APIオブジェクトによって使われるようにそれをセットしてください.
    $point = new Point::measurement('temperature');
    
    これは、測定データtemperature .
    「メトリック」と呼ばれるバケツを持っていると言いましょう、私は、その1つのバケツ(温度、湿気、光レベルなどのような)の中ですべての複数の異なる属性を持つことができて、必要に応じて個別に、または、一緒に質問することができます.
    ポイントオブジェクトはそれに関連する値を持っている必要がありますaddField 付ける
    $point->addField('fahrenheit', 74.3);
    
    バケツにある同じ名前で複数の測定をするならば、タグを使って区別することができます.
    $point->addTag('location', 'bedroom');
    
    複数のタグを使用することができますが、私はちょうど1つが必要です.
    最後に、この測定値をtime() メソッド.私は私の書き込み精度を秒に設定するので、私はちょうどエポック秒の量を使用することができます覚えておいてください.
    PHPでは、デフォルトを使用しますtime() 関数
    $point->time(time());
    
    私たちのポイントがすべて設定されているので、以前に作成したWrite APIオブジェクトを使用して、バケットに書きます.
    $writeApi->write($point);
    
    これは戻りますtrue すべてがうまく行くならば、あるいは、道に沿った何かが間違っているならば、例外を投げてください.その後、あなたのデータがあなたのInfluxDBバケットで利用できるようになりました!

    ラッピング


    上記のコードをリファクタリングして、それをすべて一緒に置くことTemperatureController 's全体のストアメソッドは次のようになります.
    public function store(Request $request)
    {
        $client = new \IndexDB2\Client([
            'url' => env('INFLUXDB_HOST'),
            'token' => env('INFLUXDB_TOKEN'),
            'bucket' => env('INFLUXDB_BUCKET'),
            'org' => env('INFLUXDB_ORG'),
            'precision' => \InfluxDB2\Model\WritePrecision::S
        ]);
    
        $writeApi = $client->createWriteApi();
    
        $point = Point::measurement('temperature')
                ->addTag('location', 'bedroom')
                ->addField('fahrenheit', 74.3)
                ->time(time());
    
        try {
            $result = $writeApi->write($point);
        } catch(\InfluxDB2\ApiException $e) {
            return $e;
        }
    
        return $result;
    }
    
    そして、リクエストでそのルート終点を打った後に、私たちは私たちのInfluxDBダッシュボードに行って、我々が加えたDataPointを見ることができます.この場合、74.3の温度読書、寝室でタグ付けされます.今すぐ簡単にIngexDBの助けを借りてあなたのlaravelアプリケーションで簡単に摂取し、クエリ時系列データを準備する準備が整いました!
    これについて質問がある場合は、一般的なWeb開発、または私からより短いフォームのコンテンツを参照してくださいしたいと思います、Twitterで私に従うこと自由に感じなさい.