UniFi — Как удалить старые (лишние) данные и отрегулировать размер базы данных Mongo

В статье описано, как отрегулировать размер базы данных, используемой контроллером UniFi с помощью сценария, удаляющего устаревшую статистическую информацию.
Для хранения информации о подключенных устройствах, конфигурации контроллера, клиентах и статистике, UniFi использует базу данных MongoDB.
Контроллер UniFi, оставленный без должного контроля, управляющий многими устройствами и ведущий журналы многих клиентов, может по прошествии некоторого времени, накопить очень большой объем данных.  В данной статье описано, как использовать сценарий prune (удаление старых данных) для удаления статистики, «возраст» которой превышает X дней, в том числе, событий, сообщений сигнализации, гостевых входов, обнаруженных ненадежных АР, известных клиентов, истекших квитанций чеков, статистики трафика.
Сценарий prune не будет удалять данные, важные для правильного функционирования контроллера, например, данные о пользователях, которые были блокированы.
Примечание: В версии V5, контроллер UniFi имеет опцию для удаления старой информации из базы данных (непосредственно из контроллера).  Предполагается, что Вы сможете зарегистрироваться в контроллере UniFi, поэтому пожалуйста, используйте функцию Compact Database (Уменьшить размер базы данных) в разделе Settings -> Maintenance (Настройки — Поддержание работоспособности) вместо способов, описанных в данной статье.

Содержание

  1. Как удалить старые данные контроллера, функционирующего под управлением Windows
  2. Как удалить старые данные контроллера, функционирующего под управлением Mac OS X
  3. Как удалить старые данные из контроллера, функционирующего под управлением Linux (Ubuntu, Debian и облачный ключ (Cloud Key))
  4. Сценарий Prune (для справок)

Как удалить старые данные контроллера, функционирующего под управлением Windows

Подготовительные действия: Перед выполнением сценария, контроллер должен уже работать.  Если он не работает, пожалуйста, запустите его и только потом выполните описанные ниже шаги.  Перед внесением значительных изменений (подобных этому) не забывайте создать резервную копию контроллера.

Шаг 1: Загрузка Mongo

Установщик UniFi под Windows не содержит двоичного кода mongo.  Посетите Официальный сайт загрузки базы данных MongoDB, выберите версию 2.4.14 из раскрывающегося списка и загрузите архив .zip версии, соответствующей архитектуре CPU Вашего сервера.

Шаг 2: Извлечение Mongo

Извлеките \bin\mongo.exe в рабочий каталог, выбранный по Вашему усмотрению.  В данном примере мы использовали C:\prune\ . Вы можете игнорировать все остальные файлы, включенные в пакет.

Шаг 3: Загрузка сценария

Загрузите сценарий на сервер с помощью щелкните мышью здесь, и сохраните его в рабочем каталоге.

Шаг 4: Открытие командной строки

Откройте командную строку. Для этого нажмите комбинацию клавиш WINDOWS + R на клавиатуре. В открывшемся меню введите cmd и нажмите ENTER (ВВОД).

Шаг 5: Вход в рабочий каталог

В командной строке введите команду перехода в рабочий каталог:

cd C:\prune\

Шаг 6: Выполнение теста работоспособности

По умолчанию сценарий работает в пробном режиме «dryrun». Поэтому он будет сообщать, что он удалит старые данные из базы данных, но на самом деле этого происходить не будет.  На этом шаге убедитесь, что сценарий действительно работает так, как ожидается.

mongo.exe —port 27117 < mongo_prune_js.js

На выходе должно быть примерно следующее:

2.68

Шаг 7: Выключение пробного режима «dryrun»

Чтобы выключить режим dryrun и задать число дней поддержки данных, отредактируйте сценарий.  По умолчанию сценарий поддерживает данные 7 дней.  В notepad (Блокнот) или другом текстовом редакторе простого текста измените сценарий. Не используйте редакторы сложного текста, такие как Wordpad или Word.  Рекомендуется использовать такой редактор, как Notepad++ , вследствие того, что он не добавляет скрытых символов и разрывов строк.
Отредактируйте var days=7; задайте другое число дней поддержки данных; измените var dryrun=true; на var dryrun=false; это позволит сценарию действительно удалять старые данные из базы данных (то есть он будет работать не так, как в режиме тестирования).

