- Главная
- Техинфо
- Инструкции по настройке Ubiquiti
- UniFi
- UniFi — Как удалить старые данные и отрегулировать размер базы данных Mongo
Нажимая на кнопку, вы даете свое согласие на
обработку персональных данных
Нажимая на кнопку, вы даете свое согласие на
обработку персональных данных
23.01.2017
В статье описано, как отрегулировать размер базы данных, используемой контроллером UniFi с помощью сценария, удаляющего устаревшую статистическую информацию.
Для хранения информации о подключенных устройствах, конфигурации контроллера, клиентах и статистике, UniFi использует базу данных MongoDB.
Контроллер UniFi, оставленный без должного контроля, управляющий многими устройствами и ведущий журналы многих клиентов, может по прошествии некоторого времени, накопить очень большой объем данных. В данной статье описано, как использовать сценарий prune (удаление старых данных) для удаления статистики, "возраст" которой превышает X дней, в том числе, событий, сообщений сигнализации, гостевых входов, обнаруженных ненадежных АР, известных клиентов, истекших квитанций чеков, статистики трафика.
Сценарий prune не будет удалять данные, важные для правильного функционирования контроллера, например, данные о пользователях, которые были блокированы.
Примечание: В версии V5, контроллер UniFi имеет опцию для удаления старой информации из базы данных (непосредственно из контроллера). Предполагается, что Вы сможете зарегистрироваться в контроллере UniFi, поэтому пожалуйста, используйте функцию Compact Database (Уменьшить размер базы данных) в разделе Settings -> Maintenance (Настройки - Поддержание работоспособности) вместо способов, описанных в данной статье.
Подготовительные действия: Перед выполнением сценария, контроллер должен уже работать. Если он не работает, пожалуйста, запустите его и только потом выполните описанные ниже шаги. Перед внесением значительных изменений (подобных этому) не забывайте создать резервную копию контроллера.
Шаг 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На выходе должно быть примерно следующее:
Чтобы выключить режим dryrun и задать число дней поддержки данных, отредактируйте сценарий. По умолчанию сценарий поддерживает данные 7 дней. В notepad (Блокнот) или другом текстовом редакторе простого текста измените сценарий. Не используйте редакторы сложного текста, такие как Wordpad или Word. Рекомендуется использовать такой редактор, как Notepad++ , вследствие того, что он не добавляет скрытых символов и разрывов строк.
Отредактируйте var days=7; задайте другое число дней поддержки данных; измените var dryrun=true; на var dryrun=false; это позволит сценарию действительно удалять старые данные из базы данных (то есть он будет работать не так, как в режиме тестирования).
Запустите отредактированный сценарий, реально вычищающий старые данные из базы данных:
mongo.exe --port 27117 < mongo_prune_js.js Примечание: Вследствие того, что база данных действительно изменяется, данный шаг может занять больше времени, чем в режиме тестирования на шаге 6. Не прерывайте вывод на консоли до тех пор, пока не получите сообщение "bye". Шаг 9: Проверка выполненияУбедитесь, что операция завершилась успешно и что не было сообщений об ошибках. На выходе должно быть примерно следующее:
Удалите созданный Вами каталог и все данные внутри него (если Вы не собираетесь использовать его снова).
Подготовительные действия: Перед выполнением сценария, контроллер должен уже работать. Если он не работает, пожалуйста, запустите его и только потом выполните описанные ниже шаги. Перед внесением значительных изменений (подобных этому) не забывайте создать резервную копию контроллера.
Шаг 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: Загрузка сценарияЗагрузите сценарий для удаления старых данных:
Выполните тест работоспособности сценария. По умолчанию сценарий работает в пробном режиме "dryrun". Поэтому он будет сообщать, что он удалит старые данные из базы данных, но на самом деле этого происходить не будет. На этом шаге убедитесь, что сценарий действительно работает так, как ожидается.
./mongo --port 27117 < mongo_prune_js.jsНа выходе должно быть примерно следующее:
Чтобы выключить режим dryrun и задать число дней поддержки данных, отредактируйте сценарий. По умолчанию сценарий поддерживает данные 7 дней. Для редактирования сценария используйте редактор nano или ему подобный:
nano mongo_prune_js.jsДопустим, Вы используете редактор nano. Для навигации по тексту используйте кнопки со стрелками. Отредактируйте var days=7; задайте другое число дней поддержки данных; измените var dryrun=true; на var dryrun=false; это позволит сценарию действительно удалять старые данные из базы данных (то есть он будет работать не так, как в режиме тестирования). По завершении редактирования, нажмите на клавиатуре CTRL + O, чтобы сохранить файл (для подтверждения нажмите Enter). Затем нажмите CTRL + X, чтобы выйти из редактора.
Запустите отредактированный сценарий, реально вычищающий старые данные из базы данных:
Убедитесь, что операция завершилась успешно и что не было сообщений об ошибках. На выходе должно быть примерно следующее:
Завершите сессию терминала:
exitЗакройте окно терминала.
Шаг 12 (ОПЦИЯ): ЧисткаУдалите рабочий каталог, если не намереваетесь использовать его снова.
Подготовительные действия: Перед выполнением сценария, контроллер должен уже работать. Если он не работает, пожалуйста, запустите его и только потом выполните описанные ниже шаги. Вы можете запустить контроллер, введя после выполнения шага 2 следующую команду:
sudo service unifi startПеред внесением значительных изменений (подобных этому) не забывайте создать резервную копию контроллера.
Шаг 1: Установление соединенияПодключитесь к серверу по SSH, используя клиент, который предпочитаете и пройдите аутентификацию. Снимки экрана в этом разделе статьи сделаны для приложения PuTTY (в Windows). Если используется клиент Linux или Mac, Вы можете подключиться к серверу из встроенного терминала.
Шаг 2: Вход в рабочий каталогПерейдите в Ваш домашний каталог, либо создайте рабочий каталог (по своему усмотрению). При напрсании данной статьи был использован домашний каталог.
cd ~ Шаг 3: Загрузка сценарияЗагрузите на свой сервер сценарий для удаления старых данных:
Выполните тест работоспособности сценария. По умолчанию сценарий работает в пробном режиме "dryrun". Поэтому он будет сообщать, что он удалит старые данные из базы данных, но на самом деле этого происходить не будет. На этом шаге убедитесь, что сценарий действительно работает так, как ожидается.
mongo --port 27117 < mongo_prune_js.jsНа выходе должно быть примерно следующее:
Чтобы выключить режим dryrun и задать число дней поддержки данных, отредактируйте сценарий. По умолчанию сценарий поддерживает данные 7 дней. Для редактирования сценария используйте редактор nano или ему подобный:
nano mongo_prune_js.jsДопустим, Вы используете редактор nano. Для навигации по тексту используйте кнопки со стрелками. Отредактируйте var days=7; задайте другое число дней поддержки данных; измените var dryrun=true; на var dryrun=false; это позволит сценарию действительно удалять старые данные из базы данных (то есть он будет работать не так, как в режиме тестирования). По завершении редактирования, нажмите на клавиатуре CTRL + O, чтобы сохранить файл (для подтверждения нажмите Enter). Затем нажмите CTRL + X, чтобы выйти из редактора.
Запустите отредактированный сценарий, реально вычищающий старые данные из базы данных:
Убедитесь, что операция завершилась успешно и что не было сообщений об ошибках. На выходе должно быть примерно следующее:
Удалите сценарий из Вашего домашнего каталога, если не намереваетесь использовать его снова.
Завершите сессию терминала:
exitНиже для справок приведен текст сценария для удаления старых данных:
// Поддержка данных, накопленных в течение 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 });
}
}