Splunk
Splunk はプロプライエタリのデータマイニングソフトウェアです。Wikipedia より:
- Splunk はウェブインターフェイスからコンピュータが生成したデータを検索・監視・解析するためのソフトウェアです。大規模なアプリケーションやシステム、IT インフラで使われています。Splunk はリアルタイムのデータをリポジトリに収集し相互に関連付けて検索を可能にします。そこからグラフや帳票、ダッシュボード、ビジュアライゼーションを生成できます。
- Splunk は組織全体のマシンデータにアクセスできるようにしてデータパターンを識別します。指標を提示し、問題を分析することで企業活動を後押しする知性を得ることができます。Splunk はアプリケーションの管理やセキュリティ、コンプライアンスからビジネスやウェブの解析まで幅広く使うことができる水平技術です。
Splunk は1日に作成されるデータのインデックス量に応じてライセンスが変わります。フリーライセンスでは1日500 MB まで利用することができますが、アクセス制御やセキュリティアラート、PDF 生成などの機能は使えません。
Splunk には高水準のデータ検索インターフェイスが備わっています。(ビルトインの) 正規表現によって生データはフィールドに抽出されます。独自の構文を持つクエリ言語を使用しますが、SQL などの構造化データ取り合わせ言語に慣れているユーザーならすぐに理解することができるはずです。
Splunk のオンラインドキュメントは公開されており広範囲の事柄がわかります。検索や設定のリファレンスファイルについては、Unix ライクな man ページとして提供されています。この記事ではあまり知られていない機能やトラブルシューティング、Arch Linux で動作させる方法を集中して取り上げています。
目次
インストール
splunkAUR パッケージが AUR に存在します。インストールすると splunk
ユーザーとグループを作成し、Splunk と systemd のユニットファイルをインストールします。
Splunk Universal Forwarder をインストールするための splunkforwarderAUR パッケージも存在します。
手動
splunk.com にログインして Splunk や Splunk Universal Forwarder のダウンロードリンクを取得して wget でダウンロードしてください:
$ wget -O splunk.tgz <url goes here>
tarball を展開:
$ tar -xvf splunk.tgz
展開したディレクトリを /opt/
に移動してデプロイします。
Splunk のインストールディレクトリは $SPLUNKHOME
で指定します。.bashrc
で設定してパスを追加してください:
export SPLUNK_HOME=/opt/splunk export PATH=$SPLUNK_HOME/bin:$PATH
Splunk には強力な CLI インターフェイスが備わっており、全ての設定は .ini
形式の設定ファイルに保存されます。
Splunk の起動
Splunk には2つのメインコンポーネントが存在します: splunkd
デーモンと splunkweb
サービス、cherrypy
ウェブアプリケーションです。
AUR パッケージを使用した場合、systemd の splunk
サービスを起動することで両方とも実行されます。
もしくは Splunk のバイナリで起動してください:
# splunk start
パフォーマンス
Splunk コミュニティでは Splunk のパフォーマンスは IO 性能に強く依存するというのが常識ですが、これは因習的な使い方をしているときの話です。シングルスレッドで特定の操作をした場合、シングルコアの占有に時間を大きく取られディスク使用量はほとんどないということもあります。
Splunk が何をしているのか確認するのは簡単です:
$ iostat -d -x 5 $ top
ほとんどディスクが使用されずにシングルコアの負担率が 100% に張り付き、ときどき他のコアで splunkd が活動しているような場合、ハードウェアではなく Splunk の実装が原因で発生しているボトルネックです。
Splunk がハードウェアを活用できていないような場合、以下のことを考慮してみてください:
検索セマンティクス
Splunk の検索機能はほとんど MapReduce 実装によるものです。分散化された環境では強力かつ有用ですが、高水準な検索言語抽象化によってパイプラインの初期に reduce
操作が行われて、Splunk の機能である操作の並列化が失われしまっている可能性があります。分散環境とシングルインスタンスどちらでも起こりえます。
(馬鹿正直な実装における) 経験則としてあらゆる「イベント」を確認しないとできない操作は並列化されません。このことは特に Splunk の最も便利な機能のひとつである transaction コマンドに当てはまります。
分散環境
Splunk は分散環境で動作するように設計されています。各インスタンスは個々のマシンで動作させるという想定ですが、多数の論理コアが存在し (ソリッドステートディスクなどを搭載した) ディスク性能が高いマシンでは Splunk のインスタンスを複数に設定することで性能を著しく向上させることができます。
シングルマシンで複数の Splunk インスタンスを実行する場合、以下の設定に注意する必要があります:
- serverName -
server.conf
の [general] スタンザ - splunkd と splunkweb の mgmthostport と httpport -
web.conf
の [settings] スタンザ
インデクサ (検索ピア) に検索を処理させる検索ヘッドとして3番目のインスタンスをセットアップしたり、両方のインデクサが各々を使うように設定することができます。
専用の検索ヘッドを使用する場合、インデクサのウェブインターフェイスを無効化すると良いでしょう:
# splunk disable webserver # splunk restart
インデックス
インデクサが複数あるということはデータが分割されるということです。inputs.conf
を設定して別のサブセットのソースデータを監視したり、別の 'forwarder' インスタンスを使ってラウンドロビン形式で自動的にロードバランシングさせてください。
indexes.conf
の固定パスやシンボリックリンクを使って同じインデックスを読み取るようにインデクサを設定してはいけません。検索ヘッドが重複排除をしなければならなくなり作業を分散化させるメリットがなくなってしまいます。
デバッグと管理
Splunk の CLI はあまり活用されていません。
設定ファイルをデバッグするときにとても有用です:
# splunk btool props list
あるいは inputs.conf
を設定してディレクトリを監視する代わりに、テスト用に一時的にファイルを追加するには:
# splunk add oneshot <file> -sourcetype mysourcetype -host myhost -index myindex
テストをするときは特殊なテストインデックスを使うようにしてください。データを追加してしまったら、一度完全に消去しないかぎり、インデックスからデータを消去するのは不可能になります。
カスタムコマンド
こちら にあるように、Splunk では検索パイプラインで任意の Python や Perl スクリプトを呼び出すことが可能です。Splunk のフレームワークの枠組みを越えて、外部のデータソースを読み込んだりすることができます。他の場所にデータを自動的にプッシュしたり、Splunk の外で任意のジョブを実行するマクロを作成するショートカットも存在します。
カスタムコマンドの使用については Splunk のドキュメントやインターフェイスで警告が出されており、検索パフォーマンスに深刻な影響を与えるとされています。実際には、検索コマンドで間抜けなことをやらないかぎり、カスタムコマンドによるリソース消費は非常に低く抑えられます。さらに、シングルコアしか使えない Splunk とは対照的に、別プロセスで実行されるため CPU やメモリ資源を活用することができます。Splunk は (コマンドが全てのデータセットを取得するような場合の streaming = false
でなければ) ひとまとまりのデータで繰り返しカスタムコマンドを実行し、外部スクリプトが結果を出力して終了するまで自分の作業を進めます。
Splunk には Python 2.7.2 バイナリが付属しており、システムにインストールされた Python ではコマンドが実行されません。そのため pip
や easy_install
でインストールしたパッケージを使ったり、独自のライブラリを使用するのが面倒です。
fork
や execv
などを使って制限を回避してシステムの Python をロードすることができます。もしくは、コンパイル済みのプログラムや PyPy などの高速な Python インタプリタを使って、高速な環境でデータを処理できます。
設定
commands.conf のガイドでは誤解を招くような表現が使われています。特に以下の部分:
streaming = [true|false] * Specify whether the command is streamable. * Defaults to false.
'streaming' は単に (50K の範囲で) 任意のサイズのデータを使って Splunk で繰り返しコマンドを生成しても問題ないか決定するだけです。デフォルトの splunk.Intersplunk
ライブラリがデータのストリーミングインターフェイスを提供していることは触れられていません。
Library API
組み込まれているインタプリタで利用できる Splunk ライブラリのドキュメントは存在しません。直接モジュールを調べてみてください:
$SPLUNK_HOME/bin/splunk cmd python #(in python interpreter) import splunk.Intersplunk help(splunk.Intersplunk)
splunk.Intersplunk のソースではデータをコマンドに送る前にプロセスの標準入力から入力セット全体が解析されています。データセット全体を使う必要があるコマンドでなければ(そのような場合は稀です)、かなり効率が悪い方法です。
ライブラリは簡単に置き換えることができます。Splunk から渡されるデータには key
:value
ペアと改行、ヘッダ行とデータによって構成されるヘッダが含まれています。Python では、ヘッダ行を読み込んで保存または無視してから csv.Reader
や csv.DictReader
オブジェクトを使うことで一度にデータを処理することができます。csv.Writer
や csv.DictWriter
で結果の行を Splunk の検索パイプラインに戻してください。