こんにちは。torippy1024です。
本日は、Splunkのインデックスの実体について調べたことを書きます。
Splunkでは、インデックスと呼ばれる単位でデータを保管しています。
ユーザーとして利用するだけであれば、インデックスの使い方や仕様を理解すれば良いのですが、エンジニアとしてはどのような仕組みで作られているのかが気になったので、簡単に調べてみました。
インデックスとは何か
インデックスとは、Splunkにおけるデータの格納単位です。
Splunkは、Forwarderなどから転送されてきたデータを、Bucketと呼ばれる単位で時系列に分割し、保存しています。Bucketについて、あまりユーザーは意識する必要はありません。Buckerの集合がインデックスです。ユーザーは、データの保管先をインデックス単位で指定すれば、BucketはSplunkが勝手に作成してくれます。
データの保管先をインデックス単位で分割することには、以下のメリットがあります。
- インデックス単位でアクセス権限を設定できる
- ロールによって、インデックス単位でアクセス権限を変更することができます。例えば営業部署と開発部署と運用部署などでアクセス権限を変更したいときは、インデックスによってログデータの保管先を変更します。
- Retension Policy(保持期間ポリシー)を設定できる
- インデックスは、容量または保持日数によってデータの保管上限を設定できます。容量と保持日数について、両方の上限を設定することはできますが、その場合、組み合わせによってデータを保持し続けることはできません。どちらか片方の上限を満たすと、データはアーカイブされるようになります。(例えば、上限1.0GBかつ保持日数30日を設定した、1.0GBまたは30日のいずれかが満たされた場合アーカイブされます。1.0GBかつ30日の両方が満たされた場合にアーカイブすることはできません)
参考:
What's in an index?
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/Howindexingworks#What.27s_in_an_index.3F
How the indexer stores indexes
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/HowSplunkstoresindexes
インデックスのライフサイクル
インデックスのBucketには、Hot, Warm, Cold, Frozen, Thawedという世代があります。
最新のデータが書き込まれる場所がHot Bucketです。
最新のデータが書き込まれなくなると、BucketはWarm状態にロールし、それから別のディレクトリに移動されCold状態となります。Cold状態までがサーチが可能なBucketです。
そしてデータが完全にアーカイブされるとFrozen状態となります。
Thawedは、いったんFrozenとなったBucketを、再度サーチ可能な状態に解凍したBucketとなります。
名称 | バケットの状態 | ディレクトリパス |
---|---|---|
Hot | 最新のデータが書き込まれるBucket. | $SPLUNK_HOME/var/lib/splunk/< index_name>/db |
Warm | 最新のデータが書き込まれなくなったBucket. ディレクトリパスはHotと同じ。 | $SPLUNK_HOME/var/lib/splunk/< index_name>/db |
Cold | 最新のデータが書き込まれなくなり、別のディレクトリパスに移動されたBucket.(Hot/Warmと比較して低速で安価なストレージを用いることが可能) | $SPLUNK_HOME/var/lib/splunk/< index_name>/colddbdb |
Frozen | アーカイブされたBucket.(バックアップ用の最も安価なストレージを用いることが可能) | (ユーザー側で指定) |
Thawd | 再度サーチ可能な状態に解凍したBucket. | $SPLUNK_HOME/var/lib/splunk/< index_name>/thaweddb |
※Linuxの場合、$SPLUNK_HOME=/opt/splunk
です。
参考:
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/HowSplunkstoresindexes#How_data_ages
インデックスの実体
インデックスの実体は、インデックス単位に分割されたBucketディレトクリに含まれるファイルの集合です。
そしてBucketは、大雑把には以下で構成されます。
- Raw Data(Jornalファイル)
- Time Series Indexファイル(tsidxファイル)
- メタデータファイル(dataファイル)
すでに上の表でも記載していますが、インデックスの格納先は以下となっています。
インデックスのデフォルト格納先:
$SPLUNK_HOME/var/lib/splunk/
Bucketディレクトリの命名規則:
db_<earliest_time>_<latest_time>_<bucket_id>
ここで、< earliest_time>と< latest_time>は、Bucketデータの開始時間と終了時間をUNIXタイムスタンプ形式で示したもので、< bucket_id>はBucket IDを表します。
例えば、デフォルトのインデックス(main)のHot Bucketに格納されているディレクトリとファイルは以下となります。
(mainインデックスのみ、mainという名前でなくdefaultdbという名前のインデックス名ディレクトリとなっているようですが、通常はインデックス名がディレクトリ名になります)
ls -l /opt/Splunk/var/lib/splunk/defaultdb/db/
-rw------- 1 splunk splunk 10 7 26 10:09 CreationTime
drwx--x--- 2 splunk splunk 64 7 26 10:09 GlobalMetaData
drwx--x--- 12 splunk splunk 384 8 19 02:56 db_1718722800_1711911201_1
drwx--x--- 12 splunk splunk 384 8 19 20:26 db_1720537200_1713106800_3
drwx--x--- 13 splunk splunk 416 8 19 02:56 db_1723561200_1719858082_2
ls -l /opt/Splunk/var/lib/splunk/defaultdb/db/db_1720537200_1713106800_3
total 64
-rw------- 1 splunk splunk 8352 8 19 20:26 1720537200-1713106800-10717657684032629512.tsidx
-rw------- 1 splunk splunk 105 8 19 20:26 Hosts.data
-rw------- 1 splunk splunk 106 8 19 20:26 SourceTypes.data
-rw------- 1 splunk splunk 109 8 19 20:26 Sources.data
-rw------- 1 splunk splunk 406 8 19 20:26 Strings.data
-rw------- 1 splunk splunk 67 8 19 03:52 bucket_info.csv
-rw------- 1 splunk splunk 0 8 19 20:26 optimize.result
drwx------ 4 splunk splunk 128 8 19 20:26 rawdata
ここで、rawdataディレクトリの中にRaw Data(Journalファイル)が可能されています。
Time Series Indexファイルが拡張子tsidxファイルで、メタデータファイルが拡張子dataファイルというわけです。(Host, Source, Sourcetypeといったデフォルトフィールドのメタデータファイルが存在していることが確認できます)
ユーザーがサーチを行うときは、tsidxファイルを使ってSplunkは指定されたデータがどのBucketにあるかを検索していますが、ここでは説明は省略します。
(興味がある人は、以下の参考資料を読んでんみてください)
参考資料
Behind the Magnifying Glass: How Search Works
https://conf.splunk.com/files/2016/slides/behind-the-magnifying-glass-how-search-works.pdf
(2016年なので超古い資料ですが、公式にインターネット公開されているため、この手の記事でだいたい参照されている重要な資料です)