2.68-1

Шаг 8: Удаление старых данных из базы данных

Запустите отредактированный сценарий, реально вычищающий старые данные из базы данных:

mongo.exe —port 27117 < mongo_prune_js.js

Примечание: Вследствие того, что база данных действительно изменяется, данный шаг может занять больше времени, чем в режиме тестирования на шаге 6.  Не прерывайте вывод на консоли до тех пор, пока не получите сообщение «bye».

Шаг 9: Проверка выполнения

Убедитесь, что операция завершилась успешно и что не было сообщений об ошибках. На выходе должно быть примерно следующее:

2.68-2

Шаг 10 (опция): Чистка

Удалите созданный Вами каталог и все данные внутри него (если Вы не собираетесь использовать его снова).

Как удалить старые данные контроллера, функционирующего под управлением Mac OS X

Подготовительные действия: Перед выполнением сценария, контроллер должен уже работать.  Если он не работает, пожалуйста, запустите его и только потом выполните описанные ниже шаги.  Перед внесением значительных изменений (подобных этому) не забывайте создать резервную копию контроллера.

Шаг 1: Создание рабочего каталога

Создайте на компьютере рабочий каталог.  Для целей данной статьи мы создали каталог с именем /prune.

Шаг 2: Загрузка Mongo

Установщик UniFi под Mac OS X не содержит двоичного кода mongo.  Посетите  официальный сайт загрузки MongoDB, щелкните вкладкуe OSX, выберите версию 2.4.14 из раскрывающегося списка и загрузите пакет .tgz.

Шаг 3: Извлечение Mongo

Переместите загруженный пакет в Ваш рабочий каталог и извлеките содержимое — для этого дважды щелкните его мышью, либо используйте соответствующее приложение (по Вашему усмотрению).

Шаг 4: Перемещение Mongo в рабочий каталог

Отыщите двоичный файл bin/mongo и скопируйте его в рабочий каталог.  С этого момента загруженный пакет .tgz и любые дополнительные извлеченные файлы могут быть удалены. Необходимым является только двоичный файл mongo.

Шаг 5: Вход в рабочий каталог

Откройте окно терминала и перейдите из текущего каталога в рабочий каталог, созданный на шаге 1:

cd /prune

Шаг 6: Загрузка сценария

Загрузите сценарий для удаления старых данных:

curl «https://help.ubnt.com/hc/en-us/article_attachments/204082688/mongo_prune_js.js» -o «mongo_prune_js.js»

2.68-3

Шаг 7: Выполнение теста работоспособности

Выполните тест работоспособности сценария.  По умолчанию сценарий работает в пробном режиме «dryrun». Поэтому он будет сообщать, что он удалит старые данные из базы данных, но на самом деле этого происходить не будет.  На этом шаге убедитесь, что сценарий действительно работает так, как ожидается.

./mongo —port 27117 < mongo_prune_js.js

На выходе должно быть примерно следующее:

2.68-4

Шаг 8: Выключение пробного режима «dryrun»
Чтобы выключить режим dryrun и задать число дней поддержки данных, отредактируйте сценарий.  По умолчанию сценарий поддерживает данные 7 дней.  Для редактирования сценария используйте редактор nano или ему подобный:

nano mongo_prune_js.js

Допустим, Вы используете редактор nano. Для навигации по тексту используйте кнопки со стрелками.  Отредактируйте var days=7; задайте другое число дней поддержки данных; измените var dryrun=true; на var dryrun=false; это позволит сценарию действительно удалять старые данные из базы данных (то есть он будет работать не так, как в режиме тестирования).  По завершении редактирования, нажмите на клавиатуре CTRL + O, чтобы сохранить файл (для подтверждения нажмите Enter). Затем нажмите CTRL + X, чтобы выйти из редактора.

