fluentdで集めたログデータをpgjsonでpostgreSQLに格納した時の課題と解決策
題名そのままfluentdを利用してプラグインpgjsonを使ってpostgreSQLにデータを格納したときの、課題と考えついた解決方法について記載。
もっといい方法があればぜひ、と思いブログにまとめました。
ちなみに、DBの選択肢が、、、っていうのは無しで。
fluentdとは?とか、postgreSQLとは?とかについては全部省略してます。
時間があるときに、簡単に補足はする予定。
プラグインpgjsonはこちら。
pgjsonのReadMeにあるように、格納先のテーブルは、
下記のように「tag」と「ログ出力日時」「ログデータ(json)」が格納できるテーブルに設計。
Schema
Specified table must have this schema.
col | type |
---|---|
{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の選択肢がまちがっている感は否めない。