fluentdで集めたログデータをpgjsonでpostgreSQLに格納した時の課題と解決策

題名そのままfluentdを利用してプラグインpgjsonを使ってpostgreSQLにデータを格納したときの、課題と考えついた解決方法について記載。

もっといい方法があればぜひ、と思いブログにまとめました。

ちなみに、DBの選択肢が、、、っていうのは無しで。

 

fluentdとは?とか、postgreSQLとは?とかについては全部省略してます。

時間があるときに、簡単に補足はする予定。

 

プラグインpgjsonはこちら。

github.com

 

pgjsonのReadMeにあるように、格納先のテーブルは、

下記のように「tag」と「ログ出力日時」「ログデータ(json)」が格納できるテーブルに設計。

Schema

Specified table must have this schema.

coltype
{tag_col} Text
{time_col} Timestamp WITH TIME ZONE
{record_col} Json

 

が、しかし。。。

使っているpostgreSQLのバージョンは9.3

9.3

そう、jsonb型に対応していない。9.3。

GINインデックスが張れない。9.3。

 

 

 

ちょっと複雑なjsonの問い合わせしたら、しばらくぼーっとできる。

(ちなみに格納データ量は数百万行orz)

 

さて、どうしたものか。。。

 

データinsert時に、jsonの要素の中にある検索キー項目のデータが別カラムとして外出しされていれば最高なんだけどな。。。

プラグインを触るか。いや、Ruby触ったことないからきっと大変だろうなぁ。

 

と、いろいろ考えたりしていたところ。

トリガの利用を思いついた。

https://www.postgresql.jp/document/9.3/html/plpgsql-trigger.html

 

まず、テーブルのカラムを

「tag」「ログ出力日時」「ログデータ(json)」

から、

「tag」「ログ出力日時」「ログデータ(json)」「検索対象のjsonキー」

に、変更。

 

検索対象キー項目をjson要素からを外出し(別カラム)して、テーブルに格納するinsertトリガを作成。

 

無事、検索のキーとして利用したい項目がカラムとして外出しできたので、

検索の高速化が測れました。

めでたしです。

 

ただ、ぐぐってもこの方法が出てこなかったので、DBの選択肢がまちがっている感は否めない。