2.68-5

Шаг 9: Удаление старых данных из базы данных

Запустите отредактированный сценарий, реально вычищающий старые данные из базы данных:

./mongo —port 27117 < mongo_prune_js.js

Примечание: Вследствие того, что база данных действительно изменяется, данный шаг может занять больше времени, чем в режиме тестирования на шаге 7.  Не прерывайте вывод на консоли до тех пор, пока не получите сообщение «bye».

Шаг 10: Проверка выполнения

Убедитесь, что операция завершилась успешно и что не было сообщений об ошибках. На выходе должно быть примерно следующее:

2.68-6

Шаг 11: Завершение сессии

Завершите сессию терминала:

exit

Закройте окно терминала.

Шаг 12 (ОПЦИЯ): Чистка

Удалите рабочий каталог, если не намереваетесь использовать его снова.

Как удалить старые данные из контроллера, функционирующего под управлением Linux (Ubuntu, Debian и облачный ключ (Cloud Key))

Подготовительные действия: Перед выполнением сценария, контроллер должен уже работать.  Если он не работает, пожалуйста, запустите его и только потом выполните описанные ниже шаги.  Вы можете запустить контроллер, введя после выполнения шага 2 следующую команду:

sudo service unifi start

Перед внесением значительных изменений (подобных этому) не забывайте создать резервную копию контроллера.

Шаг 1: Установление соединения

Подключитесь к серверу по SSH, используя клиент, который предпочитаете и пройдите аутентификацию.  Снимки экрана в этом разделе статьи сделаны для приложения PuTTY (в Windows).  Если используется клиент Linux или Mac, Вы можете подключиться к серверу из встроенного терминала.

Шаг 2: Вход в рабочий каталог

Перейдите в Ваш домашний каталог, либо создайте рабочий каталог (по своему усмотрению).  При напрсании данной статьи был использован домашний каталог.

cd ~

Шаг 3: Загрузка сценария

Загрузите на свой сервер сценарий для удаления старых данных:

wget https://help.ubnt.com/hc/en-us/article_attachments/204082688/mongo_prune_js.js

2.68-7

Шаг 4: Выполнение теста работоспособности

Выполните тест работоспособности сценария.  По умолчанию сценарий работает в пробном режиме «dryrun». Поэтому он будет сообщать, что он удалит старые данные из базы данных, но на самом деле этого происходить не будет.  На этом шаге убедитесь, что сценарий действительно работает так, как ожидается.

mongo —port 27117 < mongo_prune_js.js

На выходе должно быть примерно следующее:

2.68-8

Шаг 5: Выключение пробного режима «dryrun»
Чтобы выключить режим dryrun и задать число дней поддержки данных, отредактируйте сценарий.  По умолчанию сценарий поддерживает данные 7 дней.  Для редактирования сценария используйте редактор nano или ему подобный:

nano mongo_prune_js.js

Допустим, Вы используете редактор nano. Для навигации по тексту используйте кнопки со стрелками.  Отредактируйте var days=7; задайте другое число дней поддержки данных; измените var dryrun=true; на var dryrun=false; это позволит сценарию действительно удалять старые данные из базы данных (то есть он будет работать не так, как в режиме тестирования).  По завершении редактирования, нажмите на клавиатуре CTRL + O, чтобы сохранить файл (для подтверждения нажмите Enter). Затем нажмите CTRL + X, чтобы выйти из редактора.

2.68-9

Примечание: Если выдается ошибка, уведомляющая, что редактор nano не установлен, Вы можете установить его, выполнив следующую команду (после нее снова введите предыдущую команду):

sudo apt-get update && sudo apt-get -y install nano

Шаг 6: Удаление старых данных из базы данных

Запустите отредактированный сценарий, реально вычищающий старые данные из базы данных:

mongo —port 27117 < mongo_prune_js.js

Примечание: Вследствие того, что база данных действительно изменяется, данный шаг может занять больше времени, чем в режиме тестирования на шаге 4.  Не прерывайте вывод на консоли до тех пор, пока не получите сообщение «bye».

