MongoDB – это бесплатная документо-ориентированная база данных с открытым исходным кодом, написанная на C++. Классифицируется как NoSQL база данных, так как в ее основе не лежит традиционная реляционная структура БД. Вместо этого в MongoDB используются JSON-подобные документы с динамическими схемами. DСхемы можно менять в любое удобное время без необходимости установки новой базы данных с обновленной схемой.
Преимущество NoSQL БД перед привычными реляционными БД в том, что можно без проблем настроить горизонтальное масштабирование, репликацию и шардинг. MongoDB базы часто используется для хранения документов, тестовых файлов, почтовых сообщений и т.д.
В данной статье, мы рассмотрим установку MongoDB на сервер с CentOS 7 или 8, выполним базовую настройку, а также рассмотрим варианты оптимизации.
Подключение репозитория MongoDB
MongoDB имеет свой собственный репозиторий, откуда и выполняется установка. В стандартных репозиториях пакета для установки данного сервера БД, нет. Создадим файл для репозитория и добавим в него данные для подключения:
# nano /etc/yum.repos.d/mongodb-org.repo
Содержимое файла будет следующее:
[mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
На момент написания статьи последняя версия MongoDB в репозитории была именно 4.2. Перед установкой на ваш сервер, перейдите на сайт разработчика и проверьте актуальную версию.
После создания repo файла с параметрами репозитория, можно приступать к установке пакетов.
Установка MongoDB в CentOS
Чтобы установить нужные пакеты для работы MongoDB, запустите команду yum или dnf (в CentOS 8):
# yum install mongodb-org -y
Как и любой другой сервис, MongoDB нужно запустить и добавить в автозагрузку:
# systemctl start mongod
# systemctl enable mongod
Чтобы проверить, что сервис mongod «слушает» нужный порт (по умолчанию TCP 27017), выполните:
# lsof -i:27017
Можно открыть доступ к службе MongoDB в файлеволе (ниже пример для firewalld):
# firewall-cmd --add-port=27017/tcp --permanent
# firewall-cmd --reload
Логи сервиса доступны в файле:
# tail -f /var/log/mongodb/mongod.log
При запуске MongoDB может выйти предупреждение:
** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.
P.S. У меня подобной ошибки не было, но в сети часто встречается подобный вопрос и я решил описать его решение.
Для решения проблемы, нужно открыть файл /etc/security/limits.d/20-nproc.conf и повысить лимиты:
# nano /etc/security/limits.d/20-nproc.conf
В конец файла добавьте:
mongod soft nproc 32000
Сохраните файл и перезапустите сервис mongod:
# systemctl restart mongod
Чтобы войти в консоль MongoDB, введите mongo:
[root@server mongodb]# mongo
MongoDB shell version v4.2.2 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("f75bee8f-d71d-47fb-8728-6f67fb7a6982") } MongoDB server version: 4.2.2
Основные команды MongoDB
Рассмотрим несколько команд MongoDB, которые можно использовать в шеле mongo. В частности, создадим базу данных, пользователя и покажем парочку других полезных команд.
Чтобы создать базу данных в MongoDB, нужно выполнить команду в консоли СУБД:
> use buildcentos
Заметили, что она похожа на ту, что используется в mysql/mariadb для входа в существующую БД? В MongoDB как оказалось все проще.
Чтобы проверить, что мы действительно находимся в этой БД, выполним:
> db
Но есть один ньюанс, на самом деле новая база данных не будет создана, пока вы в ней не сохраните хотя бы один документ. Если выполнить проверку на существующие БД глобально, мы увидим, что нашей БД в списке нет:
> show dbs
Выполним простой запрос, который сохранит документ в нашей БД:
> db.new_collection.insert({ some_key: "some_value" })
Чтобы удалить БД, нужно находится в той самой БД, которую будете удалять и выполнить запрос:
> db.dropDatabase()
Например:
> use buildcentos
switched to db buildcentos
> db.dropDatabase()
{ "dropped" : "buildcentos", "ok" : 1 } >
После чего, БД будет удалена:
> show dbs
admin 0.000GB config 0.000GB local 0.000GB >
Чтобы создать нового пользователя с правами чтения и записи для вашей БД, выполните следующий запрос:
> db.createUser(
{ user: "centos", pwd: "rewqrwe213213", roles: [ { role: "readWrite", db: "buildcentos" } ] } )
Чтобы вывести список пользователей, выполните запрос:
> db.getUsers()
Или
> show users
Обе команды, выводят идентичный результат:
Чтобы удалить пользователя:
> db.dropUser('centos')
После выполнения команды, при выводе списка пользователей, у вас его не будет:
> db.dropUser('centos')
true
> db.getUsers()
Конфигурационный файл MongoDB
Как у любой СУБД, у MongoDB есть конфигурационный файл, расположенный по пути /etc/mongod.conf. Рассмотрим его основные параметры:
- Блок systemLog — отвечает за логирование. Минимальные параметры, которые должны быть прописаны в этом блоке, чтобы логирование работало:
systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log
- Блок processManagement — управление процессом в котором работает MongoDB:fork — запускает демона в фоновом режиме для работы базы, по умолчанию значение false pidFilePath – путь к PID файлу timeZoneInfo – указывает путь к файлу для загрузки временных зон Пример конфига:
processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo
- Блок net — служит для управления работы с сетью:
port — указывает номер порта на котором будет запущен демон mongod, по умолчанию порт 27017
bindIp – ip адрес с которого можно обращаться к БД. Как и в случае с mysql/mariadb это настройка служит для безопасности, чтобы избежать доступа с внешних серверов. Если указать здесь 127.0.0.1, то подключение будет работать только локально.
maxIncomingConnections – количество одновременных подключений, которые может обработать MongoDB. Данный параметр не может превышать системный, по умолчанию значение 65536
Пример:net: port: 27017 bindIp: 127.0.0.1
- Блок security — данный блок отвечает за безопасность:authorization — если параметр включен, то требуется авторизация юзера, без логина и пароля не будет установлено соединение с процессом, который его запрашивает. По умолчанию, отключен.javascriptEnabled — включает/отключает исполнение JavaScript на стороне сервера.
- Блок storage — блок отвечающий за параметры хранения БД:dbPath — строка которая указывает в каком месте будет хранится БД. По умолчанию /data/dbjournal – если включен, включает журнал долговечности, чтобы файлы в базе оставались действительными и восстанавливались.Пример настройки:
storage: dbPath: /var/lib/mongo journal: enabled: true
Более расширенные настройки, можно найти в документации к MongoDB на официальном сайте.
Оптимизация MongoDB для повышения производительности
Чтобы MongoDB работало достаточно быстро и не возникало проблем, нужно чтобы были соблюдены некоторые условия:
- Используйте файловую систему XFS, взамен более медленной EXT4(XFS использует параллельный дисковый ввод/вывод, что значительно улучшает производительность по сравнению с EXT4).
- Используйте на своих серверах быстрые SSD/NVME диски, взамен более медленных HDD.
- Отключите Transparent Huge Page. Для отключения THP в unit-файл MongoDB добавить вызов команд:
# echo 'never' >> /sys/kernel/mm/transparent_hugepage/enabled
# echo 'never' >> /sys/kernel/mm/transparent_hugepage/defrag - Проверьте и при необходимости установите лимиты ulimit:
-f (file size): unlimited -t (cpu time): unlimited -v (virtual memory): unlimited -n (open files): 32000 и более -m (memory size): unlimited -u (processes/threads): 32000 и более
- Так же следите за потреблением памяти на сервере, если MongoDB потребляет достаточно много памяти, проводите оптимизацию самих баз данных. Если проект очень крупный, есть смысл разнести базы на разные сервера для большей производительности.