ClickHouseとのVectorの統合
リアルタイムでログを分析できることは、プロダクションアプリケーションにとって極めて重要です。ClickHouseがログデータの保存と分析に適しているかどうか考えたことはありますか? Uberの経験を見て、自社のログインフラストラクチャをELKからClickHouseに移行した事例をご覧ください。
このガイドでは、人気のデータパイプラインVectorを使用して、Nginxのログファイルをテールし、ClickHouseに送信する方法を示します。以下の手順は、あらゆる種類のログファイルをテールする場合にも似ています。すでにClickHouseが稼働中で、Vectorがインストールされていると仮定しますが、まだ起動する必要はありません。
1. データベースとテーブルを作成する
ログイベントを保存するためのテーブルを定義しましょう:
-
nginxdb
という新しいデータベースから始めます: -
まず、ログイベント全体を単一の文字列として挿入します。これは明らかにログデータの分析には適した形式ではありませんが、以下でマテリアライズドビューを使用して、その部分を解決します。
注記現在、主キーの必要はないため、ORDER BYは**tuple()**に設定されています。
2. Nginxを設定する
Nginxについて多くの時間を費やして説明するつもりはありませんが、全ての詳細を隠すつもりもありません。このステップでは、Nginxのログ設定を行うための十分な詳細を提供します。
-
次の
access_log
プロパティは、ログを/var/log/nginx/my_access.log
にcombined形式で送信します。この値は、nginx.conf
ファイルのhttp
セクションに追加します: -
nginx.conf
を変更した場合は、Nginxを再起動してください。 -
ウェブサーバのページにアクセスして、アクセスログにいくつかのログイベントを生成します。combined形式のログは、次の形式になります:
3. Vectorを設定する
Vectorは、ログ、メトリクス、およびトレース(ソースと呼ばれます)を収集、変換、およびルーティングし、多くの異なるベンダー(シンクと呼ばれます)に送信します。ClickHouseとの互換性も組み込みであります。ソースとシンクは、vector.tomlという設定ファイルに定義されています。
-
次のvector.tomlは、my_access.logファイルの末尾をテールするfileタイプのソースを定義し、上記で定義したaccess_logsテーブルをシンクとして定義しています:
-
上記の設定を使用してVectorを起動します。 Vectorのドキュメントを訪れて、ソースとシンクの定義に関する詳細を確認してください。
-
ClickHouseにアクセスログが挿入されていることを確認します。次のクエリを実行すると、テーブルにアクセスログが表示されるはずです:
4. ログを解析する
ClickHouseにログが保存されるのは素晴らしいことですが、各イベントを単一の文字列として保存すると、あまりデータ分析ができません。マテリアライズドビューを使用してログイベントを解析する方法を見てみましょう。
-
マテリアライズドビュー(MVの略)は、既存のテーブルに基づく新しいテーブルであり、既存のテーブルに対して挿入が行われると、新しいデータもマテリアライズドビューに追加されます。以下のように、access_logsのログイベントの解析された表現を含むMVを定義する方法を見てみましょう:
ClickHouseには、文字列を解析するためのさまざまな関数がありますが、まずはsplitByWhitespace - 空白で文字列を解析し、各トークンを配列として返す関数を見てみましょう。以下のコマンドを実行してみてください:
返された結果が私たちが望んでいるものに非常に近いことに注意してください!いくつかの文字列には余分な文字がありますが、ユーザーエージェント(ブラウザの詳細)は解析する必要がなかったので、次のステップで解決します:
-
splitByWhitespaceと同様に、splitByRegexp関数は、正規表現に基づいて文字列を配列に分割します。次のコマンドを実行すると、二つの文字列が返されます。
返された二つ目の文字列は、ログから成功裏に解析されたユーザーエージェントです:
-
最終的なCREATE MATERIALIZED VIEWコマンドを見る前に、データクリーンアップに使用されるいくつかの他の関数を確認しましょう。例えば、
RequestMethod
は**"GETですが、不要なダブルクォーテーションが付いています。以下のtrim**関数を実行すると、ダブルクォーテーションを削除できます: -
時間文字列には先頭に角括弧があり、ClickHouseが日付として解析できない形式です。ただし、区切りをコロン(:)からカンマ(,)に変更すると、解析がうまく機能します:
-
これでマテリアライズドビューを定義する準備が整いました。当社の定義にはPOPULATEが含まれており、これはaccess_logs内の既存の行をすぐに処理し挿入することを意味します。次のSQL文を実行します:
-
実行されたかどうかを確認します。アクセスログがきれいに列に解析されているのがわかります:
注記上のレッスンでは、データを二つのテーブルに保存しましたが、最初の
nginxdb.access_logs
テーブルをNullテーブルエンジンとして使用するように変更すれば、解析されたデータは依然としてnginxdb.access_logs_view
テーブルに入りますが、生データはテーブルには保存されません。
要約: Vectorを使用することで、インストールと簡単な構成だけで、NginxサーバからClickHouseのテーブルにログを送信できます。巧妙なマテリアライズドビューを使用することで、分析を容易にするためにこれらのログを列に解析できます。