Шаг 7: Проверка выполнения

Убедитесь, что операция завершилась успешно и что не было сообщений об ошибках. На выходе должно быть примерно следующее:

2.68-10

Шаг 8 (ОПЦИЯ): Чистка

Удалите сценарий из Вашего домашнего каталога, если не намереваетесь использовать его снова.

rm mongo_prune_js.js

Шаг 9: Завершение сессии

Завершите сессию терминала:

exit

Сценарий Prune (для справок)

Ниже для справок приведен текст сценария для удаления старых данных:

// Поддержка данных, накопленных в течение N дней var days=7;

// Замените на false, чтобы сценарий действительно удалял старые записи
// из базы данных. Пока значение равно true, никаких изменений в базе данных производиться не будет var dryrun=true;

var now = new Date().getTime(),

time_criteria = now — days * 86400 * 1000,
time_criteria_in_seconds = time_criteria / 1000;

print((dryrun ? «[dryrun] » : «») + «pruning data older than » + days + » days (» + time_criteria + «)… «);

use ace;

var collectionNames = db.getCollectionNames();

for (i=0; i<collectionNames.length; i++) {

var name = collectionNames[i];
var query = null;

if (name === ‘event’ || name === ‘alarm’) {

query = {time: {$lt:time_criteria}};

}

// ненадежная точка доступа

if (name === ‘rogue’) {

query = {last_seen: {$lt:time_criteria_in_seconds}};

}

// удаляет квитанции чеков, срок хранения которых превышает ‘$days’ дней

// активные и неиспользованные квитанции НЕ ТРОГАЕМ

if (name === ‘voucher’) {

query = {end_time: {$lt:time_criteria_in_seconds}};

}

// авторизация гостя

if (name === ‘guest’) {

query = {end: {$lt:time_criteria_in_seconds}};

}

// если пользователь был замечен только ОДНАЖДЫ, $last_seen не будет определена
// Итак, если $last_seen не определена, будем вместо нее использовать $first_seen
// Убедитесь также, что установлена $blocked или $use_fixedip. Если это так, НЕ стирайте
// элемент списка, неважно, насколько он старый. Нам требуется, чтобы заблокированные пользователи и пользователи с фиксированными ip-адресами продолжали
// оставаться заблокированными или с зафиксированными

ip-адресами if (name === ‘user’) {

query = { blocked: { $ne: true}, use_fixedip: { $ne: true}, $or: [

{last_seen: {$lt:time_criteria_in_seconds} },

{last_seen: {$exists: false}, first_seen: {$lt:time_criteria_in_seconds} }

]

};

}

if (query) {

count1 = db.getCollection(name).count();
count2 = db.getCollection(name).find(query).count();
print((dryrun ? «[dryrun] » : «») + «pruning » + count2 + » entries (total » + count1 + «) from » + name + «…
«);
if (!dryrun) {

db.getCollection(name).remove(query);
db.runCommand({ compact: name });

}

}

}

use ace_stat;

var collectionNames = db.getCollectionNames();

for (i=0; i<collectionNames.length; i++) {

var name = collectionNames[i];
var query = null;

// статистики в хронологическом порядке (stat.*)

if (name.indexOf(‘stat’)==0) {

query = {time: {$lt:time_criteria}};

}

if (query) {

count1 = db.getCollection(name).count();
count2 = db.getCollection(name).find(query).count();
print((dryrun ?
«[dryrun] » : «») + «pruning » + count2 + » entries (total » + count1 + «) from » + name + «… «);
if (!dryrun) {

db.getCollection(name).remove(query);
db.runCommand({ compact: name });

}

}

}

if (!dryrun) db.repairDatabase();

 

Другие статьи по этой теме

 

Все авторские права и другие права интеллектуальной собственности на данные материалы являются собственностью Компании «Рутстор» (ROOTSTORE). При использовании данного материала ссылка на сайт rootstore.ru обязательна.

Авторизация
*
*
Регистрация
*
*
*
*
Генерация пароля
Заказать звонок



Купить в 1 клик