Установка и настройка MongoDB в CentOS

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]_x000D_name=MongoDB Repository_x000D_baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/_x000D_gpgcheck=1_x000D_enabled=1_x000D_gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc_x000D_

На момент написания статьи последняя версия MongoDB в репозитории была именно 4.2. Перед установкой на ваш сервер, перейдите на сайт разработчика и проверьте актуальную версию.

подключение репозитория mongodb в centos

После создания repo файла с параметрами репозитория, можно приступать к установке пакетов.

Установка MongoDB в CentOS

Чтобы установить нужные пакеты для работы MongoDB , запустите команду yum или dnf (в CentOS 8 ):

# yum install mongodb-org -y

установка mongodb: yum install mongodb-org

Как и любой другой сервис, MongoDB нужно запустить и добавить в автозагрузку :

# systemctl start mongod
# systemctl enable mongod

Чтобы проверить, что сервис mongod «слушает» нужный порт (по умолчанию TCP 27017), выполните:

# lsof -i:27017

mongod - порт 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 soft nproc 32000

Сохраните файл и перезапустите сервис mongod:

# systemctl restart mongod

Чтобы войти в консоль MongoDB , введите mongo:

[root@server mongodb]# mongo

MongoDB shell version v4.2.2_x000D_connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb_x000D_Implicit session: session { "id" : UUID("f75bee8f-d71d-47fb-8728-6f67fb7a6982") }_x000D_MongoDB server version: 4.2.2_x000D_

Основные команды MongoDB

Рассмотрим несколько команд MongoDB, которые можно использовать в шеле mongo. В частности, создадим базу данных, пользователя и покажем парочку других полезных команд.

Чтобы создать базу данных в MongoDB , нужно выполнить команду в консоли СУБД:

> use buildcentos

Заметили, что она похожа на ту, что используется в mysql/ mariadb для входа в существующую БД? В MongoDB как оказалось все проще.

Чтобы проверить, что мы действительно находимся в этой БД, выполним:

> db

mongodb создать базу данных

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

> show dbs

show dbs mongodb

Выполним простой запрос, который сохранит документ в нашей БД:

> db.new_collection.insert({ some_key: "some_value" })

db.new_collection.insert добавить документ в mongodb

Чтобы удалить БД, нужно находится в той самой БД, которую будете удалять и выполнить запрос:

> db.dropDatabase()

Например:

> use buildcentos

switched to db buildcentos

> db.dropDatabase()

{ "dropped" : "buildcentos", "ok" : 1 }_x000D__x000D_>

После чего, БД будет удалена:

> show dbs

admin 0.000GB_x000D_config 0.000GB_x000D_local 0.000GB_x000D_>

Чтобы создать нового пользователя с правами чтения и записи для вашей БД, выполните следующий запрос:

> db.createUser(

{_x000D_user: "centos",_x000D_pwd: "rewqrwe213213",_x000D_roles: [ { role: "readWrite", db: "buildcentos" } ]_x000D_}_x000D_)_x000D_

mongodb создать пользователя

Чтобы вывести список пользователей, выполните запрос:

> db.getUsers()

Или

> show users

Обе команды, выводят идентичный результат:

db.getUsers()

Чтобы удалить пользователя:

> db.dropUser('centos')

После выполнения команды, при выводе списка пользователей, у вас его не будет:

> db.dropUser('centos')

true

> db.getUsers()

Конфигурационный файл MongoDB

Как у любой СУБД, у MongoDB есть конфигурационный файл, расположенный по пути /etc/mongod.conf . Рассмотрим его основные параметры:

  • Блок systemLog — отвечает за логирование. Минимальные параметры, которые должны быть прописаны в этом блоке, чтобы логирование работало:
    systemLog:_x000D_destination: file_x000D_logAppend: true_x000D_path: /var/log/mongodb/mongod.log
  • Блок processManagement — управление процессом в котором работает MongoDB:fork — запускает демона в фоновом режиме для работы базы, по умолчанию значение false pidFilePath – путь к PID файлу timeZoneInfo – указывает путь к файлу для загрузки временных зон Пример конфига:
    processManagement:_x000D_fork: true # fork and run in background_x000D_pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile_x000D_timeZoneInfo: /usr/share/zoneinfo
  • Блок net — служит для управления работы с сетью :
    port — указывает номер порта на котором будет запущен демон mongod, по умолчанию порт 27017
    bindIp – ip адрес с которого можно обращаться к БД. Как и в случае с mysql/mariadb это настройка служит для безопасности, чтобы избежать доступа с внешних серверов. Если указать здесь 127.0.0.1, то подключение будет работать только локально.
    maxIncomingConnections – количество одновременных подключений, которые может обработать MongoDB. Данный параметр не может превышать системный, по умолчанию значение 65536
    Пример:
    net:_x000D_port: 27017_x000D_bindIp: 127.0.0.1
  • Блок security — данный блок отвечает за безопасность:authorization — если параметр включен, то требуется авторизация юзера, без логина и пароля не будет установлено соединение с процессом, который его запрашивает. По умолчанию, отключен.javascriptEnabled — включает/отключает исполнение JavaScript на стороне сервера.
  • Блок storage — блок отвечающий за параметры хранения БД:dbPath — строка которая указывает в каком месте будет хранится БД. По умолчанию /data/dbjournal – если включен, включает журнал долговечности, чтобы файлы в базе оставались действительными и восстанавливались.Пример настройки:
    storage:_x000D_dbPath: /var/lib/mongo_x000D_journal:_x000D_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_x000D_-t (cpu time): unlimited_x000D_-v (virtual memory): unlimited_x000D_-n (open files): 32000 и более_x000D_-m (memory size): unlimited_x000D_-u (processes/threads): 32000 и более
  • Так же следите за потреблением памяти на сервере, если MongoDB потребляет достаточно много памяти, проводите оптимизацию самих баз данных. Если проект очень крупный, есть смысл разнести базы на разные сервера для большей производительности.
EnglishRussianUkrainian