Зачастую во время траблшутинга на стенде заказчика необходимо посмотреть и проверить базу данных MongoDB. Первым делом нам нужно получить логин и пароль от MongoDB:
ID=$(docker ps | grep visiology.admin | awk '{print $1}') &&
echo `docker exec -it $ID sh -c "cat secrets/MONGO_AUTH_USER"` &&
echo `docker exec -it $ID sh -c "cat secrets/MONGO_AUTH_PASSWORD"`
# Первой строчкой возвращается логин, второй - пароль
Затем заходим в контейнер visiology_mongodb и логинимся в консоль mongo:
$ mongo -u <логин> -p <пароль> VisiologyVA
or
$ mongosh "mongodb://127.0.0.1:27017" --username zidan --authenticationDatabase admin
Любое изменение в Монге напрямую может привести к поломке платформы. Польза от статьи в основном от операций поиска, просмотра, логирования. Любые модификации применяются только в конкретных кейсах поддержки, где это реально необходимо.
1. Просмотр сущностей.
Показать список баз данных:
>show dbs
>show databases
Выбрать/использовать базу данных:
Если базы с таким именем не существует, она автоматически создастся
Показать коллекции в БД:
2. Ввод данных
Создать коллекцию в БД:
Ввод содержимого в БД:
insertOne используется при создании одного объекта. Если при создании объекта указываются ранее несуществующие коллекции, они создаются автоматически.
3. Поиск сущностей
Вывод содержимого коллекции:
Поиск по объектам:
Поиск с сортировкой:
Вывод указанных полей массива:
Здесь мы вернули названия дашборда и названия листов, где используется виджет Гистограмма (ColumnChart). Вывод:
4. Изменение данных
Для того, чтобы внести правки в один объект, используется оператор updateOne:
Например:
В этом случае мы добавили новое свойство объекта - description. Если такое свойство уже существует, то содержимое свойства изменится на заданное.
Для того, чтобы полностью заменить один объект другим, используется оператор replaceOne:
Теперь этот объект имеет следующий вид:
5. Удаление данных/сущностей
Удаление данных из коллекции:
Также, например, можно удалить пользователей в зависимости от времени их создания (импорта).
Для удаления отдельного свойства объекта используется оператор $unset. С его помощью можно удалять сразу несколько полей:
Удаление коллекции:
6. Повышение прав и диагностика БД/коллекций
По умолчанию у пользователя нет доступа к средствам диагностики баз данных. От лица обычного пользователя с правами readWrite (подробнее о ролях/правах в mongoDB здесь) мы сможем разве чтопроверить коллекцию на целостность:
После чего возвращается общая информация о коллекции, где также будет значение valid: false/true, если данные повреждены/не повреждены.
Если же мы хотим получать больше информации, то нам необходимо внести изменения в файл /init-db.js, который находится в корневой папке docker-образа visiology_mongodb. Именно этот файл отвечает за создание пользователей в mongoDB. Копируем его из контейнера:
Находим в скрипте команды для создания пользователя:
Добавляем в базу данных admin своего пользователя с расширенными правами:
Далее нужно выполнить маппинг изменённого init-db.js в каталог Docker хоста. Для этого мы открываем файл platform.yml (лежит в папке с дистрибутивом платформы) для редактирования. В этом файле ищем секцию "mongodb:" и в блоке "volumes:" добавляем следующее:
Теперь, если у нас будет выполняться перезапуск платформы, файл init-db.js будет взят из каталога /home/<username>/distrib_2.26/, который мы прописали в yml файле. После этого можно перезапускать платформу, заходить в контейнер visiology_mongodb и логиниться в консоль монго:
Эта команда выводит огромное количество данных. Поэтому можно обозначить поле или объект в команде:
7. Логирование
В консоли mongo мы увидим только часть информации. Иногда для траблшутинга также бывает полезен просмотр истории событий на стенде. Здесь мы можем отследить историю изменения пользователей, дашбордов и остальных объектов. Тогда приходится прибегать к просмотрам логов. По умолчанию логи mongo доступны в stdout. Увидеть их мы можем следующим образом:
Если необходимо, логи можно выводить в отдельный файл. Для этого нужно внести следующие изменения в platform.yml:
где -v - уровень детализации логов, необходимый для получения данных о редактировании объектов от 0 (отсутствие индекса -v) до 5 (-vvvvv);
--logpath /data/db/mongo.log - здесь указываем файл, в который пишутся логи. В таком случае, при каждом перезапуске контейнера будет создаваться новый файл mongo.log, а предыдущий будет перезаписан с названием mongo.log.<timestamp>.
Другой доступный метод логирования - вывод логов в grafana. Для его настройки нужно будет скопировать файл /etc/promtail/docker-config.yaml из docker-контейнера visiology_promtail и добавить компонент mongodb в поле selector:
Затем маппим отредактированный yaml файл обратно в контейнер promtail: вносим в grafana.yml соответстующие изменения:
Не забываем про опции логирования в файле platform.yml:
После перезапуска платформы мы сможем отследить события в mongo на портале администрирования. Например, создание нового пользователя через портал выполняется платформой через команду insert, то есть отследить это событие мы можем так:
Аналогично, findAndModify - для изменения или удаления пользователя.
Для событий с дашбордами и виджетами подойдёт следующий фильтр:
Также через логи мы можем извлечь информацию об истории изменения объектов. Для этого в запросе достаточно указать имя объекта.
В результате мы видим все timestamp'ы, когда менялся объект, и можем отследить изменения в нём.
За создание резервных копий серверов, баз данных или коллекций отвечает утилита mongodump. Если запустить mongodump без каких-либо опций, файл dump создастся на локальном хосте в директории /dump.
Также вы можете указать хост и порт сервера, к которому утилите mongodump нужно присоединиться:
Для указания директории можно использовать индекс -o или - -out:
Чтобы ограничить резервную копию одной коллекцией, можно указать - -db и - -collection, как опции:
Например, при создании бэкапа баз данных Visiology применяется следующая команда: