How to Reclaim Database Space¶
Порой требуется уменьшить кол-во документов в коллекциях MongoDB для ускорения поиска и уменьшения размера индексов, а также возможно для увеличения скорости классификации аварий исключая слишком древние для переоткрытия. Также можно использовать для высвобождения места, занятого коллекциями.
Очистка Архивных аварий (Archived alarms)¶
Механизм работы: Копирование всех архивных алармов, закрытых старше определённой даты, в архивные коллекции с последующим удалением из основной коллекции.
Настройка:¶
В etc/settings.yml или в KV Consul (/Root/noc/bi/alarms_archive_policy) (убедиться, что он есть в NOC_CONFIG в башне) следует указать настройки:
4m – 4 месяца, 5y – 5 лет, quarterly – как часто создавать новые коллекции. Можно поэкспериментировать. Выставив quarterly мы получаем, что в течении года мы увидим 4 архивных коллекции по каждому кварталу. Как только дата закрытия аварии пересекает границу квартала - она попадает в следующую коллекцию. Есть следующие варианты: {"weekly", "monthly", "quarterly", "yearly"}
bi:
alarms_archive_policy: quarterly
clean_delay_alarms: 4m
clean_delay_reboots: 5y
enable_alarms_archive: true
enable_managedobjects: true
enable_reboots: true
enable_alarms: true
./noc config dump bi
подгрузились верные значения переменных Пример:
./noc config dump bi
bi:
alarms_archive_batch_limit: 10000
alarms_archive_policy: quarterly
chunk_size: 3000
clean_delay_alarms: 4m
clean_delay_reboots: 5y
enable_alarms: true
enable_alarms_archive: true
enable_managedobjects: true
enable_reboots: true
extract_delay_alarms: 1h
extract_delay_reboots: 1h
extract_window: 1d
language: en
query_threads: 10
reboot_interval: 1M
./noc bi clean
-- тестовый запуск без удаления данных. При запуске без ключа --force
:
./noc bi clean
[reboots] Cleaned before 2013-11-13 11:32:58.424000 ...
[alarms] Cleaned before 2018-07-15 11:51:58.543000 ...
[managedobjects] Cleaned before 2018-09-13 12:00:07.948000 ...
alarms.y*
, но НЕ БУДУТ удалены из основной коллекции noc.alarms.archived
. Если вы запустили тестовый запуск, почистите потом все архивные коллекции alarms.y20XX*
чтобы при повторном запуске не было проблем.
./noc bi clean --force
реальное перемещение данных При реальном запуске после показа дат будет обратный отсчёт до внесения изменений. У вас есть время одуматься.
./noc bi clean --force
[reboots] Cleaned before 2013-11-13 11:32:58.424000 ...
All data before reboots from collection 2013-11-13 11:32:58.424000 will be Remove..
9
8
Как убедиться, что всё сработало:
./noc mongo – идём в монгу
show collections; – смотрим список коллекций, убеждаемся, что там нет коллекций, которые начинаются на `alarms.y` --если они там есть, значит вы уже пользовались командой.
db.noc.alarms.archived.find().sort({"timestamp": 1}).limit(1) – запоминаем `"clear_timestamp"` – первый закрытый аларм. После чистки время должно быть бОльше времени очистки.
db.noc.alarms.archived.count() – сколько сейчас документов в коллекции архивных алармов. Запоминаем и после удаления проверяем, что кол-во уменьшилось.
db.alarms.y2018_quarter3.count() – сколько документов в архивной коллекции
Далее ./noc bi clean --force и после этого анализируем коллекции в mongo.
alarm.y*
КРОМЕ ПОСЛЕДНЕЙ, туда возможно ещё будут записаны алармы. Очистка событий (events)¶
Механизм работы: Будет дропнуты все события старше 4-х недель. Это дефолт, можно передать свой параметр через --before
, смотри код.
./noc events clean --before 2019-11-27
or
./noc events clean --before-days 365
Настройка:¶
./noc events clean
покажет сколько событий может быть (но не будет) дропнуто в периоды:
Before is not set, use default
[events] Cleaned before 2018-10-15 15:12:35.931421 ...
Interval: 2018-04-30 13:10:59, 2018-05-07 13:10:59; Count: 1
Interval: 2018-05-07 13:10:59, 2018-05-14 13:10:59; Count: 4
------------////////////////////////--------------------------
Interval: 2018-10-08 13:10:59, 2018-10-15 13:10:59; Count: 21131
Interval: 2018-10-15 13:10:59, 2018-10-22 13:10:59; Count: 20412
./noc events clean --force
./noc events clean --force --before 2019-11-07
./noc mongo – идём в монгу
db.noc.events.active.count()
562620
db.noc.events.active.count()
427573
Очистка коллекций датастримов (datastream)¶
Механизм работы: Будет удалены все документы в коллекции старше параметра N_ttl, указанного в настройках секции datastream Если указан 0, удаления не будет. Посмотреть текущие настройки: ./noc config dump datastream
Использование: ./noc datastream clean --datastream alarm
, где alarm
название датастрима.
Проверка работы:
./noc mongo
db.ds_alarm.stats()
До:
"ns" : "noc.ds_alarm",
"size" : 9083632515,
"count" : 4675331,
"avgObjSize" : 1942,
"storageSize" : 1519890432,
"freeStorageSize" : 9973760,
./noc datastream clean --datastream alarm
После:
"ns" : "noc.ds_alarm",
"size" : 766903963,
"count" : 389807,
"avgObjSize" : 1967,
"storageSize" : 1546620928,
"freeStorageSize" : 1415208960,
MongoDB Compact¶
С версии 4.4 возможно проводить компакт коллекций и вернуть место, помеченное как свободное.
Внимание: Разработчики рекомендуют делать бекапы БД ДО проведения такой операции.
Пример
use noc
db.runCommand({ compact: "ds_alarm", force:true })
{
"bytesFreed" : 1619468288,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1648810501, 640),
"signature" : {
"hash" : BinData(0,"bVXq9xHXqN3VNYj/qnh/z1ZBzkQ="),
"keyId" : NumberLong("7029149395098533889")
}
},
"operationTime" : Timestamp(1648810501, 639)
}
noc.alarms.archived
noc.events.active
и ds_* при условии частого обновления данных
PostgreSQL¶
Удаление архивных вещей снаружи не требуется. Возможно стоит следить за логами БД
ClickHouse¶
Механизм очистки архивных данных реализован на основе настройки TTL в интерфейсе Main/Setup/CH Policies
Настройка Пример таблиц для настройки:
raw_cpu
raw_interface
raw_mac
raw_ping
raw_alarms
raw_memory
raw_reboots
raw_environment
raw_mac
достаточно 30
Пример использования
./noc ch-policy apply --host 0.0.0.0
- выведет объём данных, которые будут удалены.
Ключ --approve
удалит данные: noc ch-policy apply --host 0.0.0.0 --approve