В splunk все данные хранятся в buckets, которые в свою очередь входят в индексы.

Также репликация в кластере происходит именно с помощью копирования bucket на ноды.

Виды bucket

В splunk существует 5 вида bucket:

  • hot ( горячий )
  • warm ( теплый )
  • cold ( холодный )
  • frozen ( замороженный )
  • thawed ( размороженный )

Как хранятся данные ( index ) в splunk

По мере старения bucket переходит от состояния к состоянию проходя первые 4 вида.

hot bucket

Когда данные индексируются ( поступают в splunk ) впервые они находятся в hot bucket. Количество hot bucket множественное, ограничивается для каждого индекса в файле $SPLUNK_HOME/etc/system/local/indexes.conf параметром maxHotBuckets. Данные в hot bucket доступны для поиска. Чтобы посмотреть количество hot bucket можно выполнить запрос:

| dbinspect index=*
| search state=hot
| stats count as bucket_count min(startEpoch) as earliest_event by index splunk_server
| eval earliest_event_human = strftime(earliest_event, "%c")

warm bucket

Когда hot bucket достигает определённого размера ( maxDataSize ) или предела maxHotBuckets то hot bucket становится warm bucket. Т.е файл hot bucket переименовывается в warm bucket и хранится в том же месте ( homePath в $SPLUNK_HOME/etc/system/local/indexes.conf ). warm bucket также доступен для поиска, но не доступен для записи. Количество warm bucket множественное, ограничивается для каждого индекса в файле $SPLUNK_HOME/etc/system/local/indexes.conf параметром maxWarmDBCount, по умолчанию 300. Есть формула для расчета количества warm bucket:

maxWarmDBCount = (LocalDiskSpace-minFreeSpace-(maxHotBuckets*maxDataSize))/maxDataSize

Чтобы посмотреть количество warm bucket можно выполнить запрос:

| dbinspect index=*
| search state=warm 
| stats count as bucket_count min(startEpoch) as earliest_event by index splunk_server
| eval earliest_event_human = strftime(earliest_event, "%c")

cold bucket

Когда warm bucket достигает определённого размера или предела maxWarmDBCount то warm bucket становится cold bucket. Т.е файл warm bucket переименовывается в cold bucket и хранится в отличном от месте от warm bucket и hot bucket ( coldPath в $SPLUNK_HOME/etc/system/local/indexes.conf ). Это сделано для возможности перенести cold bucket на более дешевое хранилище данных. Первым в состояние cold bucket переходит самое старое warm bucket. Т.е чем старее, тем раньше перейдёт в cold bucket.

Чтобы посмотреть количество cold bucket можно выполнить запрос:

| dbinspect index=*
| search state=cold
| stats count as bucket_count min(startEpoch) as earliest_event by index splunk_server
| eval earliest_event_human = strftime(earliest_event, "%c")

frozen bucket

Наконец, после выполнения некоторых других условий, зависящих от времени ( frozenTimePeriodInSecs ) или размера ( maxTotalDataSizeMB ) , cold bucket переходят в frozen bucket, после чего они удаляются из индекса после дополнительной архивации. Данные в frozen bucket не доступны для поиска. По умолчанию frozen bucket удаляются а не архивируются. Также frozen bucket может быть переведён в thawed bucket, который будет доступен для поиска.

Архивирование frozen bucket

Для активирования архивирования frozen bucket нужно добавить в $SPLUNK_HOME/etc/system/local/indexes.conf параметры coldToFrozenDir и coldToFrozenScript

coldToFrozenScript может быть $SPLUNK_HOME/bin/coldToFrozenExample.py, который по умолчанию идёт со splunk или свой собственный скрипт.

Также стоит обратить внимание на то что при использовании кластера количество архивов будет ровняться количеству replication factor

Восстановление frozen bucket ( thawed bucket )

Копируем файлы thawed bucket в папку thawedPath, которая назначена в $SPLUNK_HOME/etc/system/local/indexes.conf. Когда архивные данные уже не нужны удаляем файлы.

Директории по умолчанию

Состояние bucket Директория
Hot $SPLUNK_HOME/var/lib/splunk/defaultdb/db/*
Warm $SPLUNK_HOME/var/lib/splunk/defaultdb/db/*
Cold $SPLUNK_HOME/var/lib/splunk/defaultdb/colddb/*
Frozen по умолчанию удаляются, можно изменить
Thawed $SPLUNK_HOME/var/lib/splunk/defaultdb/thaweddb/*